Справа не стільки в тому, що вона не є портативною, а в тому, що немає [
впровадження, де вона є надійною, коли передано більше 4 аргументів.
Навіть у басі:
$ 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
Я навіть вважаю це більш розбірливим.