Go to the next section.

þ þ

Shell Grammar

þ þ

Simple Commands

A simple command is a sequence of optional parameter assignments followed by blank-separated words, with optional redirections interspersed. The first word is the command to be executed, and the remaining words, if any, are arguments to the command. If a command name is given, the parameter assignments modify the environment of the command when it is executed. The value of a simple command is its exit status, or 128 plus the signal number if terminated by a signal.þ þ þ þ

If a simple command is preceded by the word exec, it is executed in the parent shell without forking. If preceded by command, the command word is taken to be the name of an external command, rather than a shell function or builtin. If preceded by noglob, filename generation is not performed on any of the words. If preceded by a -, the command is executed with a - prepended to its argv[0] string. If preceded by nocorrect, spelling correction is not done on any of the words.þ

A pipeline is a sequence of one or more commands separated by | or |&. |& is shorthand for 2>&1 |. The standard output of each command is connected to the standard input of the next command in the pipeline.þ

The value of a pipeline is the value of the last command. If a pipeline is preceded by a !, the value of that pipeline is the logical NOT of the value of the last command.þ þ

If a pipeline is preceded by coproc, it is executed as a coprocess; a two-way pipe is established between it and the parent shell. The shell can read from or write to the coprocess by means of the >&p and <&p redirection operators.þ

A sublist is a sequence of one or more pipelines separated by && or ||. If two pipelines are separated by &&, the second pipeline is executed only if the first is successful (returns a zero value). If two pipelines are separated by ||, the second is executed only if the first is unsuccessful (returns a nonzero value). Both operators have equal precedence and are left associative.þ

A list is a sequence of one or more sublists separated by, and optionally terminated by, ;, &, or a newline. Normally the shell waits for each list to finish before executing the next one. If a list is terminated by a &, the shell executes it in the background, and does not wait for it to finish.

þ þ

Complex Commands

A complex command is one of the following:

þ þ þ

for name [ in word ... ]
do list
done
Expand the list of words, and set the parameter name to each of them in turn, executing list each time. If the in word is omitted, use the positional parameters instead of the words.

for name [ in word ... ] ; sublist
This is a shorthand for for. Though it may cause confusion, it is included for convenience; its use in scripts is discouraged, unless sublist is a command of the form { list }.þ

foreach name ( word ... )
list
end
Another form of for.

for name in word ...
{
list
}
Another form of for.

for name ( word ... ) {
list
}
Another form of for; this requires the option CSH_JUNKIE_PAREN.

for name ( word ... ) sublist
Another form of for; this also requires CSH_JUNKIE_PAREN.þ þ þ

select name [ in word ... ]
do list
done
Print the set of words, each preceded by a number. If the in word is omitted, use the positional parameters. The PROMPT3 prompt is printed and a line is read from standard input. If this line consists of the number of one of the listed words, then the parameter name is set to the word corresponding to this number. If this line is empty, the selection list is printed again. Otherwise, the value of the parameter name is set to null. The contents of the line read from standard input is saved in the parameter REPLY. list is executed for each selection until a break or end-of-file is encountered.

select name [ in word ] ; sublist
A short form of select. þ þ þ

case word in [ pattern ) list ;; ] ... esac
Execute the list associated with the first pattern that matches word, if any. The form of the patterns is the same as that used for filename generation. See section Filename Generation.

case word { [ pattern ) list ;; ] ... }
Another form of case. þ þ

if list
then list
[ elif list ; then list ] ...
[ else list ]
fi
The if list is executed, and, if it returns a zero exit status, the then list is executed. Otherwise, the elif list is executed and, if its value is zero, the then list is executed. If each elif list returns nonzero, the else list is executed.

if ( list ) sublist
A short form of if; this requires the option CSH_JUNKIE_PAREN.

if ( list ) {
list
} elif ( list ) {
list
} ... else {
list
}
An alternate form of if. The parentheses surrounding list can be omitted if the only command in the list is a conditional expression of the form [[ exp ]]. See section Conditional Expressions. This form also requires CSH_JUNKIE_PAREN.þ þ þ

while list
do list
done
Execute the do list as long as the while list returns a zero exit status.

while ( list ) {
list
}
An alternate form of while; this requires the option CSH_JUNKIE_PAREN.þ þ þ

until list
do list
done
Execute the do list as long as the until list returns a nonzero exit status.þ þ þ

repeat word
do list
done
word is expanded and treated as an arithmetic expression, which must evaluate to a number n. list is then executed n times.

repeat word sublist
This is a short form of repeat. þ

( list )
Execute list in a subshell.

{ list }
Execute list.

function word [ () ] ... { list }
word ... () { list }
word ... () sublist
Define a function which is referenced by any one of word. Normally, only one word is provided; multiple words are usually only useful for setting traps. The body of the function is the list between the { and }. See section Functions.þ

time [ pipeline ]
The pipeline is executed, and timing statistics are reported on the standard error in the form specified by the TIMEFMT parameter. If pipeline is omitted, print statistics about the shell process and its children.þ

[[ exp ]]
Evaluates the conditional expression exp and return a zero exit status if it is true. See section Conditional Expressions, for a description of exp.

þ

Reserved Words

þ

The following words are recognized as reserved words when used as the first word of a command unless quoted or removed using the unalias builtin:

do done esac then elif else fi for case if while function repeat time until exec command select coproc noglob - nocorrect foreach end

þ

Comments

þ þ

In noninteractive shells, or in interactive shells with the INTERACTIVE_COMMENTS option set, a word beginning with the third character of the HISTCHARS parameter (# by default) causes that word and all the following characters up to a newline to be ignored.

þ

Aliasing

þ þ

Every token in the shell input is checked to see if there is an alias defined for it. If so, it is replaced by the text of the alias if it is in command position (if it could be the first word of a simple command), or if the alias is global. If the text ends with a space, the next word in the shell input is treated as though it were in command position for purposes of alias expansion. An alias is defined using the alias builtin; global aliases may be defined using the -g option to that builtin.

Alias substitution is done on the shell input before any other substitution except history substitution. Therefore, if an alias is defined for the word `foo', alias substitution may be avoided by quoting part of the word, e.g. `\foo'. But there is nothing to prevent an alias being defined for `\foo' as well.

þ

Quoting

A character may be quoted (that is, made to stand for itself) by preceding it with a \. \ followed by a newline is ignored. All characters enclosed between a pair of single quotes (") are quoted, except the first character of HISTCHARS (! by default). A single quote cannot appear within single quotes. Inside double quotes (""), parameter and command substitution occurs, and \ quotes the characters \, `, ", and $.

Go to the next section.