When setting several variables in a row, be aware that the order of the evaluation is undefined. For instance foo=1 foo=2; echo $foo gives 1 with sh on Solaris, but 2 with Bash. You must use ; to enforce the order: foo=1; foo=2; echo $foo.
Don't rely on the following to find subdir/program:
PATH=subdir$PATH_SEPARATOR$PATH program
as this does not work with Zsh 3.0.6. Use something like this instead:
(PATH=subdir$PATH_SEPARATOR$PATH; export PATH; exec program)
Don't rely on the exit status of an assignment: Ash 0.2 does not change the status and propagates that of the last statement:
$ false || foo=bar; echo $? 1 $ false || foo=`:`; echo $? 0
and to make things even worse, qnx 4.25 just sets the exit status to 0 in any case:
$ foo=`exit 1`; echo $? 0
To assign default values, follow this algorithm:
If the default value is a literal and does not contain any closing brace, use:
: ${var='my literal'}
If the default value contains no closing brace, has to be expanded, and the variable being initialized will never be IFS-split (i.e., it's not a list), then use:
: ${var="$default"}
If the default value contains no closing brace, has to be expanded, and the variable being initialized will be IFS-split (i.e., it's a list), then use:
var=${var="$default"}
If the default value contains a closing brace, then use:
test "${var+set}" = set || var='${indirection}'
In most cases var=${var="$default"} is fine, but in case of doubt, just use the latter. the section called “Shell Substitutions ”, items ${var:-value} and ${var=value} for the rationale.