COMP 444/5201 Revision 1.3 January 25, 2005
Content Shells and Shell Scripts tcsh, enhanced C-Shell bash, Bourne-Again Shell
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.
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.
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
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)
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).
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)
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.
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.
tchs Quick Ref
Variables Variables start with a $ sign when they are used. 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
if if ( ) then else if ( ) then else endif
foreach
switch switch ( string ) case str1: breaksw ... default: breaksw endsw
while
File Inquiry Operators: -op file w Write access x Execute access e Existence o Ownership z Zero size
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.
Bourne Shell Quick Ref
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.
Quick Resource Summary Manual Pages: man bash An Intro to UNIX Shell: How To Write a Shell Script:
System/Internal Variables Control Flow (if, for, case)
Internal Variables
Internal Variables (2) Use shift command to shift the arguments one left: - Assume intput:
- ./shift.sh 1 2 foo bar
- $0 = /shift.sh
- $1 = 1
- $3 = 2
- $4 = foo
- $5 = bar
- shift:
Environment 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
Control Flow: if General Syntax: can either be a logical expression or a command and usually a combo of both.
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
case
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
for Syntax: List can also be a result of a command.
for (3) for file in *.txt do echo File $file: echo "======" cat $file echo "======" done
while
until
To Be Continued...
Dostları ilə paylaş: |