Перейти до змісту

Bash - Умовні структури if і case


Цілі: В цьому розділі ви дізнаєтеся як:

✔ використовувати умовний синтаксис if;
✔ використовувати умовний синтаксис case;

🏁 linux, сценарій, bash, умовні структури

Знання: ⭐ ⭐
Складність: ⭐ ⭐ ⭐

Час читання: 20 хвилин


Умовні конструкції

Якщо змінна $? використовується для отримання результатів перевірки або виконання команди, її можна лише відобразити та це не буде мати жодного впливу на виконання сценарію.

Але ми можемо використовувати її в умові. Якщо тест хороший то я виконую цю дію в іншому випадку я виконаю іншу дію.

Синтаксис умовної альтернативи if:

if command
then
    command if $?=0
else
    command if $?!=0
fi

Команда, розміщена після слова if, може бути будь-якою командою, оскільки її код повернення ($?) буде оцінюватися. Часто зручно використовувати команду test, щоб визначити кілька дій залежно від результату цього тесту (файл існує, змінна не порожня, налаштовано права запису).

Використання класичної команди (mkdir, tar, ...) дозволяє визначити дії, які мають бути виконані в разі успіху, або повідомлення про помилки, які відображатимуться у випадку невдачі.

Приклади:

if [[ -e /etc/passwd ]]
then
    echo "The file exists"
else
    echo "The file does not exist"
fi

if mkdir rep
then
    cd rep
fi

Якщо блок else починається з нової структури if, ви можете об’єднати else та if з elif, як показано нижче:

[...]
else
  if [[ -e /etc/ ]]
[...]

[...]
# is equivalent to
elif [[ -e /etc ]]
[...]

Резюме

Структура if / then / else / fi обчислює команду, розміщену після if:

  • Якщо код повернення цієї команди дорівнює 0 (true), оболонка виконає команди, розміщені після then;
  • Якщо код повернення відрізняється від 0 (false), оболонка виконає команди, розміщені після else.

Блок else необов'язковий.

Часто виникає потреба виконати деякі дії, лише якщо оцінка команди істинна, і не робити нічого, якщо вона хибна.

Слово fi закриває структуру.

Якщо в блоці then потрібно виконати лише одну команду, можна використовувати простіший синтаксис.

Команда для виконання, якщо $? має значення true, розміщується після &&, а команда для виконання, якщо $? є false розміщується після || (необов’язково).

Приклад:

[[ -e /etc/passwd ]] && echo "The file exists" || echo "The file does not exist"
mkdir dir && echo "The directory is created".

Також можна оцінити та замінити змінну з легшою структурою, ніж if.

Цей синтаксис реалізує дужки:

  • Відображає значення заміни, якщо змінна порожня:

    ${variable:-value}
    
  • Відображає значення заміни, якщо змінна не порожня:

    ${variable:+value}
    
  • Призначає нове значення змінній, якщо вона порожня:

    ${variable:=value}
    

Приклади:

name=""
echo ${name:-linux}
linux
echo $name

echo ${name:=linux}
linux
echo $name
linux
echo ${name:+tux}
tux
echo $name
linux

Підказка

Приймаючи рішення про використання if, then, else, fi АБО використання описаних простіших прикладів синтаксису, майте на увазі читабельність вашого сценарію. Якщо ніхто не збирається використовувати сценарій, крім вас самих, тоді ви можете скористатися тим, що вам найкраще підходить. Якщо комусь ще може знадобитися переглянути, налагодити або відстежити сценарій, який ви створюєте, скористайтеся більш самодокументованою формою («якщо», «тоді» тощо) або переконайтеся, що ви ретельно задокументували свій сценарій, щоб простіший синтаксис насправді зрозумілий тим, кому може знадобитися змінити та використовувати сценарій. У будь-якому випадку документування сценарію завжди корисно робити, як кілька разів зазначалося в цих уроках.

Альтернативна умова: структура case

Послідовність структур if може швидко стати важкою та складною. Коли мова йде про оцінку однієї і тієї ж змінної, можна використовувати умовну структуру з кількома гілками. Значення змінної можуть бути вказані або належати до списку можливостей.

Можна використовувати символи підстановки.

Структура case ... in / esac обчислює змінну, розміщену після case, і порівнює її з визначеними значеннями.

При першій знайденій рівності виконуються команди, розміщені між ) і ;;.

Оцінена змінна та запропоновані значення можуть бути рядками або результатами підвиконання команд.

Розміщений у кінці структури вибір * вказує на дії, які потрібно виконати для всіх значень, які раніше не перевірялися.

Синтаксис умовного альтернативного випадку:

case $variable in
  value1)
    commands if $variable = value1
    ;;
  value2)
    commands if $variable = value2
    ;;
  [..]
  *)
    commands for all values of $variable != of value1 and value2
    ;;
esac

Якщо значення може змінюватися, радимо використовувати символи підстановки [], щоб указати можливості:

[Yy][Ee][Ss])
  echo "yes"
  ;;

Символ | також дозволяє вказати значення чи інше:

"yes" | "YES")
  echo "yes"
  ;;

Author: Antoine Le Morvan

Contributors: Steven Spencer, Ganna Zhyrnova