Тест POSIX и -a

9

Я проверил свой сценарий с контрбашизмами и получил следующие предупреждения:

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

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

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

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

Matteo
источник

Ответы:

11

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

Даже в баше

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

Соответствующий раздел гласит:

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

Результаты не уточняются.

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

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

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

Я даже нахожу это более разборчивым.

Стефан Шазелас
источник
Спасибо, так что единственное решение будет иметь два теста? `if [-n" $ {ALTNAMES} "] && [-n" $ {COMMON_NAME}];
Маттео
3
Не единственный, но, безусловно, лучший и рекомендуемый в качестве замены -aи-o
Стефан Шазелас
Хорошо, большое спасибо (только я имел в виду, что нет возможности пройти ни одного теста ...).
Маттео
1
Да, вы могли бы сделать [ "x$ALTNAMES" != x -a "x$COMMON_NAME" != x ](все еще не определено в соответствии с POSIX, но переносимо и надежно), или[ "${ALTNAMES:+x}${COMMON_NAME:+x}" = xx ]
Стефан Шазелас