Skip to content
rdebath edited this page Jun 25, 2017 · 7 revisions

Prefer [ p ] && [ q ] as [ p -a q ] is not well defined.

And likewise, prefer [ p ] || [ q ] over [ p -o q ].

Problematic code:

[ "$1" = "test" -a -z "$2" ]

Correct code:

[ "$1" = "test" ] && [ -z "$2" ]

Rationale:

-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).

Exceptions:

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).

ShellCheck

Each individual ShellCheck warning has its own wiki page like SC1000. Use GitHub Wiki's "Pages" feature above to find a specific one, or see Checks.

Clone this wiki locally