То, что вы написали, на самом деле почти работает (это будет работать, если бы все переменные были числами), но это совсем не идиоматический способ.
(…)
круглые скобки обозначают подоболочку . То, что внутри них, не является выражением, как во многих других языках. Это список команд (как и в скобках). Эти команды выполняются в отдельном подпроцессе, поэтому любое перенаправление, присваивание и т. Д., Выполняемые внутри скобок, не влияют за пределы скобок.
- С ведущим знаком доллара
$(…)
- подстановка команды : в скобках есть команда, а вывод команды используется как часть командной строки (после дополнительных расширений, если подстановка не заключена в двойные кавычки, но это уже другая история ) ,
{ … }
Скобки подобны скобкам в том смысле, что они группируют команды, но они влияют только на синтаксический анализ, а не на группировку. Программа x=2; { x=4; }; echo $x
печатает 4, а x=2; (x=4); echo $x
печатает 2. (Также скобки требуют пробелов вокруг них и точки с запятой перед закрытием, тогда как круглые скобки - нет. Это просто синтаксическая ошибка).
- С ведущим знаком доллара,
${VAR}
это расширение параметра , расширяющееся до значения переменной, с возможными дополнительными преобразованиями.
((…))
двойные скобки окружают арифметическую инструкцию , то есть вычисление на целых числах, с синтаксисом, похожим на другие языки программирования. Этот синтаксис в основном используется для назначений и в условных выражениях.
- Тот же синтаксис используется в арифметических выражениях
$((…))
, которые расширяются до целочисленного значения выражения.
[[ … ]]
двойные скобки окружают условные выражения . Условные выражения в основном построены на операторах, таких как -n $variable
проверка, является ли переменная пустой, и -e $file
проверка, существует ли файл. Существуют также операторы равенства строк: "$string1" == "$string2"
(имейте в виду, что правая часть является шаблоном, например, [[ $foo == a* ]]
тесты, если $foo
начинается с, в a
то время как [[ $foo == "a*" ]]
тесты, если $foo
точно a*
), и знакомые !
, &&
и ||
операторы для отрицания, соединения и дизъюнкции, а также круглые скобки для группировки. Обратите внимание, что вам нужен пробел вокруг каждого оператора (например [[ "$x" == "$y" ]]
, не [[ "$x"=="$y" ]]
), а также пробел или символ, как ;
внутри, так и вне скобок (например [[ -n $foo ]]
, не[[-n $foo]]
).
[ … ]
одиночные скобки представляют собой альтернативную форму условных выражений с большим количеством причуд (но более старых и более переносимых). Не пишите пока что; начать беспокоиться о них, когда вы найдете сценарии, которые их содержат.
Это идиоматический способ написать свой тест на bash:
if [[ $varA == 1 && ($varB == "t1" || $varC == "t2") ]]; then
Если вам нужна переносимость на другие оболочки, это будет правильным способом (обратите внимание на дополнительные кавычки и отдельные наборы скобок вокруг каждого отдельного теста и использование традиционного =
оператора, а не ==
варианта ksh / bash / zsh ):
if [ "$varA" = 1 ] && { [ "$varB" = "t1" ] || [ "$varC" = "t2" ]; }; then