Upload
jocelyn-smith
View
218
Download
0
Embed Size (px)
Citation preview
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 executable2
CS
CI 330 - T
he UN
IX S
ystem
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
3
CS
CI 330 - T
he UN
IX S
ystem
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 csh4
CS
CI 330 - T
he UN
IX S
ystem
SHELL LOGIC STRUCTURES
Basic logic structures needed for program development:
Sequential logic User input Decision logic Looping logic Case logic
5
CS
CI 330 - T
he UN
IX S
ystem
INPUT TO A C SHELL SCRIPT
Reading/prompting for user input Providing input as command line arguments Accessing contents of files
6
CS
CI 330 - T
he UN
IX S
ystem
READING USER INPUT WITH $<
Use a special C shell variable: $<
Reads a line from terminal (stdin) up to, but not including the new line
7
CS
CI 330 - T
he UN
IX S
ystem
EXAMPLE: ACCEPTING USER INPUT
#! /bin/csh
echo "What is your name?"
set name = $<
echo Greetings to you, $name
echo "See you soon"
8
CS
CI 330 - T
he UN
IX S
ystem
EXAMPLE: ACCEPTING USER INPUT
% chmod u+x greetings
% ./greetings
What is your name?
Laura Flowers
Greetings to you, Laura Flowers
See you soon
9
CS
CI 330 - T
he UN
IX S
ystem
User entered Laura Flowers
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 …
10
CS
CI 330 - T
he UN
IX S
ystem
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
11
CS
CI 330 - T
he UN
IX S
ystem
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
12
CS
CI 330 - T
he UN
IX S
ystem
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
13
CS
CI 330 - T
he UN
IX S
ystem
$0 => greetings$1 => Mark
$2 => Flowers
DECISION LOGIC
if Statement: simplest forms
if ( expression ) command
if ( expression ) then
command(s)
endif
14
CS
CI 330 - T
he UN
IX S
ystem
DECISION LOGIC
if-then-else Statement
if ( expression ) then
command(s)
else
command(s)
endif
15
CS
CI 330 - T
he UN
IX S
ystem
DECISION LOGIC
if-then-else Statement
if ( expression ) then
command(s)
else if ( expression ) then
command(s)
else
command(s)
endif
16
CS
CI 330 - T
he UN
IX S
ystem
BASIC OPERATORS IN EXPRESSIONS
Meaning( ) grouping! Logical “not”
> >= < <= greater than, less than
== != equal to, not equal to
|| Logical “or”&& Logical “and”
17
CS
CI 330 - T
he UN
IX S
ystem
EXPRESSION EXAMPLES
if ( $1 == “next” ) echo $2
if ( $#argv != 0 ) then
…
endif
if ( $#argv > 0 && $#argv < 5) then
…
endif
18
CS
CI 330 - T
he UN
IX S
ystem
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”
19
CS
CI 330 - T
he UN
IX S
ystem
EXAMPLE: READING FILE CONTENTS
#! /bin/csh# Usage: lookup nameOrNumberset list = "users.txt"if ( $#argv == 0 ) then echo -n "Enter name OR z-id: " set name = $<else set name = $*endifgrep -i "$name" $listif ( $status ) echo "$name not found"
20
CS
CI 330 - T
he UN
IX S
ystem
FILE TESTING OPERATORS
Syntax: if ( -opr filename )
21
CS
CI 330 - T
he UN
IX S
ystem
opr Meaning
r Read access
w Write access
x Execute access
e Existence
z Zero length
f Ordinary file
d directory
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
endif22
CS
CI 330 - T
he UN
IX S
ystem
C SHELL LOOPING CONSTRUCTS
predetermined iterationsrepeatforeach
condition-based iterationswhile
23
CS
CI 330 - T
he UN
IX S
ystem
FIXED NUMBER ITERATIONS
Syntax:
repeat number command
executes “command” “number” times
Examples:repeat 5 ls
repeat 2 echo “go home”
24
CS
CI 330 - T
he UN
IX S
ystem
THE FOREACH STATEMENT
foreach name ( wordlist )
commands
end
wordlist is:list of words, ormulti-valued variable
each time through, foreach assigns the next item in wordlist to the variable $name
25
CS
CI 330 - T
he UN
IX S
ystem
EXAMPLE: FOREACH STATEMENT
foreach word ( one two three )
echo $word
end
or
set list = ( one two three )
foreach word ( $list )
echo $word
end26
CS
CI 330 - T
he UN
IX S
ystem
LOOPS WITH FOREACH useful to process result of command,
one at a time
Example:#! /bin/csh@ sum = 0foreach file (`ls`) set size = `cat $file | wc -c` echo "Counting: $file ($size)" @ sum = $sum + $sizeendecho Sum: $sum 27
CS
CI 330 - T
he UN
IX S
ystem
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
28
CS
CI 330 - T
he UN
IX S
ystem
EXAMPLE: WHILE
#! /bin/csh
@ var = 5
while ( $var > 0 )
echo $var
@ var = $var – 1
end
29
CS
CI 330 - T
he UN
IX S
ystem
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
30
CS
CI 330 - T
he UN
IX S
ystem
LOOP CONTROL
break
ends loop, i.e. breaks out of current loop
continue
ends current iteration of loop, continues with next iteration
31
CS
CI 330 - T
he UN
IX S
ystem
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
32
CS
CI 330 - T
he UN
IX S
ystem
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
33
CS
CI 330 - T
he UN
IX S
ystem
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
34
CS
CI 330 - T
he UN
IX S
ystem
THE SWITCH STATEMENT
switch ( string )
case pattern1:
command(s)
breaksw
case pattern2:
command(s)
breaksw
endsw
35
CS
CI 330 - T
he UN
IX S
ystem
C shell compares ‘string’ to each ‘pattern’ until it finds a match
When a match is found, execute the command(s)
… until breaksw
THE SWITCH STATEMENT
switch (string)case pattern1:
command(s)breakswcase pattern2:
command(s)breaksw default:
command(s)breaksw
endsw36
CS
CI 330 - T
he UN
IX S
ystem
When a match is not found, execute the commands following the default label
EXAMPLE: SWITCH
switch ($var) case one: echo it is 1 breaksw case two: echo it is 2 breaksw default: echo it is $var breakswendsw
37
CS
CI 330 - T
he UN
IX S
ystem
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
commandsunder the next case pattern are executed until abreaksw or endsw statement is encountered
pattern may contain wildcards:*, ?, []
38
CS
CI 330 - T
he UN
IX S
ystem
EXAMPLE: SWITCH GREETING#! /bin/csh# Usage: greeting name# examines time of day for greetingset 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=eveningendswecho Good $greeting $1 39
CS
CI 330 - T
he UN
IX S
ystem
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]:
40
CS
CI 330 - T
he UN
IX S
ystem
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]:"
41
CS
CI 330 - T
he UN
IX S
ystem
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 endswend # end of while
42
CS
CI 330 - T
he UN
IX S
ystem
ADVANCED C SHELL PROGRAMMING
Quoting Here Debugging Trapping Signals
Functions ? calling other scripts exec, source, eval
43
CS
CI 330 - T
he UN
IX S
ystem
QUOTING
mechanism for marking a section of a command for special processing:
command substitution: `...` double quotes: “…“ single quotes: ‘…‘ backslash: \
44
CS
CI 330 - T
he UN
IX S
ystem
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"
45
CS
CI 330 - T
he UN
IX S
ystem
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 !'
46
CS
CI 330 - T
he UN
IX S
ystem
BACKSLASH
backslash character \treats following character literally
Examples:echo \$ is a dollar signecho \\ is a backslash
47
CS
CI 330 - T
he UN
IX S
ystem
THE HERE COMMAND
Example:ispell -l << DONEI was running along quite nicelywhen I was acosted by the mail manwhio insisted that my name is Raimundbut I did not believe himDONE 48
CS
CI 330 - T
he UN
IX S
ystem
Command Syntax Meaning
command << keyword Read lines from input until keyword is encountered at the beginning of a line
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 ! 49
CS
CI 330 - T
he UN
IX S
ystem
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
50
CS
CI 330 - T
he UN
IX S
ystem
TRAPPING SIGNAL
Syntax:onintr label
execution continues at label if interrupt signal is received
onintr – ignore interrupt signal
onintr restore previous interrupt signal behavior
51
CS
CI 330 - T
he UN
IX S
ystem
ONINTR EXAMPLE
#! /bin/csh
onintr label
while (1)
echo “.”
sleep 1
end
label:
echo “signal received”
52
CS
CI 330 - T
he UN
IX S
ystem
DIVIDE AND CONQUER
how to modularize a shell script call Unix commands and utilities
call other scripts as subshell sourced in place
evaluate strings to commands
53
CS
CI 330 - T
he UN
IX S
ystem
CALLING OTHER SCRIPTS
as subshell, via: csh scriptname
scriptname
subshell does not see current shell’s variables
subshell sees current environment variables
54
CS
CI 330 - T
he UN
IX S
ystem
EXAMPLE: OUTER
#! /bin/csh
set var = "outer"
setenv VAR "outer"
echo "outer: $var $VAR"
csh inner
echo "outer: $var $VAR"55
CS
CI 330 - T
he UN
IX S
ystem
EXAMPLE: INNER
#! /bin/csh
if ( ! $?var ) set var = "unknown"
echo "inner: $var $VAR"
set var = "inner"
setenv VAR "inner"
echo "inner: $var $VAR"
56
CS
CI 330 - T
he UN
IX S
ystem
“SOURCE” OTHER SCRIPT: NO SUBSHELL
#! /bin/csh
set var = "outer"
setenv VAR "outer"
echo "outer: $var $VAR"
source inner
echo "outer: $var $VAR"57
CS
CI 330 - T
he UN
IX S
ystem
“EXEC” OTHER SCRIPT: NO RETURN
#! /bin/csh
set var = "outer"
setenv VAR "outer"
echo "outer: $var $VAR"
exec ./inner
echo "outer: $var $VAR"58
CS
CI 330 - T
he UN
IX S
ystem
THE “EVAL” COMMAND
“eval” evaluates string executes resulting string
Example:set x = 23
set y = x
eval echo \$$y
59
CS
CI 330 - T
he UN
IX S
ystem
EXAMPLE: THE EVAL COMMAND
#!/bin/csh
set A = 1
set B = 2
set C = 3
foreach i (A B C)
eval echo \$$i
end
60
CS
CI 330 - T
he UN
IX S
ystem