620 likes | 854 Views
CSCI 330 The UNIX System. C Shell Programming. Steps to Create Shell Programs. Specify shell to execute program Script must begin with #! (pronounced “shebang”) to identify shell to be executed Examples: #! /bin/sh (defaults to bash) #! /bin/bash #! /bin/csh #! /usr/bin/tcsh
E N D
CSCI 330The UNIX System C Shell Programming
Steps to Create Shell Programs • Specify shell to execute program • Script must begin with #! (pronounced “shebang”)to identify shell to be executed Examples: #! /bin/sh (defaults to bash) #! /bin/bash #! /bin/csh #! /usr/bin/tcsh • Make the shell program executable • Use the “chmod” command to make the program/script file executable CSCI 330 - The UNIX System 2
Example: “hello” Script #! /bin/csh echo "Hello $USER" echo "This machine is `uname -n`" echo "The calendar for this month is:" cal echo "You are running these processes:" ps CSCI 330 - The UNIX System 3
CSCI 330 - The UNIX System Example script output % chmod u+x hello % ./hello Hello ege! This machine is turing The calendar for this month is February 2008 S M Tu W Th F S 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 You are running these processes: PID TTY TIME CMD 24861 pts/18 0:00 hello.csh 24430 pts/18 0:00 csh
CSCI 330 - The UNIX System Shell Logic Structures • Basic logic structures needed for program development: • Sequential logic • User input • Decision logic • Looping logic • Case logic
CSCI 330 - The UNIX System Input to a C shell script • Reading/prompting for user input • Providing input as command line arguments • Accessing contents of files
CSCI 330 - The UNIX System Reading user input with $< • Use a special C shell variable: $< • Reads a line from terminal (stdin) up to, but not including the new line
CSCI 330 - The UNIX System Example: Accepting User Input #! /bin/csh echo "What is your name?" set name = $< echo Greetings to you, $name echo "See you soon"
CSCI 330 - The UNIX System Example: Accepting User Input % chmod u+x greetings % ./greetings What is your name? Laura Flowers Greetings to you, Laura Flowers See you soon User entered Laura Flowers
CSCI 330 - The UNIX System Command line arguments • Use arguments to modify script behavior • command line arguments become positional parameters to C shell script • positional parameters are numbered variables: $1, $2, $3 …
CSCI 330 - The UNIX System Command line arguments Meaning $0 name of the script $1, $2 first and second parameter ${10} 10th parameter { } prevents “$1” misunderstanding $* all positional parameters $#argv the number of arguments
CSCI 330 - The UNIX System Example: Command Line Arguments #! /bin/csh # Usage: greetings name1 name2 # Input: name1 and name2 echo $0 to you $1 $2 echo Today is `date` $1 $2 echo Good Bye $1 $2
CSCI 330 - The UNIX System Example: Command Line Arguments % chmod u+x greetings % ./greetings Mark Flowers ./greetings to you Mark Flowers Today is Mon Feb 16 14:18:03 CST 2008 Good Bye Mark Flowers $0 => greetings $1 => Mark $2 => Flowers
CSCI 330 - The UNIX System Decision logic • if Statement: simplest forms if ( expression ) command if ( expression ) then command(s) endif
CSCI 330 - The UNIX System Decision logic • if-then-else Statement if ( expression ) then command(s) else command(s) endif
CSCI 330 - The UNIX System Decision logic • if-then-else Statement if ( expression ) then command(s) else if ( expression ) then command(s) else command(s) endif
CSCI 330 - The UNIX System Basic Operators in Expressions Meaning ( ) grouping ! Logical “not” > >= < <= greater than, less than == != equal to, not equal to || Logical “or” && Logical “and”
CSCI 330 - The UNIX System Expression examples • if ( $1 == “next” ) echo $2 • if ( $#argv != 0 ) then … endif • if ( $#argv > 0 && $#argv < 5) then … endif
CSCI 330 - The UNIX System Example: Command Line Arguments #! /bin/csh if ( $#argv == 0 ) then echo -n "Enter time in minutes: " @ min = $< else @ min = $1 endif @ sec = $min * 60 echo “$min minutes is $sec seconds”
CSCI 330 - The UNIX System Example: Reading file contents #! /bin/csh # Usage: lookup nameOrNumber set list = "users.txt" if ( $#argv == 0 ) then echo -n "Enter name OR z-id: " set name = $< else set name = $* endif grep -i "$name" $list if ( $status ) echo "$name not found"
CSCI 330 - The UNIX System File Testing operators • Syntax: if ( -opr filename )
CSCI 330 - The UNIX System Example: File Testing if ( -e $1 ) then echo $1 exists if ( -f $1 ) then echo $1 is an ordinary file else echo $1 is NOT ordinary file endif else echo $1 does NOT exist endif
CSCI 330 - The UNIX System C Shell looping constructs • predetermined iterations repeat foreach • condition-based iterations while
CSCI 330 - The UNIX System Fixed number iterations Syntax: repeat number command • executes “command” “number” times Examples: repeat 5 ls repeat 2 echo “go home”
CSCI 330 - The UNIX System The foreach Statement foreach name ( wordlist ) commands end • wordlist is: list of words, or multi-valued variable • each time through, foreach assigns the next item in wordlist to the variable $name
CSCI 330 - The UNIX System Example: foreach Statement foreach word ( one two three ) echo $word end • or set list = ( one two three ) foreach word ( $list ) echo $word end
CSCI 330 - The UNIX System Loops with foreach • useful to process result of command, one at a time Example: #! /bin/csh @ sum = 0 foreach file (`ls`) set size = `cat $file | wc -c` echo "Counting: $file ($size)" @ sum = $sum + $size end echo Sum: $sum
CSCI 330 - The UNIX System The while Statement while ( expression ) commands end • use when the number of iterations is not known in advance • execute ‘commands’ when the expression is true • terminates when the expression becomes false
CSCI 330 - The UNIX System Example: while #! /bin/csh @ var = 5 while ( $var > 0 ) echo $var @ var = $var – 1 end
CSCI 330 - The UNIX System Example: while #! /bin/csh echo -n "Enter directory to list: " set dirname = $< while ( ! -d $dirname ) echo "$dirname is not directory" echo -n "Enter directory to list: " set dirname = $< end ls $dirname
CSCI 330 - The UNIX System loop control • break ends loop, i.e. breaks out of current loop • continue ends current iteration of loop, continues with next iteration
CSCI 330 - The UNIX System loop control example #! /bin/csh while (1) echo -n "want more? " set answer = $< if ($answer == "y") echo "fine" if ($answer == "n") break if ($answer == "c") continue echo "now we are at the end" end
CSCI 330 - The UNIX System loop control example #! /bin/csh while ( 1 ) echo -n "Enter directory to list: " set dirname = $< if ( -d $dirname ) break echo "$dirname is not directory" end ls $dirname
CSCI 330 - The UNIX System The switch Statement • Use when a variable can take different values • Use switch statement to process different cases (case statement) • Can replace a long sequence of if-then-else statements
CSCI 330 - The UNIX System The switch Statement C shell compares ‘string’ to each ‘pattern’ until it finds a match switch ( string ) case pattern1: command(s) breaksw case pattern2: command(s) breaksw endsw When a match is found, execute the command(s) … until breaksw
CSCI 330 - The UNIX System The switch Statement switch (string) case pattern1: command(s) breaksw case pattern2: command(s) breaksw default: command(s) breaksw endsw When a match is not found, execute the commands following the default label
CSCI 330 - The UNIX System Example: switch switch ($var) case one: echo it is 1 breaksw case two: echo it is 2 breaksw default: echo it is $var breaksw endsw
CSCI 330 - The UNIX System The switch Statement • if no pattern matches and there is no default, then nothing gets executed • do not omit the breaksw statement ! If you omit the breaksw statement, all the commands under the next case pattern are executed until a breaksw or endsw statement is encountered • pattern may contain wildcards: *, ?, []
CSCI 330 - The UNIX System Example: switch greeting #! /bin/csh # Usage: greeting name # examines time of day for greeting set hour=`date` switch ($hour[4]) case 0*: case 1[01]*: set greeting=morning ; breaksw case 1[2-7]*: set greeting=afternoon ; breaksw default: set greeting=evening endsw echo Good $greeting $1
CSCI 330 - The UNIX System Example C Shell program AVAILABLE OPTIONS ******************* [1] Display today's date [2] How many people are logged on [3] How many user accounts exist [4] Exit Enter Your Choice [1-4]:
CSCI 330 - The UNIX System userutil shell script 1 of 2 #! /bin/csh # Usage: userutil while (1) echo "AVAILABLE OPTIONS" echo "*******************" echo "[1] Display today's date" echo "[2] How many people are logged on" echo "[3] How many user accounts exist" echo "[4] Exit" echo "Enter Your Choice [1-4]:"
CSCI 330 - The UNIX System userutil shell script 2 of 2 set answer = $< switch ($answer) case "1": echo `date`; breaksw case "2": echo `users | wc -w` users are logged in breaksw case "3": echo `cat /etc/passwd | wc -l` users exists breaksw case "4": echo "BYE" break breaksw endsw end # end of while
CSCI 330 - The UNIX System Advanced C Shell Programming • Quoting • Here • Debugging • Trapping Signals • Functions ? • calling other scripts • exec, source, eval
CSCI 330 - The UNIX System Quoting • mechanism for marking a section of a command for special processing: • command substitution: `...` • double quotes: “…“ • single quotes: ‘…‘ • backslash: \
CSCI 330 - The UNIX System Double quotes • prevents breakup of string into words • turn off the special meaning of most wildcard characters and the single quote • $ character keeps its meaning • ! history references keeps its meaning • Examples: echo "* isn't a wildcard inside quotes" echo "my path is $PATH"
CSCI 330 - The UNIX System Single quotes • wildcards, variables and command substitutions are all treated as ordinary text • history references are recognized Examples: echo '*' echo '$cwd' echo '`echo hello`' echo 'hi there !'
CSCI 330 - The UNIX System backslash • backslash character \ treats following character literally Examples: echo \$ is a dollar sign echo \\ is a backslash
CSCI 330 - The UNIX System The here Command Example: ispell -l << DONE I was running along quite nicely when I was acosted by the mail man whio insisted that my name is Raimund but I did not believe him DONE
CSCI 330 - The UNIX System Debugging Scripts % csh –n scriptname • parse commands but do not execute them % csh –v scriptname • Display each line of the script before execution % csh –x scriptname • Displays each line of the script after variable substitutions and before execution • can also be added to shebang line !
CSCI 330 - The UNIX System Trapping Signals • any Unix process can be interrupted by a signal • common signal: ^C typed via keyboard • causes csh to terminate • can be “trapped”, i.e. other behavior specified • useful for cleanup upon forced exit