Title: Shells and Shell Scripts
1Shells and Shell Scripts
- COMP 444/5201
- Revision 1.3
- January 25, 2005
2Content
- Shells and Shell Scripts
- tcsh, enhanced C-Shell
- bash, Bourne-Again Shell
3Shell 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.
4Shells 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.
5Shell 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
6What 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)
7Why 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).
8Shell 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 ux myshellscript
- Then either this
- myshellscript(if the path variable has . in
it security issue!) - Or
- ./myshellscript(should always work)
9Shell Script Invocation (2)
- If you get an errormyshellscrip command not
found - The probably . is not in your path or theres
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.
10Start 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
11tchsQuick Ref
12Variables
- Variables start with a sign when they are used.
- x, val
- There's no when a variable is declared.
- set x 3
- _at_ y 1
- set input "lt"
- There are some system, predefined variables
- 0, 1, 3 .... - argument references (arguments
themselves) - - all the arguments
- lt - user's input from STDIN
- - of arguments passed to the script
13if
- if ( ltexpressiongt ) then
- ltstatementsgt
- else if ( ltanother-expressiongt ) then
- ltstatementsgt
- else
- ltstatementsgt
- endif
14foreach
- foreach var ( ltlist-of-valuesgt )
- ltstatementsgt
- end
15switch
- switch ( string )
- case str1
- ltstatementsgt
- breaksw
- ...
- default
- ltstatementsgt
- breaksw
- endsw
16while
- while ( ltexpressiongt )
- ltstatementsgt
- end
17File Inquiry Operators-op file
- r Read access
- w Write access
- x Execute access
- e Existence
- o Ownership
- z Zero size
- s Non-zero size
- f Plain file
- d Directory
- l Symbolic link
- b Block special file
- c Character special file
- p Named pipe (FIFO)
- S Socket special file
18Example
- 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.
19Bourne ShellQuick Ref
20Quick 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.
21Quick Resource Summary
- Manual Pagesman bash
- An Intro to UNIX Shelllthttp//steve-parker.org/
sh/bourne.htmlgt - How To Write a Shell Scriptlthttp//www.tinker.n
csu.edu/LEGO/shell_help.htmlgt
22Bourne Shell Script Constructs Reference
- System/Internal Variables
- Control Flow (if, for, case)
23Internal 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
24Internal Variables (2)
- Use shift command to shift the arguments one
left - Assume intput
- ./shift.sh 1 2 foo bar
- 0 ltdirectory-ofgt/shift.sh
- 1 1
- 3 2
- 4 foo
- 5 bar
- shift
- 1 2
- 2 foo
- 3 bar
25Environment
- These (and very many others) are available to
your shell - PATH - set of directories to look for commands
- HOME - home directory
- MAIL
- PWD personal working directory
- PS1 primary prompt
- PS2 input prompt
- IFS - what to treat as blanks
26Control Flow if
- General Syntax
- ltexpressiongt can either be a logical expression
or a command and usually a combo of both.
if ltexpressiongt then ltstatementsgt elif
ltstatementsgt else ltstatementsgt fi
27if (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
28case
case ltexpressiongt in ltpatter1gtltvalue1gt)
command1 ltpatter2gtltvalue2gt)
command2 esac
29case (2)
- case in
- 1) cat gtgt 1
-
- 2) cat gtgt2 lt1
-
- 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
30for
- Syntax
- List can also be a result of a command.
for variable in ltlist of values/wordsgt do
command1 command2 done
31for (3)
- for file in .txt
- do
- echo File file
- echo ""
- cat file
- echo ""
- done
32while
while ltexpressiongt do command1 command2
done
33until
until ltexpressiongt do command1 command2
done
34To Be Continued...