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