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