Skip to content

Files

Latest commit

 

History

History
29 lines (17 loc) · 1.26 KB

SC2166.md

File metadata and controls

29 lines (17 loc) · 1.26 KB

Pattern: Use of [ p -a q ]/[ p -o q ]

Issue: -

Description

-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" ]

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

Further Reading