Те, що ви написали, насправді майже працює (працювало б, якби всі змінні були числами), але це зовсім не ідіоматичний спосіб.
(…)
в круглих дужках вказується на нижню частину . Те, що знаходиться всередині них, не є виразом, як у багатьох інших мовах. Це список команд (подібно до зовнішніх дужок). Ці команди виконуються в окремому підпроцесі, тому будь-яке перенаправлення, призначення тощо, що виконуються всередині дужок, не має ефекту поза дужками.
- З провідним знаком долара
$(…)
- це підміна команд : всередині дужок є команда, а вихід з команди використовується як частина командного рядка (після додаткових розширень, якщо заміна не знаходиться між подвійними лапками, але це вже інша історія ) .
{ … }
дужки схожі на дужки в тому, що вони групують команди, але вони впливають лише на аналіз, а не на групування. Програма 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]]
).
[ … ]
одинарні дужки - це альтернативна форма умовних виразів з більшою кількістю примх (але старших і більш портативних). Не пишіть жодної зараз; почніть турбуватися про них, коли знайдете сценарії, які їх містять.
Це ідіоматичний спосіб написання тесту на баш:
if [[ $varA == 1 && ($varB == "t1" || $varC == "t2") ]]; then
Якщо вам потрібна портативність до інших оболонок, це був би спосіб (зверніть увагу на додаткове котирування та окремі набори дужок навколо кожного окремого тесту та використання традиційного =
оператора, а не ==
варіанту ksh / bash / zsh ):
if [ "$varA" = 1 ] && { [ "$varB" = "t1" ] || [ "$varC" = "t2" ]; }; then