-
Notifications
You must be signed in to change notification settings - Fork 1.8k
SC2166
And likewise, prefer [ p ] || [ q ]
over [ p -o q ]
.
[ "$1" = "test" -a -z "$2" ]
[ "$1" = "test" ] && [ -z "$2" ]
-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).
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).