1 / 28

More Shell Programming

More Shell Programming. Control Flow. The shell allows several control flow statements: if while for. if. The if statement works mostly as expected: $ whoami clinton $ cat test7 #!/bin/sh user=`whoami` if [ $user = "clinton" ] then echo "Hi Bill!" fi

yard
Download Presentation

More Shell Programming

An Image/Link below is provided (as is) to download presentation Download Policy: Content on the Website is provided to you AS IS for your information and personal use and may not be sold / licensed / shared on other websites without getting consent from its author. Content is provided to you AS IS for your information and personal use only. Download presentation by click this link. While downloading, if for some reason you are not able to download a presentation, the publisher may have deleted the file from their server. During download, if you can't get a presentation, the file might be deleted by the publisher.

E N D

Presentation Transcript


  1. More Shell Programming

  2. Control Flow • The shell allows several control flow statements: • if • while • for

  3. if • The if statement works mostly as expected: $ whoami clinton $ cat test7 #!/bin/sh user=`whoami` if [ $user = "clinton" ] then echo "Hi Bill!" fi $ test7 Hi Bill! • However, the spaces before and after the square brackets [ ] are required.

  4. if … then … else • The if then else statement is similar: $ cat test7 #!/bin/sh user=`whoami` if [ $user = "clinton" ] then echo "Hi Bill!" else echo "Hi $user!" fi $ test7 Hi horner!

  5. if … elif … else • You can also handle a list of cases: $ cat test8 #!/bin/sh users=`who | wc -l` if [ $users -ge 4 ] then echo "Heavy load" elif [ $users -gt 1 ] then echo "Medium load" else echo "Just me!" fi $ test8 Heavy load!

  6. Boolean Expressions • Relational operators: -eq, -ne, -gt, -ge, -lt, -le • File operators: -f file True if file exists and is not a directory -d file True if file exists and is a directory -s file True if file exists and has a size > 0 • String operators: -z string True if the length of string is zero -n string True if the length of string is nonzero s1 = s2 True if s1 and s2 are the same s1 != s2 True if s1 and s2 are different s1 True if s1 is not the null string

  7. File Operator Example $ cat test9 #!/bin/sh if [ -f letter1 ] then echo "We have found the evidence!" cat letter1 else echo "Keep looking!" fi $ test9 We have found the evidence! Ms. Lewinski: It is getting late. Please order some pizza and stop by my office. We'll tidy up a few more things before calling it a night. Thanks! Bill

  8. while (1) • The while statement loops indefinitely, while the condition is true, such as a user-controlled condition: $ cat test11 #!/bin/sh resp="no" while [ $resp != "yes" ] do echo "Wakeup [yes/no]?" read resp done $ test11 Wakeup [yes/no]? no Wakeup [yes/no]? y Wakeup [yes/no]? yes $

  9. while (2) • while can also do normal incrementing loops: $ cat fac #!/bin/sh echo "Enter number: " read n fac=1 i=1 while [ $i -le $n ] do fac=`expr $fac \* $i` i=`expr $i + 1` done echo "The factorial of $n is $fac" $ fac Enter number: 5 The factorial of 5 is 120

  10. break • The break command works like in C++, breaking out of the innermost loop : $ cat test12 #!/bin/sh while [ 1 ] do echo "Wakeup [yes/no]?" read resp if [ $resp = "yes" ] then break; fi done $ test12 Wakeup [yes/no]? no Wakeup [yes/no]? y Wakeup [yrs/no]? yes $

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

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

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

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

  15. 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 $

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

  17. 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 $ shiftargs arg1 arg2 arg3 The args are 0 = shiftarg, 1 = arg1, 2 = arg2 The args are 0 = shiftarg, 1 = arg2, 2 = arg3 The args are 0 = shiftarg, 1 = arg3, 2 = • The previous $1 becomes inaccessible

  18. 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 f2 <--- f3 f3 <--- f4 ... fn_1 <--- fn fn <--- f1

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

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

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

  22. 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 TIME CMD 892 pts/0 0:01 csh

  23. 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 $

  24. for • 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 –Pcll2a $file fi fi done $ printall Print it1 [y/n]? y Print it2 [y/n]? n

  25. Looping using for • 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 -a | tail +2 | cut -c1-6 | sort` > do > kill -9 $pid > done kill: permission denied kill: permission denied kill: permission denied (you will then be logout!)

  26. For example (2) for index in 1 2 3 4 5 6 7 8 9 10 do if [ $index –le 3 ]; then echo continue continue fi echo $index if [ $index –ge 8 ]; then echo “break” break fi done

  27. Catch a signal: builtin trap • Built-in trap • Syntax: trap ‘commands’ signal-numbers • Shell executes the commands when it catches one of the signals • Then resumes executing the script where it left off. • Just capture the signal, not doing anything with it trap ‘ ‘ signal_number • Often used to clean up temp files • Signals • SIGHUP 1 disconnect line • SIGINT 2 control-c • SIGKILL 9 kill with -9 • SIGTERM 15 default kill • SIGSTP 24 control-z • …

  28. Example [ruihong@dafinn ~/cs3451]$ cat inter #!/bin/sh trap 'echo PROGRAM INTERRUPTED' 2 while true do echo "programming running." sleep 1 done

More Related