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

July 17, 2003Serguei A. Mokhov, [email protected] 1 Shells and Shell Scripts COMP 444/5201 Revision 1.3 January 25, 2005

Embed Size (px)

Citation preview

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

July 17, 2003 Serguei A. Mokhov, [email protected]

1

Shells and Shell Scripts

COMP 444/5201

Revision 1.3

January 25, 2005

Page 2: July 17, 2003Serguei A. Mokhov, mokhov@cs.concordia.ca 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

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

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.

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

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.

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

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

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

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)

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

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).

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

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)

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

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.

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

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

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

July 17, 2003 Serguei A. Mokhov, [email protected]

11

tchsQuick Ref

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

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

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

July 17, 2003 Serguei A. Mokhov, [email protected]

13

if

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

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

July 17, 2003 Serguei A. Mokhov, [email protected]

14

foreach

foreach var ( <list-of-values> )<statements>

end

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

July 17, 2003 Serguei A. Mokhov, [email protected]

15

switch

switch ( string )case str1:

<statements> breaksw

...default:

<statements>breaksw

endsw

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

July 17, 2003 Serguei A. Mokhov, [email protected]

16

while

while ( <expression> )<statements>

end

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

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

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

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.

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

July 17, 2003 Serguei A. Mokhov, [email protected]

19

Bourne ShellQuick Ref

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

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.

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

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>

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

July 17, 2003 Serguei A. Mokhov, [email protected]

22

Bourne Shell Script Constructs Reference

• System/Internal Variables

• Control Flow (if, for, case)

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

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

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

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

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

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

– $MAIL

– $PWD – personal working directory

– $PS1 – primary prompt

– $PS2 – input prompt

– $IFS - what to treat as blanks

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

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

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

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

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

July 17, 2003 Serguei A. Mokhov, [email protected]

28

case

• Syntax:

case <expression> in <patter1>|<value1>) command1 ;;

<patter2>|<value2>) command2 ;;esac

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

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

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

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

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

July 17, 2003 Serguei A. Mokhov, [email protected]

31

for (3)

for file in *.txt

do

echo File $file:

echo "======"

cat $file

echo "======"

done

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

July 17, 2003 Serguei A. Mokhov, [email protected]

32

while

• Syntax

while <expression>do command1 command2 …done

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

July 17, 2003 Serguei A. Mokhov, [email protected]

33

until

• Syntax

until <expression>do command1 command2 …done

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

July 17, 2003 Serguei A. Mokhov, [email protected]

34

To Be Continued...