Anda di halaman 1dari 22

More Shell Programming

Learning Objectives:
1.

2.

3.

To learn the usage of environment (shell) variables in shell programming To understand the handling of command line arguments To illustrate more useful commands in shell programming using examples

COMP111 Lecture 8 / Slide 2

More Shell Programming


Table of Content
Keyword Shell Variables Keyword Example Read-only Shell Variable Command Line Argument Command for handling arguments - shift Command for handling arguments - set Special Variable - $$ Looping using for Looping using for More Examples Return Status Example << Examples

COMP111 Lecture 8 / Slide 3

Keyword Shell Variables


The shell sets keyword shell variables. You can use (and change) them.
HOME The path to your home directory PATH Directories where the shell looks for executables USER Your login name SHELL The name of the shell you are running PWD The current working directory PRINTER Can be loaded with your default printer

COMP111 Lecture 8 / Slide 4

Keyword Example
$ cat env #!/bin/sh echo "Hi $USER!" echo "Your home is: $HOME" echo "Your path is: $PATH" echo "Your current directory is: $PWD" echo "Your shell is: $SHELL" echo "Your printer is: $PRINTER" $ env Hi horner! Your home is: /homes/horner Your path is:/usr/bin:.:.:/homes/horner/Unix/bin:... Your current directory is: /homes/horner/111 Your shell is: /bin/csh Your printer is: csl3

COMP111 Lecture 8 / Slide 5

Readonly Shell Variables


$0 is the name the user typed to invoke the shell script:
$ cat print1 #!/bin/sh echo "This script is called $0" $ print1 This script is called print1 $ ./print1 This script is called ./print1 $ ~/111/print1 This script is called /homes/horner/111/print1

COMP111 Lecture 8 / Slide 6

Command Line Arguments (1)


The command line arguments that you call a script with are stored in variables $1, $2, ..., $9.
$ cat args1 #!/bin/sh echo "The args are $1 $2 $3 $4 $5 $6 $7 $8 $9" $ args1 a1 a2 a3 a4 a5 a6 a7 a8 a9 a10 The args are a1 a2 a3 a4 a5 a6 a7 a8 a9

With more than 9 arguments, they are still stored, but they have to be moved using the shift command before they can be accessed.

COMP111 Lecture 8 / Slide 7

Command Line Arguments (2)


Example: How to write a command to swap two files?
$ cat swap #!/bin/sh mv $1 /tmp/$1 mv $2 $1 mv /tmp/$1 $2 $ cat it1 contents of file1 $ cat it2 contents of file2 $ swap it1 it2 $ cat it1 contents of file2 $ cat it2 contents of file1
$

COMP111 Lecture 8 / Slide 8

Command Line Arguments (3)


$* lists all the command line args:
$ cat args2 #!/bin/sh echo "The args are $*" $ args2 a1 a2 a3 a4 a5 a6 a7 a8 a9 a10 The args are a1 a2 a3 a4 a5 a6 a7 a8 a9 a10

$# contains the number of args:


$ cat args3 #!/bin/sh echo "The number of args is $#" $ args3 a1 a2 a3 a4 a5 a6 a7 a8 a9 a10 The number of args is 10

COMP111 Lecture 8 / Slide 9

Command Handling Argument - shift (1)


The shift command promotes each command line argument by one (e.g., the value in $2 moves to $1, $3 moves to $2, etc.)
$ cat shiftargs
#!/bin/sh echo "The args are 0 = $0, 1 = $1, 2 = $2" shift echo "The args are 0 = $0, 1 = $1, 2 = $2" shift echo "The args are 0 = $0, 1 = $1, 2 = $2" shift

The previous $1 becomes inaccessible

$ shiftargs arg1 The args are 0 = The args are 0 = The args are 0 =

arg2 arg3 shiftarg, 1 = arg1, 2 = arg2 shiftarg, 1 = arg2, 2 = arg3 shiftarg, 1 = arg3, 2 =

COMP111 Lecture 8 / Slide 10

Command Handling Argument - shift (2)


Example: How to write a general version of the swap command for two or more files?
swap f1 f2 f3 ... fn_1 fn

f1 f2 f3 ... fn_1 fn

<--- f2 <--- f3 <--- f4


<--- fn <--- f1

COMP111 Lecture 8 / Slide 11

shift Example (1)


$ cat swap #!/bin/sh orig1=$1 mv $1 /tmp/$1 while [ $2 ] do mv $2 $1 shift done mv /tmp/$orig1 $1 $ cat it1 it2 it3 contents of file1 contents of file2 contents of file3 $ swap it1 it2 it3 $ cat it1 it2 it3 contents of file2 contents of file3 contents of file1

1st Sample Run

COMP111 Lecture 8 / Slide 12

shift Example (2)


$ swap it1 it2 it3 $ cat it1 it2 it3 contents of file3 contents of file1 contents of file2 $ swap it1 it2 it3 $ cat it1 it2 it3 contents of file1 contents of file2 contents of file3 $ swap it1 it2 $ cat it1 it2 contents of file2 contents of file1 2nd Sample Run

3rd Sample Run

4th Sample run

COMP111 Lecture 8 / Slide 13

Command Handling Argument - set


The set command sets the args:
$ cat set1 #!/bin/sh set yat yih saam echo "One is $1, two is $2, three is $3" $ set1 One is yat, two is yih, three is saam

The set command is useful for moving the output of command substitution into the args:
$ date Thu Feb 25 17:06:27 HKT 1999 $ cat day #!/bin/sh set `date` echo "Today is $3 $2 $6" $ day Today is 25 Feb 1999

COMP111 Lecture 8 / Slide 14

Special variable - $$ (1)


$$ is the process ID (PID) of the current process (the shell script PID, or the shell PID if interactive).
$ cat pid #!/bin/sh echo $$ $ pid 1154 $ pid 1156 $ pid 1157 $ echo $$ 892 $ ps PID TTY 892 pts/0

TIME CMD 0:01 csh

COMP111 Lecture 8 / Slide 15

Special variable - $$ (2)


It can be used for temporary file names:
$ cat swap #!/bin/sh file=/tmp/tmp$$ mv $1 $file mv $2 $1 mv $file $1 $ cat it1 it2 contents of file1 contents of file2 $ swap it1 it2 $ cat it1 contents of file2 contents of file1
$

COMP111 Lecture 8 / Slide 16

Looping using for Example 1


The for statement executes a loop once for each of a list of possibilities:
$ cat printall #!/bin/sh for file in * do if [ -f $file ] then echo "Print $file [y/n]? " read resp if [ $resp = "y" ] then lpr -Pcll3 $file fi fi done $ printall Print letter1 [y/n]? y Print names [y/n]? n

COMP111 Lecture 8 / Slide 17

Looping using for Example 2


If the in ___ part is omitted, it defaults to $*:
$ cat p #!/bin/sh for file do if [ -f $file ] then lpr -Pcll3 $file fi done $ p letter1 names $

COMP111 Lecture 8 / Slide 18

Looping using for - Example 3


The in clause of the for statement accepts as many parameters as you wish in many forms:
$ for i in 1 2 3 ; do echo $i ; done 1 2 3 $ for pid in `ps > do > kill -9 $pid > done kill: permission kill: permission kill: permission -a | tail +2 | cut -c1-6 | sort`

denied denied denied

(you will then be logout!)

COMP111 Lecture 8 / Slide 19

Looping using for Example 4


We can make use of the find command to generate a list of files in a sub-directory tree for processing:
#!/bin/sh if [ $# = 0 ] then echo "usage: treeproc <pattern> [<command>]"; exit fi pattern="$1"; shift if [ $1 ] ; then cmd=$*; else cmd=echo; fi echo "Running \"$cmd\" for $pattern in dir: `pwd`" for file in `find . -name "$pattern" -print` do $cmd $file done $ find . -name letter* -print

./secret/letter1 ./secret/letter2

COMP111 Lecture 8 / Slide 20

Looping using for Example 4 testing


$ ls -R.: names letter0 ./secret: letter1 letter2 secret/

$ treeproc usage: treeproc <pattern> [<command>] $ treeproc "*1" Running "echo" for *1 in dir: /home/kwchiu ./secret/letter1 $ treeproc "letter*" rm -i Running "rm -i" for letter* in dir: /home/kwchiu rm: remove ./letter0 (yes/no)? rm: remove ./secrete/letter1 (yes/no)? rm: remove ./secrete/letter2 (yes/no)? $ find . -name "letter*" -exec rm -i {} \; (same as the above) {} substitutes each filename

\ denotes end of the exec command

COMP111 Lecture 8 / Slide 21

Return Status $?
In UNIX, after a command (or your own program) finishes execution, it returns an exit code to its parent. The shell can retrieve this code with $?.
$ ls /dev/null is a special device dumps everything input to it name $ cat testif if cat $1 >/dev/null 2>&1 The construct >file 2>&1 is useful then for logging. Both the stdout and echo "OK" stderr are sent to the same file. else echo "Problem: Code" $? fi $ testif name OK $? returns the previous $ testif abc exit code Problem: Code 2

COMP111 Lecture 8 / Slide 22

Here documents <<


Documents can be embedded in a shell script with << with shell variable processing (e.g., mail merge).
w | tail +3 | ( while read user tty login idle other do cmd=`echo $other | tr -s '[0-9]' ' '` if [ `echo $idle | grep -c day` -ge 1 ] then You may use any words mail $user << EOF EOF is just an example Dear $user, May I remind you that your session has been idle for $idle. The running program was: $cmd Regards, 1:20pm up 41 day(s), 3:36, 5 users, load average: 0. SysAdmin. User tty login@ idle JCPU PCPU what EOF wfung pts/2 Thu10pm 10:58 15 14 telnet fi wfung pts/4 Sat12am 11:23 1 telnet done )
dominic pts/3 Fri10am 2days -bash

Anda mungkin juga menyukai