Conditional Constructs
----------------------
`if'
The syntax of the `if' command is:
if TEST-COMMANDS; then
CONSEQUENT-COMMANDS;
[elif MORE-TEST-COMMANDS; then
MORE-CONSEQUENTS;]
[else ALTERNATE-CONSEQUENTS;]
fi
The TEST-COMMANDS list is executed, and if its return status is
zero, the CONSEQUENT-COMMANDS list is executed. If TEST-COMMANDS
returns a non-zero status, each `elif' list is executed in turn,
and if its exit status is zero, the corresponding MORE-CONSEQUENTS
is executed and the command completes. If `else
ALTERNATE-CONSEQUENTS' is present, and the final command in the
final `if' or `elif' clause has a non-zero exit status, then
ALTERNATE-CONSEQUENTS is executed. The return status is the exit
status of the last command executed, or zero if no condition
tested true.
`case'
The syntax of the `case' command is:
`case WORD in [ [(] PATTERN [| PATTERN]...) COMMAND-LIST ;;]... esac'
`case' will selectively execute the COMMAND-LIST corresponding to
the first PATTERN that matches WORD. The `|' is used to separate
multiple patterns, and the `)' operator terminates a pattern list.
A list of patterns and an associated command-list is known as a
CLAUSE. Each clause must be terminated with `;;'. The WORD
undergoes tilde expansion, parameter expansion, command
substitution, arithmetic expansion, and quote removal before
matching is attempted. Each PATTERN undergoes tilde expansion,
parameter expansion, command substitution, and arithmetic
expansion.
There may be an arbitrary number of `case' clauses, each terminated
by a `;;'. The first pattern that matches determines the
command-list that is executed.
Here is an example using `case' in a script that could be used to
describe one interesting feature of an animal:
echo -n "Enter the name of an animal: "
read ANIMAL
echo -n "The $ANIMAL has "
case $ANIMAL in
horse | dog | cat) echo -n "four";;
man | kangaroo ) echo -n "two";;
*) echo -n "an unknown number of";;
esac
echo " legs."
The return status is zero if no PATTERN is matched. Otherwise, the
return status is the exit status of the COMMAND-LIST executed.
`select'
The `select' construct allows the easy generation of menus. It
has almost the same syntax as the `for' command:
select NAME [in WORDS ...]; do COMMANDS; done
The list of words following `in' is expanded, generating a list of
items. The set of expanded words is printed on the standard error
output stream, each preceded by a number. If the `in WORDS' is
omitted, the positional parameters are printed, as if `in "$@"'
had been specifed. The `PS3' prompt is then displayed and a line
is read from the standard input. If the line consists of a number
corresponding to one of the displayed words, then the value of
NAME is set to that word. If the line is empty, the words and
prompt are displayed again. If `EOF' is read, the `select'
command completes. Any other value read causes NAME to be set to
null. The line read is saved in the variable `REPLY'.
The COMMANDS are executed after each selection until a `break'
command is executed, at which point the `select' command completes.
Here is an example that allows the user to pick a filename from the
current directory, and displays the name and index of the file
selected.
select fname in *;
do
echo you picked $fname \($REPLY\)
break;
done
`((...))'
(( EXPRESSION ))
The arithmetic EXPRESSION is evaluated according to the rules
described below (Note:Shell Arithmetic). If the value of the
expression is non-zero, the return status is 0; otherwise the
return status is 1. This is exactly equivalent to
let "EXPRESSION"
Note:Bash Builtins, for a full description of the `let' builtin.
`[[...]]'
[[ EXPRESSION ]]
Return a status of 0 or 1 depending on the evaluation of the
conditional expression EXPRESSION. Expressions are composed of
the primaries described below in Note:Bash Conditional
Expressions. Word splitting and filename expansion are not
performed on the words between the `[[' and `]]'; tilde expansion,
parameter and variable expansion, arithmetic expansion, command
substitution, process substitution, and quote removal are
performed.
When the `==' and `!=' operators are used, the string to the right
of the operator is considered a pattern and matched according to
the rules described below in Note:Pattern Matching. The return
value is 0 if the string matches or does not match the pattern,
respectively, and 1 otherwise. Any part of the pattern may be
quoted to force it to be matched as a string.
Expressions may be combined using the following operators, listed
in decreasing order of precedence:
`( EXPRESSION )'
Returns the value of EXPRESSION. This may be used to
override the normal precedence of operators.
`! EXPRESSION'
True if EXPRESSION is false.
`EXPRESSION1 && EXPRESSION2'
True if both EXPRESSION1 and EXPRESSION2 are true.
`EXPRESSION1 || EXPRESSION2'
True if either EXPRESSION1 or EXPRESSION2 is true.
The `&&' and `||' commands do not execute EXPRESSION2 if the value
of EXPRESSION1 is sufficient to determine the return value of the
entire conditional expression.