Какой синтаксис для операторов `if` наиболее переносим?

Какой синтаксис для операторов `if` наиболее переносим?

(ПРИМЕЧАНИЕ: естьочень похожий вопрос, заданный вчера, как ни странно, но он не охватывает основные синтаксисы, которые меня интересуют. Если бы я обновил другой вопрос, включив их, это могло бы сделать ответы недействительными, поэтому я сосредоточусь здесь на том, что было упущено в другом вопросе. Любой, кто хочет получить полную картину, должен посмотреть на оба вопроса и принятые ответы на них.)

Обычно я пишу свои операторы if следующим образом:

if [[ -z "$SOMETHING" ]]; then
  # blah blah blah
fi

который хорошо работает у меня под Bash и Z Shell, но недавно я столкнулся ссинтаксис, который полностью исключает квадратные скобки:

if command -v given-command > /dev/null 2>&1; then
  echo given-command is available
else
  echo given-command is not available
fi

Является ли версия без кронштейнов переносимой? Как она соотносится с представленными вариантамиздесь?

Поддерживается ли моя стандартная версия только в Bash и Z Shell (как [[ -w /home/durrantm ]] && echo "writable"версия, упомянутая в другом вопросе)?

решение1

Да, ваша стандартная версия не является стандартом POSIX, как указано в вопросе, на который вы ссылаетесь. Однако, следующее:

if some-command args; then ...

Я бы сказал, что это единственная переносимая форма if, поскольку именно в этом и ifзаключается суть. ifделает что-то, если some-command(это может быть функция, встроенная функция оболочки или исполняемый файл 1 ) возвращает 0аргументы и входные данные, с которыми он запущен.

Когда вы запускаете if [ ]или if [[ ]], [ ]и [[ ]]являются программами или встроенными оболочками, которые возвращают 0, если условие проверяется как истинное. Если вы преобразуете [в test, вы увидите, что вы всегда запускаете форму без скобок:

if [ ... ]
# same as 
if /bin/test ...

1 Чтобы быть более точным, давайте рассмотрим, как ifустроена конструкцияопределено:

Theесликоманда должна выполнитьсоставной списоки использовать его статус выхода, чтобы определить, следует ли выполнить еще одинсоставной список.

Формат дляесликонструкция выглядит следующим образом:

if compound-list 
then
    compound-list
[elif compound-list 
then
    compound-list] ...
[else
    compound-list]
fi

Обратите внимание, чтосписок соединенийэто не то же самое, чтосоставная команда.

Связанный контент