home *** CD-ROM | disk | FTP | other *** search
- .\" Copyright (c) 1980 Regents of the University of California.
- .\" All rights reserved. The Berkeley software License Agreement
- .\" specifies the terms and conditions for redistribution.
- .\"
- .\" @(#)csh.4 6.1 (Berkeley) 5/23/86
- .\"
- .nr H1 3
- .NH
- Other, less commonly used, shell features
- .NH 2
- Loops at the terminal; variables as vectors
- .PP
- It is occasionally useful to use the
- .I foreach
- control structure at the terminal to aid in performing a number
- of similar commands.
- For instance, there were at one point three shells in use on the Cory \s-2UNIX\s0
- system at Cory Hall,
- `/bin/sh',
- `/bin/nsh',
- and
- `/bin/csh'.
- To count the number of persons using each shell one could have issued
- the commands
- .DS
- % grep \-c csh$ /etc/passwd
- 27
- % grep \-c nsh$ /etc/passwd
- 128
- % grep \-c \-v sh$ /etc/passwd
- 430
- %
- .DE
- Since these commands are very similar we can use
- .I foreach
- to do this more easily.
- .DS
- % foreach i (\'sh$\' \'csh$\' \'\-v sh$\')
- ? grep \-c $i /etc/passwd
- ? end
- 27
- 128
- 430
- %
- .DE
- Note here that the shell prompts for
- input with `? ' when reading the body of the loop.
- .PP
- Very useful with loops are variables which contain lists of filenames
- or other words.
- You can, for example, do
- .DS
- % set a=(\`ls\`)
- % echo $a
- csh.n csh.rm
- % ls
- csh.n
- csh.rm
- % echo $#a
- 2
- %
- .DE
- The
- .I set
- command here gave the variable
- .I a
- a list of all the filenames in the current directory as value.
- We can then iterate over these names to perform any chosen function.
- .PP
- The output of a command within `\`' characters is converted by
- the shell to a list of words.
- You can also place the `\`' quoted string within `"' characters
- to take each (non-empty) line as a component of the variable;
- preventing the lines from being split into words at blanks and tabs.
- A modifier `:x' exists which can be used later to expand each component
- of the variable into another variable splitting it into separate words
- at embedded blanks and tabs.
- .NH 2
- Braces { ... } in argument expansion
- .PP
- Another form of filename expansion, alluded
- to before involves the characters `{' and `}'.
- These characters specify that the contained strings, separated by `,'
- are to be consecutively substituted into the containing characters
- and the results expanded left to right.
- Thus
- .DS
- A{str1,str2,...strn}B
- .DE
- expands to
- .DS
- Astr1B Astr2B ... AstrnB
- .DE
- This expansion occurs before the other filename expansions, and may
- be applied recursively (i.e. nested).
- The results of each expanded string are sorted separately, left
- to right order being preserved.
- The resulting filenames are not required to exist if no other expansion
- mechanisms are used.
- This means that this mechanism can be used to generate arguments which are
- not filenames, but which have common parts.
- .PP
- A typical use of this would be
- .DS
- mkdir ~/{hdrs,retrofit,csh}
- .DE
- to make subdirectories `hdrs', `retrofit' and `csh'
- in your home directory.
- This mechanism is most useful when the common prefix is longer
- than in this example, i.e.
- .DS
- chown root /usr/{ucb/{ex,edit},lib/{ex?.?*,how_ex}}
- .DE
- .NH 2
- Command substitution
- .PP
- A command enclosed in `\`' characters is replaced, just before
- filenames are expanded, by the output from that command.
- Thus it is possible to do
- .DS
- set pwd=\`pwd\`
- .DE
- to save the current directory in the variable
- .I pwd
- or to do
- .DS
- ex \`grep \-l TRACE *.c\`
- .DE
- to run the editor
- .I ex
- supplying as arguments those files whose names end in `.c'
- which have the string `TRACE' in them.*
- .FS
- *Command expansion also occurs in input redirected with `<<'
- and within `"' quotations.
- Refer to the shell manual section for full details.
- .FE
- .NH 2
- Other details not covered here
- .PP
- In particular circumstances it may be necessary to know the exact
- nature and order of different substitutions performed by the shell.
- The exact meaning of certain combinations of quotations is also
- occasionally important.
- These are detailed fully in its manual section.
- .PP
- The shell has a number of command line option flags mostly of use
- in writing \s-2UNIX\s0 programs,
- and debugging shell scripts.
- See the csh(1) manual section for a list of these options.
- .bp
-