То, что вы написали, на самом деле почти работает (оно работало бы, если бы все переменные были числами), но это совсем не идиоматический способ.
(…)
круглые скобки указывают подоболочка .То, что внутри них, не является выражением, как во многих других языках.Это список команд (как и в скобках).Эти команды выполняются в отдельном подпроцессе, поэтому любое перенаправление, присваивание и т. Д., Выполняемые внутри скобок, не влияют за пределы скобок. - С начальным знаком доллара
$(…)
является подстановкой команды : в скобках есть команда, а вывод команды используется как часть командной строки (последополнительные расширения, если подстановка не заключена в двойные кавычки, но это другая история ).
{ … }
фигурные скобки подобны скобкам в том, что они группируют команды, но они толькоВлияние парсинга, а не группировки.Программа 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
Если вам нужна переносимость на другие оболочки,это будет путь (обратите внимание на дополнительные цитаты и отдельные наборы скобок вокруг каждого отдельного теста):
if [ "$varA" = 1 ] && { [ "$varB" = "t1" ] || [ "$varC" = "t2" ]; }; then