Те, що ви написали, насправді майже працює (працювало б, якби всі змінні були числами), але це зовсім не ідіоматичний спосіб.
(…)в круглих дужках вказується на нижню частину . Те, що знаходиться всередині них, не є виразом, як у багатьох інших мовах. Це список команд (подібно до зовнішніх дужок). Ці команди виконуються в окремому підпроцесі, тому будь-яке перенаправлення, призначення тощо, що виконуються всередині дужок, не має ефекту поза дужками.
- З провідним знаком долара
$(…)- це підміна команд : всередині дужок є команда, а вихід з команди використовується як частина командного рядка (після додаткових розширень, якщо заміна не знаходиться між подвійними лапками, але це вже інша історія ) .
{ … }дужки схожі на дужки в тому, що вони групують команди, але вони впливають лише на аналіз, а не на групування. Програма 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