Тест POSIX и -a

Я проверил свой скрипт с checkbashisms, и я получил следующие предупреждения:

possible bashism in check_ssl_cert line 821 (test -a/-o): if [ -n "${ALTNAMES}" -a -n "${COMMON_NAME}" ] ; then 

В разделе 4.62.4 спецификаций POSIX я нахожу

primary -a primary Выполняет двоичный код и результаты первичного и первичного. Оператор -a имеет приоритет над оператором -o.

Почему -a и -o считаются не переносимыми?

Это не так, что он не переносимый, но что нет [ реализации, где он надежный, когда передано более 4 аргументов.

Даже в bash:

 $ ALTNAMES='=' bash -c '[ -n "${ALTNAMES}" -a -n "${COMMON_NAME}" ]' bash: line 0: [: too many arguments 

В соответствующем разделе говорится:

> 4 аргумента :

Результаты не определены.

[OB XSI] [Начало опции] В системах, совместимых с XSI, комбинации первичных и операторов должны оцениваться с использованием правил приоритета и ассоциативности, описанных ранее. Кроме того, двоичные праймеры сравнения строк «=» и «! =» Должны иметь более высокий приоритет, чем любой унарный первичный. [Вариант завершения]

-a и -o должны быть запрещены. Правильный способ – использовать && и || вместо операторов оболочки :

 if [ -n "$foo" ] && [ -n "$bar" ]; then 

Я даже считаю его более разборчивым.

Потому что они являются расширением XSI, которое может быть реализовано или не реализовано. См .: http://pubs.opengroup.org/onlinepubs/009695399/utilities/test.html