Upload
meredith-sharlene-williamson
View
217
Download
0
Embed Size (px)
Citation preview
July 17, 2003 Serguei A. Mokhov, [email protected]
1
Shells and Shell Scripts
COMP 444/5201
Revision 1.3
January 25, 2005
July 17, 2003 Serguei A. Mokhov, [email protected]
2
Content
• Shells and Shell Scripts• tcsh, enhanced C-Shell• bash, Bourne-Again Shell
July 17, 2003 Serguei A. Mokhov, [email protected]
3
Shell Commands
• Shell commands are interpreted directly by the shell you specify.
• The commands are similar to the statement in some programming languages, such as C.
• Popular shells include:– Enhanced C-shell tchs (csh+)– Bourne-Again Shell, bash (sh+)– Korn Shell (ksh)
• These notes will focus on the first two shells.
July 17, 2003 Serguei A. Mokhov, [email protected]
4
Shells’ Features• The bash an tcsh shells are similar in the
features the offer. In particular:– Pass arguments to your script– Set and reference variables– Use of control flow– Interact with the user (read user input)– Comments…
• Info on commands a given shell offers can be found in the man pages for that shell.
• There are many Linux/UNIX references that give detailed information and tips.
July 17, 2003 Serguei A. Mokhov, [email protected]
5
Shell Scripts
• What are they for?– To automate certain common activities an user
performs routinely.– They serve the same purpose as batch files in
DOS/Windows.– Example:
• rename 1000 files from upper case to lowercase
July 17, 2003 Serguei A. Mokhov, [email protected]
6
What are Shell Scripts
• Just text/ASCII files with:– a set of standard UNIX/Linux commands (ls, mv, cp, less, cat, etc.) along with
• flow of control– some conditional logic and branching (if-then),– loop structures (foreach, for, while), and
• I/O facilities (echo, print, set, ...).
– They allow use of variables.– They are interpreted by a shell directly.– Some of them (csh, tcsh) share some of C syntax.– DOS/Win equivalent - batch files (.bat)
July 17, 2003 Serguei A. Mokhov, [email protected]
7
Why not use C/C++ for that?
• C/C++ programming requires compilation and linkage, maybe libraries, which may not be available (production servers).
• For the typical tasks much faster in development, debugging, and maintenance (because they are interpreted and do not require compilation).
July 17, 2003 Serguei A. Mokhov, [email protected]
8
Shell Script Invocation• Specify the shell directly:
– % tcsh myshellscript– % tcsh -v myshellscript
(-v = verbose, useful for debugging)
• Make the shell an executable first and then run is a command (set up an execution permission):– % chmod u+x myshellscript
• Then either this:– % myshellscript
(if the path variable has ‘.’ in it; security issue!)
• Or:– % ./myshellscript
(should always work)
July 17, 2003 Serguei A. Mokhov, [email protected]
9
Shell Script Invocation (2)• If you get an error:
“myshellscrip: command not found”– The probably “.” is not in your path or there’s no
execution bit set.
• When writing scripts, choose unique names, that preferably do not match system commands.– Bad name would be test for example, since there are
many shells with this internal command.
• To disambiguate, always precede the shell with “./” or absolute path in case you have to name your thing not very creatively.
July 17, 2003 Serguei A. Mokhov, [email protected]
10
Start Writing a Shell Script• The very first line, often called 'shebang' (#!) should
precede any other line, to assure that the right shell is invoked.
• Comments start with '#', with the exception of #!, $#, which are a special character sequences.
• Everything on a line after # is ignored if # is not a part of a quoted string or a special character sequence.
#!/bin/tcsh #!/bin/bash# This is for tcsh # For Bourne-Again Shell
#!/bin/sh# This is for Bourne Shell
July 17, 2003 Serguei A. Mokhov, [email protected]
12
Variables
• Variables start with a $ sign when they are used.– $x, $val
• There's no $ when a variable is declared.– set x = 3– @ y = 1– set input = "$<"
• There are some system, predefined variables:– $0, $1, $3 .... - argument references (arguments themselves) – $* - all the arguments– $< - user's input from STDIN– $# - # of arguments passed to the script
July 17, 2003 Serguei A. Mokhov, [email protected]
13
if
if ( <expression> ) then <statements>else if ( <another-expression> ) then <statements>else <statements>endif
July 17, 2003 Serguei A. Mokhov, [email protected]
14
foreach
foreach var ( <list-of-values> )<statements>
end
July 17, 2003 Serguei A. Mokhov, [email protected]
15
switch
switch ( string )case str1:
<statements> breaksw
...default:
<statements>breaksw
endsw
July 17, 2003 Serguei A. Mokhov, [email protected]
17
File Inquiry Operators:-op file
r Read accessw Write accessx Execute accesse Existenceo Ownershipz Zero sizes Non-zero size
f Plain filed Directoryl Symbolic linkb Block special filec Character special filep Named pipe (FIFO)S Socket special file
July 17, 2003 Serguei A. Mokhov, [email protected]
18
Example
• See creator and uptolow.
• NOTE: run them in a some temporary directory to do not mess with your own valuable files.
• The uptolow script:– will convert any uppercase letters in an ordinary file name to lowercase.
– will leave directories untouched.
July 17, 2003 Serguei A. Mokhov, [email protected]
20
Quick Note
• In no way this going to be a duplication for the zillions of resources on Bourne Shell, but more a quick reference/syntax for most often used constructs and pointers to resources where else to find that kind of stuff. Some of it is a lame reap off the man page and so on.
July 17, 2003 Serguei A. Mokhov, [email protected]
21
Quick Resource Summary
• Manual Pages:man bash
• An Intro to UNIX Shell:
<http://steve-parker.org/sh/bourne.html>
• How To Write a Shell Script:
<http://www.tinker.ncsu.edu/LEGO/shell_help.html>
July 17, 2003 Serguei A. Mokhov, [email protected]
22
Bourne Shell Script Constructs Reference
• System/Internal Variables
• Control Flow (if, for, case)
July 17, 2003 Serguei A. Mokhov, [email protected]
23
Internal Variables$# Will tell you # of command line arguments supplied
$0 Ourselves (i.e. name of the shell script executed with path)
$1 First argument to the script
$2 Second argument, and so on…
$? Exit status of the last command
$$ Our PID
$! PID of the last background process
$- Current shell status
July 17, 2003 Serguei A. Mokhov, [email protected]
24
Internal Variables (2)
• Use shift command to shift the arguments one left:– Assume intput:
• ./shift.sh 1 2 foo bar– $0 = <directory-of>/shift.sh– $1 = 1– $3 = 2– $4 = foo– $5 = bar
• shift:– $1 = 2– $2 = foo– $3 = bar
July 17, 2003 Serguei A. Mokhov, [email protected]
25
Environment
• These (and very many others) are available to your shell:– $PATH - set of directories to look for commands
– $HOME - home directory
– $PWD – personal working directory
– $PS1 – primary prompt
– $PS2 – input prompt
– $IFS - what to treat as blanks
July 17, 2003 Serguei A. Mokhov, [email protected]
26
Control Flow: if
• General Syntax:
• <expression> can either be a logical expression or a command and usually a combo of both.
if [ <expression> ]; then <statements>elif <statements>else <statements>fi
July 17, 2003 Serguei A. Mokhov, [email protected]
27
if (2)
• Some Logical “Operators”:-eq --- Equal-ne --- Not equal-lt --- Less Than-gt --- Greater Than-o --- OR-a --- AND
• File or directory?-f --- file-d --- directory
July 17, 2003 Serguei A. Mokhov, [email protected]
28
case
• Syntax:
case <expression> in <patter1>|<value1>) command1 ;;
<patter2>|<value2>) command2 ;;esac
July 17, 2003 Serguei A. Mokhov, [email protected]
29
case (2)
case $# in 1) cat >> $1 ;; 2) cat >>$2 <$1 ;; 3) case $3 in -[abc]) echo "-a -b or -c" ;; -foo|-bar) echo "-foo or -bar" ;; esac ;; *) echo "we accept up to 3 args only."; exit 127 ;;esac
July 17, 2003 Serguei A. Mokhov, [email protected]
30
for
• Syntax:
• List can also be a result of a command.
for variable in <list of values/words>[;]do command1 command2 …done
July 17, 2003 Serguei A. Mokhov, [email protected]
31
for (3)
for file in *.txt
do
echo File $file:
echo "======"
cat $file
echo "======"
done
July 17, 2003 Serguei A. Mokhov, [email protected]
32
while
• Syntax
while <expression>do command1 command2 …done
July 17, 2003 Serguei A. Mokhov, [email protected]
33
until
• Syntax
until <expression>do command1 command2 …done