Если хотите выразить следующий тест в shell (sh):
if ( a == 1 && ( b == 1 || b == 2 )) { ... }
На данный момент лучшее, что я смог написать, это:
if [[ $a -eq 1 ]]; then
if [[ $b -eq 1 || $b -eq 2 ]]; then
...
fi
fi
Я не знаю, как составить && и || с правильным приоритетом. Поиск в Google не дал мне никакого ответа (учебники дают только основные примеры, если таковые имеются)
Какой синтаксис объединить эти два, если в один?
ksh
? Тогда ваш исходный код потребует только еще одну пару круглых скобок:if (( a == 1 && ( b == 1 || b == 2 ))); then :; fi
Ответы:
Обратите внимание, что
[[ ]]
нет ни в Bourne, ни в POSIXsh
. Для истинногоsh
синтаксиса, есть несколько способов сделать это.Используя только одну
[ ]
паруили Избегая POSIX
-a
и-o
вариантов 11 Одной из причин для предотвращения
-a
и-o
максимально портативность - не всеtest
или[
реализации могут обрабатывать более 4 аргумента, который является именно то , что вы получите , если вы цепь выражений с-a
и-o
и\( \)
.источник
/bin/sh
, неправильно писать скрипт, используя функции, отсутствующие вsh
. Вы должны знать, чтоksh
это НЕsh
, а скорее надмножествоsh
. Если выksh
перенесете свой -but-объявленный-как-sh
скрипт в систему, гдеsh
нет символической ссылкиksh
, он может сломаться. Вы можете избежать этой проблемы, убедившись, что ваш скрипт соответствует объявлению./bin/sh
вызовет/bin/sh
. Проблема/bin/sh
не принимает[[
. Вы можете либо не использовать,[[
либо использовать оболочку, которая принимает[[
, напримерksh
, как ваш шебанг.-a
/-o
не поддерживаются некоторыми реализациями но это не является надежным для произвольных аргументов. Как[ "$a" = "$b" -o "$b" = "$c" ]
и в случае со значениями типа$a
Like!
во многих[
реализациях.Я попробовал некоторый синтаксис и обнаружил, что
работает.
источник
Другой подход POSIX:
источник
Правильный способ сделать это с помощью простого
shell
:Объяснение:
test
здесь служит в качестве скобок и-o
как логический или. Если вы логичны и внутри «скобок» вы бы воспользовались-a
.Подробнее об этом можно узнать здесь
источник