Shells and Shell Scripts COMP 4445201 Revision 1

  • Slides: 34
Download presentation
Shells and Shell Scripts COMP 444/5201 Revision 1. 3 January 25, 2005 July 17,

Shells and Shell Scripts COMP 444/5201 Revision 1. 3 January 25, 2005 July 17, 2003 Serguei A. Mokhov, mokhov@cs. concordia. ca 1

Content • Shells and Shell Scripts • tcsh, enhanced C-Shell • bash, Bourne-Again Shell

Content • Shells and Shell Scripts • tcsh, enhanced C-Shell • bash, Bourne-Again Shell July 17, 2003 Serguei A. Mokhov, mokhov@cs. concordia. ca 2

Shell Commands • Shell commands are interpreted directly by the shell you specify. •

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, mokhov@cs. concordia. ca 3

Shells’ Features • The bash an tcsh shells are similar in the features the

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, mokhov@cs. concordia. ca 4

Shell Scripts • What are they for? – To automate certain common activities an

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, mokhov@cs. concordia. ca 5

What are Shell Scripts • Just text/ASCII files with: – a set of standard

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, mokhov@cs. concordia. ca 6

Why not use C/C++ for that? • C/C++ programming requires compilation and linkage, maybe

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, mokhov@cs. concordia. ca 7

Shell Script Invocation • Specify the shell directly: – % tcsh myshellscript – %

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, mokhov@cs. concordia. ca 8

Shell Script Invocation (2) • If you get an error: “myshellscrip: command not found”

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, mokhov@cs. concordia. ca 9

Start Writing a Shell Script • The very first line, often called 'shebang' (#!)

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. #!/bin/tcsh # This is for tcsh #!/bin/bash # For Bourne-Again Shell #!/bin/sh # This is for Bourne Shell • 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. July 17, 2003 Serguei A. Mokhov, mokhov@cs. concordia. ca 10

tchs Quick Ref July 17, 2003 Serguei A. Mokhov, mokhov@cs. concordia. ca 11

tchs Quick Ref July 17, 2003 Serguei A. Mokhov, mokhov@cs. concordia. ca 11

Variables • Variables start with a $ sign when they are used. – $x,

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, mokhov@cs. concordia. ca 12

if if ( <expression> ) then <statements> else if ( <another-expression> ) then <statements>

if if ( <expression> ) then <statements> else if ( <another-expression> ) then <statements> else <statements> endif July 17, 2003 Serguei A. Mokhov, mokhov@cs. concordia. ca 13

foreach var ( <list-of-values> ) <statements> end July 17, 2003 Serguei A. Mokhov, mokhov@cs.

foreach var ( <list-of-values> ) <statements> end July 17, 2003 Serguei A. Mokhov, mokhov@cs. concordia. ca 14

switch ( string ) case str 1: <statements> breaksw. . . default: <statements> breaksw

switch ( string ) case str 1: <statements> breaksw. . . default: <statements> breaksw endsw July 17, 2003 Serguei A. Mokhov, mokhov@cs. concordia. ca 15

while ( <expression> ) <statements> end July 17, 2003 Serguei A. Mokhov, mokhov@cs. concordia.

while ( <expression> ) <statements> end July 17, 2003 Serguei A. Mokhov, mokhov@cs. concordia. ca 16

File Inquiry Operators: -op file r w x e o z s Read access

File Inquiry Operators: -op file r w x e o z s Read access Write access Execute access Existence Ownership Zero size Non-zero size July 17, 2003 f d l b c p S Plain file Directory Symbolic link Block special file Character special file Named pipe (FIFO) Socket special file Serguei A. Mokhov, mokhov@cs. concordia. ca 17

Example • See creator and uptolow. • NOTE: run them in a some temporary

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, mokhov@cs. concordia. ca 18

Bourne Shell Quick Ref July 17, 2003 Serguei A. Mokhov, mokhov@cs. concordia. ca 19

Bourne Shell Quick Ref July 17, 2003 Serguei A. Mokhov, mokhov@cs. concordia. ca 19

Quick Note • In no way this going to be a duplication for the

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, mokhov@cs. concordia. ca 20

Quick Resource Summary • Manual Pages: man bash • An Intro to UNIX Shell:

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, mokhov@cs. concordia. ca 21

Bourne Shell Script Constructs Reference • System/Internal Variables • Control Flow (if, for, case)

Bourne Shell Script Constructs Reference • System/Internal Variables • Control Flow (if, for, case) July 17, 2003 Serguei A. Mokhov, mokhov@cs. concordia. ca 22

Internal Variables $# Will tell you # of command line arguments supplied $0 Ourselves

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 of the last background process Current shell status July 17, 2003 Serguei A. Mokhov, mokhov@cs. concordia. ca 23

Internal Variables (2) • Use shift command to shift the arguments one left: –

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, mokhov@cs. concordia. ca 24

Environment • These (and very many others) are available to your shell: – –

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 $PS 1 – primary prompt $PS 2 – input prompt $IFS - what to treat as blanks July 17, 2003 Serguei A. Mokhov, mokhov@cs. concordia. ca 25

Control Flow: if • General Syntax: if [ <expression> ]; then <statements> elif <statements>

Control Flow: if • General Syntax: if [ <expression> ]; then <statements> elif <statements> else <statements> fi • <expression> can either be a logical expression or a command usually a combo of both. July 17, 2003 Serguei A. Mokhov, mokhov@cs. concordia. ca 26

if (2) • Some Logical “Operators”: -eq -ne -lt -gt -o -a --- Equal

if (2) • Some Logical “Operators”: -eq -ne -lt -gt -o -a --- Equal --- Not equal --- Less Than --- Greater Than --- OR --- AND • File or directory? -f -d July 17, 2003 --- file --- directory Serguei A. Mokhov, mokhov@cs. concordia. ca 27

case • Syntax: case <expression> in <patter 1>|<value 1>) command 1 ; ; <patter

case • Syntax: case <expression> in <patter 1>|<value 1>) command 1 ; ; <patter 2>|<value 2>) command 2 ; ; esac July 17, 2003 Serguei A. Mokhov, mokhov@cs. concordia. ca 28

case (2) case $# in 1) cat >> $1 ; ; 2) cat >>$2

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, mokhov@cs. concordia. ca 29

for • Syntax: for variable in <list of values/words>[; ] do command 1 command

for • Syntax: for variable in <list of values/words>[; ] do command 1 command 2 … done • List can also be a result of a command. July 17, 2003 Serguei A. Mokhov, mokhov@cs. concordia. ca 30

for (3) for file in *. txt do echo File $file: echo "======" cat

for (3) for file in *. txt do echo File $file: echo "======" cat $file echo "======" done July 17, 2003 Serguei A. Mokhov, mokhov@cs. concordia. ca 31

while • Syntax while <expression> do command 1 command 2 … done July 17,

while • Syntax while <expression> do command 1 command 2 … done July 17, 2003 Serguei A. Mokhov, mokhov@cs. concordia. ca 32

until • Syntax until <expression> do command 1 command 2 … done July 17,

until • Syntax until <expression> do command 1 command 2 … done July 17, 2003 Serguei A. Mokhov, mokhov@cs. concordia. ca 33

To Be Continued. . . July 17, 2003 Serguei A. Mokhov, mokhov@cs. concordia. ca

To Be Continued. . . July 17, 2003 Serguei A. Mokhov, mokhov@cs. concordia. ca 34