Pattern: Use of [ p -a q ]
/[ p -o q ]
Issue: -
-a
and -o
to mean AND and OR in a [ .. ]
test expression is not well defined. They are obsolescent extensions in POSIX and the lack of additional quoting levels means that expressions involving these operators are often ambiguous. Values that begin with hyphens and the !
string are the usual issues.
Using multiple [ .. ]
expressions with shell AND/OR operators &&
and ||
is well defined and therefore preferred (but note that they have equal precedence, while -a
/-o
is unspecified but usually implemented as -a
having higher precedence).
Example of incorrect code:
[ "$1" = "test" -a -z "$2" ]
Example of correct code:
[ "$1" = "test" ] && [ -z "$2" ]
If the shell variant being used is ksh derived (such as the bash shell) it will have the shell builtin command [[ ... ]]
. This has the operators &&
, ||
, (
, )
, !
which safely avoid the ambiguity by noting which arguments were quoted and requiring the operators to be unquoted (except by the [[ ... ]]
construct itself).