Якщо змінна $? використовується для отримання результатів перевірки або виконання команди, її можна лише відобразити та це не буде мати жодного впливу на виконання сценарію.
Але ми можемо використовувати її в умові. Якщо тест хороший то я виконую цю дію в іншому випадку я виконаю іншу дію.
Синтаксис умовної альтернативи 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 АБО використання описаних простіших прикладів синтаксису, майте на увазі читабельність вашого сценарію. Якщо ніхто не збирається використовувати сценарій, крім вас самих, тоді ви можете скористатися тим, що вам найкраще підходить. Якщо комусь ще може знадобитися переглянути, налагодити або відстежити сценарій, який ви створюєте, скористайтеся більш самодокументованою формою («якщо», «тоді» тощо) або переконайтеся, що ви ретельно задокументували свій сценарій, щоб простіший синтаксис насправді зрозумілий тим, кому може знадобитися змінити та використовувати сценарій. У будь-якому випадку документування сценарію завжди корисно робити, як кілька разів зазначалося в цих уроках.
Послідовність структур 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
Якщо значення може змінюватися, радимо використовувати символи підстановки [], щоб указати можливості: