home *** CD-ROM | disk | FTP | other *** search
-
-
-
-
-
-
- 2.0 Shell procedures
-
- The shell may be used to read and execute commands contained
- in a file. For example,
-
- sh file [ args ]
-
- calls the shell to read commands from file. Such a file is
- called a command procedure or shell procedure. Arguments
- may be supplied with the call and are referred to in file
- using the positional parameters $1, $2, . For example, if
- the file wg contains
-
- who grep $1
-
- then
-
- sh wg fred
-
- is equivalent to
-
- who grep fred
-
-
- UNIX files have three independent attributes, read, write
- and execute. The UNIX command chmod (1) may be used to make
- a file executable. For example,
-
- chmod +x wg
-
- will ensure that the file wg has execute status. Following
- this, the command
-
- wg fred
-
- is equivalent to
-
- sh wg fred
-
- This allows shell procedures and programs to be used inter-
- changeably. In either case a new process is created to run
- the command.
-
- As well as providing names for the positional parameters,
- the number of positional parameters in the call is available
- as $#. The name of the file being executed is available as
- $0.
-
- A special shell parameter $ is used to substitute for all
- positional parameters except $0. A typical use of this is
- to provide some default arguments, as in,
-
- nroff -T450 -ms $
-
-
-
-
-
-
-
-
-
-
- -2-
-
-
- which simply prepends some arguments to those already given.
-
- 2.1 Control flow - for
-
- A frequent use of shell procedures is to loop through the
- arguments ($1, $2, ) executing commands once for each argu-
- ment. An example of such a procedure is tel that searches
- the file /usr/lib/telnos that contains lines of the form
-
-
- fred mh0123
- bert mh0789
-
-
- The text of tel is
-
- for i
- do grep $i /usr/lib/telnos; done
-
- The command
-
- tel fred
-
- prints those lines in /usr/lib/telnos that contain the
- string fred.
-
- tel fred bert
-
- prints those lines containing fred followed by those for
- bert.
-
- The for loop notation is recognized by the shell and has the
- general form
-
- for name in w1 w2
- do command-list
- done
-
- A command-list is a sequence of one or more simple commands
- separated or terminated by a newline or semicolon. Further-
- more, reserved words like do and done are only recognized
- following a newline or semicolon. name is a shell variable
- that is set to the words w1 w2 in turn each time the com-
- mand-list following do is executed. If in w1 w2 is omitted
- then the loop is executed once for each positional parame-
- ter; that is, in $ is assumed.
-
- Another example of the use of the for loop is the create
- command whose text is
-
- for i do >$i; done
-
- The command
-
-
-
-
-
-
-
-
-
-
- -3-
-
-
- create alpha beta
-
- ensures that two empty files alpha and beta exist and are
- empty. The notation >file may be used on its own to create
- or clear the contents of a file. Notice also that a semi-
- colon (or newline) is required before done.
-
- 2.2 Control flow - case
-
- A multiple way branch is provided for by the case notation.
- For example,
-
- case $# in
- 1) cat $1 ;;
- 2) cat $2 <$1 ;;
- ) echo \'usage: append [ from ] to\' ;;
- esac
-
- is an append command. When called with one argument as
-
- append file
-
- $# is the string 1 and the standard input is copied onto the
- end of file using the cat command.
-
- append file1 file2
-
- appends the contents of file1 onto file2. If the number of
- arguments supplied to append is other than 1 or 2 then a
- message is printed indicating proper usage.
-
- The general form of the case command is
-
- case word in
- pattern) command-list;;
-
- esac
-
- The shell attempts to match word with each pattern, in the
- order in which the patterns appear. If a match is found the
- associated command-list is executed and execution of the
- case is complete. Since is the pattern that matches any
- string it can be used for the default case.
-
- A word of caution: no check is made to ensure that only one
- pattern matches the case argument. The first match found
- defines the set of commands to be executed. In the example
- below the commands following the second will never be exe-
- cuted.
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- -4-
-
-
- case $# in
- ) ;;
- ) ;;
- esac
-
-
- Another example of the use of the case construction is to
- distinguish between different forms of an argument. The
- following example is a fragment of a cc command.
-
- for i
- do case $i in
- -[ocs]) ;;
- -) echo \'unknown flag $i\' ;;
- .c) /lib/c0 $i ;;
- ) echo \'unexpected argument $i\' ;;
- esac
- done
-
-
- To allow the same commands to be associated with more than
- one pattern the case command provides for alternative pat-
- terns separated by a . For example,
-
- case $i in
- -x-y)
- esac
-
- is equivalent to
-
- case $i in
- -[xy])
- esac
-
-
- The usual quoting conventions apply so that
-
- case $i in
- \\?)
-
- will match the character ?.
-
- 2.3 Here documents
-
- The shell procedure tel in section 2.1 uses the file
- /usr/lib/telnos to supply the data for grep. An alternative
- is to include this data within the shell procedure as a here
- document, as in,
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- -5-
-
-
- for i
- do grep $i !
-
- fred mh0123
- bert mh0789
-
- !
- done
-
- In this example the shell takes the lines between ! and !
- as the standard input for grep. The string ! is arbitrary,
- the document being terminated by a line that consists of the
- string following .
-
- Parameters are substituted in the document before it is made
- available to grep as illustrated by the following procedure
- called edg.
-
- ed $3 %
- g/$1/s//$2/g
- w
- %
-
- The call
-
- edg string1 string2 file
-
- is then equivalent to the command
-
- ed file %
- g/string1/s//string2/g
- w
- %
-
- and changes all occurrences of string1 in file to string2.
- Substitution can be prevented using \ to quote the special
- character $ as in
-
- ed $3 +
- 1,\\$s/$1/$2/g
- w
- +
-
- (This version of edg is equivalent to the first except that
- ed will print a ? if there are no occurrences of the string
- $1.) Substitution within a here document may be prevented
- entirely by quoting the terminating string, for example,
-
- grep $i \\#
-
- #
-
- The document is presented without modification to grep. If
- parameter substitution is not required in a here document
-
-
-
-
-
-
-
-
-
- -6-
-
-
- this latter form is more efficient.
-
- 2.4 Shell variables
-
- The shell provides string-valued variables. Variable names
- begin with a letter and consist of letters, digits and
- underscores. Variables may be given values by writing, for
- example,
-
- user=fred box=m000 acct=mh0000
-
- which assigns values to the variables user, box and acct. A
- variable may be set to the null string by saying, for exam-
- ple,
-
- null=
-
- The value of a variable is substituted by preceding its name
- with $; for example,
-
- echo $user
-
- will echo fred.
-
- Variables may be used interactively to provide abbreviations
- for frequently used strings. For example,
-
- b=/usr/fred/bin
- mv pgm $b
-
- will move the file pgm from the current directory to the
- directory /usr/fred/bin. A more general notation is avail-
- able for parameter (or variable) substitution, as in,
-
- echo ${user}
-
- which is equivalent to
-
- echo $user
-
- and is used when the parameter name is followed by a letter
- or digit. For example,
-
- tmp=/tmp/ps
- ps a >${tmp}a
-
- will direct the output of ps to the file /tmp/psa, whereas,
-
- ps a >$tmpa
-
- would cause the value of the variable tmpa to be substi-
- tuted.
-
-
-
-
-
-
-
-
-
-
-
- -7-
-
-
- Except for $? the following are set initially by the shell.
- $? is set after executing each command.
-
- $? The exit status (return code) of the last com-
- mand executed as a decimal string. Most com-
- mands return a zero exit status if they com-
- plete successfully, otherwise a non-zero exit
- status is returned. Testing the value of
- return codes is dealt with later under if and
- while commands.
-
- $# The number of positional parameters (in deci-
- mal). Used, for example, in the append command
- to check the number of parameters.
-
- $$ The process number of this shell (in decimal).
- Since process numbers are unique among all
- existing processes, this string is frequently
- used to generate unique temporary file names.
- For example,
-
- ps a >/tmp/ps$$
-
- rm /tmp/ps$$
-
-
- $! The process number of the last process run in
- the background (in decimal).
-
- $- The current shell flags, such as -x and -v.
-
- Some variables have a special meaning to the shell and
- should be avoided for general use.
-
- $MAIL When used interactively the shell looks at the
- file specified by this variable before it
- issues a prompt. If the specified file has
- been modified since it was last looked at the
- shell prints the message you have mail before
- prompting for the next command. This variable
- is typically set in the file .profile, in the
- user's login directory. For example,
-
- MAIL=/usr/spool/mail/fred
-
-
- $HOME The default argument for the cd command. The
- current directory is used to resolve file name
- references that do not begin with a /, and is
- changed using the cd command. For example,
-
- cd /usr/fred/bin
-
- makes the current directory /usr/fred/bin.
-
-
-
-
-
-
-
-
-
- -8-
-
-
- cat wn
-
- will print on the terminal the file wn in this
- directory. The command cd with no argument is
- equivalent to
-
- cd $HOME
-
- This variable is also typically set in the the
- user's login profile.
-
- $PATH A list of directories that contain commands
- (the search path). Each time a command is exe-
- cuted by the shell a list of directories is
- searched for an executable file. If $PATH is
- not set then the current directory, /bin, and
- /usr/bin are searched by default. Otherwise
- $PATH consists of directory names separated by
- :. For example,
-
- PATH=:/usr/fred/bin:/bin:/usr/bin
-
- specifies that the current directory (the null
- string before the first :), /usr/fred/bin, /bin
- and /usr/bin are to be searched in that order.
- In this way individual users can have their own
- `private' commands that are accessible indepen-
- dently of the current directory. If the com-
- mand name contains a / then this directory
- search is not used; a single attempt is made to
- execute the command.
-
- $PS1 The primary shell prompt string, by default,
- `$ '.
-
- $PS2 The shell prompt when further input is needed,
- by default, `> '.
-
- $IFS The set of characters used by blank interpreta-
- tion (see section 3.4).
-
- 2.5 The test command
-
- The test command, although not part of the shell, is
- intended for use by shell programs. For example,
-
- test -f file
-
- returns zero exit status if file exists and non-zero exit
- status otherwise. In general test evaluates a predicate and
- returns the result as its exit status. Some of the more
- frequently used test arguments are given here, see test (1)
- for a complete specification.
-
-
-
-
-
-
-
-
-
-
- -9-
-
-
- test s true if the argument s is not the null string
- test -f file true if file exists
- test -r file true if file is readable
- test -w file true if file is writable
- test -d file true if file is a directory
-
-
- 2.6 Control flow - while
-
- The actions of the for loop and the case branch are deter-
- mined by data available to the shell. A while or until loop
- and an if then else branch are also provided whose actions
- are determined by the exit status returned by commands. A
- while loop has the general form
-
- while command-list
- do command-list
- done
-
-
- The value tested by the while command is the exit status of
- the last simple command following while. Each time round
- the loop command-list is executed; if a zero exit status is
- returned then command-list is executed; otherwise, the loop
- terminates. For example,
-
- while test $1
- do
- shift
- done
-
- is equivalent to
-
- for i
- do
- done
-
- shift is a shell command that renames the positional parame-
- ters $2, $3, as $1, $2, and loses $1.
-
- Another kind of use for the while/until loop is to wait
- until some external event occurs and then run some commands.
- In an until loop the termination condition is reversed. For
- example,
-
- until test -f file
- do sleep 300; done
- commands
-
- will loop until file exists. Each time round the loop it
- waits for 5 minutes before trying again. (Presumably
- another process will eventually create the file.)
-
-
-
-
-
-
-
-
-
-
-
- -10-
-
-
- 2.7 Control flow - if
-
- Also available is a general conditional branch of the form,
-
- if command-list
- then command-list
- else command-list
- fi
-
- that tests the value returned by the last simple command
- following if.
-
- The if command may be used in conjunction with the test com-
- mand to test for the existence of a file as in
-
- if test -f file
- then process file
- else do something else
- fi
-
-
- An example of the use of if, case and for constructions is
- given in section 2.10.
-
- A multiple test if command of the form
-
- if
- then
- else if
- then
- else if
-
- fi
- fi
- fi
-
- may be written using an extension of the if notation as,
-
- if
- then
- elif
- then
- elif
-
- fi
-
-
- The following example is the touch command which changes the
- `last modified' time for a list of files. The command may
- be used in conjunction with make (1) to force recompilation
- of a list of files.
-
-
-
-
-
-
-
-
-
-
-
-
- -11-
-
-
- flag=
- for i
- do case $i in
- -c) flag=N ;;
- ) if test -f $i
- then ln $i junk$$; rm junk$$
- elif test $flag
- then echo file \\'$i\\' does not exist
- else >$i
- fi
- esac
- done
-
- The -c flag is used in this command to force subsequent
- files to be created if they do not already exist. Other-
- wise, if the file does not exist, an error message is
- printed. The shell variable flag is set to some non-null
- string if the -c argument is encountered. The commands
-
- ln ; rm
-
- make a link to the file and then remove it thus causing the
- last modified date to be updated.
-
- The sequence
-
- if command1
- then command2
- fi
-
- may be written
-
- command1 && command2
-
- Conversely,
-
- command1 command2
-
- executes command2 only if command1 fails. In each case the
- value returned is that of the last simple command executed.
-
- 2.8 Command grouping
-
- Commands may be grouped in two ways,
-
- { command-list ; }
-
- and
-
- ( command-list )
-
-
- In the first command-list is simply executed. The second
- form executes command-list as a separate process. For
-
-
-
-
-
-
-
-
-
- -12-
-
-
- example,
-
- (cd x; rm junk )
-
- executes rm junk in the directory x without changing the
- current directory of the invoking shell.
-
- The commands
-
- cd x; rm junk
-
- have the same effect but leave the invoking shell in the
- directory x.
-
- 2.9 Debugging shell procedures
-
- The shell provides two tracing mechanisms to help when
- debugging shell procedures. The first is invoked within the
- procedure as
-
- set -v
-
- (v for verbose) and causes lines of the procedure to be
- printed as they are read. It is useful to help isolate syn-
- tax errors. It may be invoked without modifying the proce-
- dure by saying
-
- sh -v proc
-
- where proc is the name of the shell procedure. This flag
- may be used in conjunction with the -n flag which prevents
- execution of subsequent commands. (Note that saying set -n
- at a terminal will render the terminal useless until an end-
- of-file is typed.)
-
- The command
-
- set -x
-
- will produce an execution trace. Following parameter sub-
- stitution each command is printed as it is executed. (Try
- these at the terminal to see what effect they have.) Both
- flags may be turned off by saying
-
- set -
-
- and the current setting of the shell flags is available as
- $-.
-
- 2.10 The man command
-
- The following is the man command which is used to diplay
- sections of the UNIX manual on your terminal. It is called,
- for example, as
-
-
-
-
-
-
-
-
-
- -13-
-
-
- man sh
- man -t ed
- man 2 fork
-
- In the first the manual section for sh is displayed.. Since
- no section is specified, section 1 is used. The second
- example will typeset (-t option) the manual section for ed.
- The last prints the fork manual page from section 2, which
- covers system calls.
-
-
- found=yes
- fi
- done
- case $found in
- no) echo \'$i: manual page not found\'
- esac
- fi
- esac
- done
- Figure 1. A version of the man command
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-