350 likes | 408 Views
Shells and Shell Scripts. 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.
E N D
Shells and Shell Scripts COMP 444/5201 Revision 1.3 January 25, 2005 Serguei A. Mokhov, mokhov@cs.concordia.ca
Content • Shells and Shell Scripts • tcsh, enhanced C-Shell • bash, Bourne-Again Shell Serguei A. Mokhov, mokhov@cs.concordia.ca
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. Serguei A. Mokhov, mokhov@cs.concordia.ca
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. Serguei A. Mokhov, mokhov@cs.concordia.ca
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 Serguei A. Mokhov, mokhov@cs.concordia.ca
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) Serguei A. Mokhov, mokhov@cs.concordia.ca
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). Serguei A. Mokhov, mokhov@cs.concordia.ca
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) Serguei A. Mokhov, mokhov@cs.concordia.ca
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. Serguei A. Mokhov, mokhov@cs.concordia.ca
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 Serguei A. Mokhov, mokhov@cs.concordia.ca
tchsQuick Ref Serguei A. Mokhov, mokhov@cs.concordia.ca
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 Serguei A. Mokhov, mokhov@cs.concordia.ca
if if( <expression> ) then <statements> else if ( <another-expression> ) then <statements> else <statements> endif Serguei A. Mokhov, mokhov@cs.concordia.ca
foreach foreach var ( <list-of-values> ) <statements> end Serguei A. Mokhov, mokhov@cs.concordia.ca
switch switch ( string ) case str1: <statements> breaksw ... default: <statements> breaksw endsw Serguei A. Mokhov, mokhov@cs.concordia.ca
while while ( <expression> ) <statements> end Serguei A. Mokhov, mokhov@cs.concordia.ca
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 File Inquiry Operators:-op file Serguei A. Mokhov, mokhov@cs.concordia.ca
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. Serguei A. Mokhov, mokhov@cs.concordia.ca
Bourne ShellQuick Ref Serguei A. Mokhov, mokhov@cs.concordia.ca
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. Serguei A. Mokhov, mokhov@cs.concordia.ca
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> Serguei A. Mokhov, mokhov@cs.concordia.ca
Bourne Shell Script Constructs Reference • System/Internal Variables • Control Flow (if, for, case) Serguei A. Mokhov, mokhov@cs.concordia.ca
Internal Variables Serguei A. Mokhov, mokhov@cs.concordia.ca
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 Serguei A. Mokhov, mokhov@cs.concordia.ca
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 Serguei A. Mokhov, mokhov@cs.concordia.ca
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 Serguei A. Mokhov, mokhov@cs.concordia.ca
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 Serguei A. Mokhov, mokhov@cs.concordia.ca
case • Syntax: case <expression> in <patter1>|<value1>) command1 ;; <patter2>|<value2>) command2 ;; esac Serguei A. Mokhov, mokhov@cs.concordia.ca
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 Serguei A. Mokhov, mokhov@cs.concordia.ca
for • Syntax: • List can also be a result of a command. for variable in <list of values/words>[;] do command1 command2 … done Serguei A. Mokhov, mokhov@cs.concordia.ca
for (3) for file in *.txt do echo File $file: echo "======" cat $file echo "======" done Serguei A. Mokhov, mokhov@cs.concordia.ca
while • Syntax while <expression> do command1 command2 … done Serguei A. Mokhov, mokhov@cs.concordia.ca
until • Syntax until <expression> do command1 command2 … done Serguei A. Mokhov, mokhov@cs.concordia.ca
To Be Continued... Serguei A. Mokhov, mokhov@cs.concordia.ca