Não é tanto que não seja portável, mas não exista nenhuma implementação [
onde seja confiável quando passar por mais de 4 argumentos.
Mesmo no bash:
$ ALTNAMES='=' bash -c '[ -n "${ALTNAMES}" -a -n "${COMMON_NAME}" ]'
bash: line 0: [: too many arguments
A seção relacionada afirma:
>4 arguments:
The results are unspecified.
[OB XSI] [Option Start] On XSI-conformant systems, combinations of primaries and operators shall be evaluated using the precedence and associativity rules described previously. In addition, the string comparison binary primaries '=' and "!=" shall have a higher precedence than any unary primary. [Option End]
-a
e -o
devem ser banidos. O caminho certo é usar os operadores &&
e ||
shell :
if [ -n "$foo" ] && [ -n "$bar" ]; then
Eu até acho mais legível.