Предыдущий урок: bash скрипты для начинающих — урок №3: Арифметические операции.
Скрипты могут быть как простыми и короткими, так и комплексными со сложной структурой. Чем сложнее скрипт, тем скорее нам понадобится варьировать ход исполнения скрипта с помощью условий.
Зачем нужны условия if else?
Принятие решений: Скрипт проверяет, выполняется ли какое-то условие (например, есть ли файл, число больше или меньше), и выбирает правильное действие на основе этого.
Автоматизация логики: Благодаря условиям можно автоматизировать ветвления — например, если определённая настройка включена, выполнится один набор команд, а если нет — другой.
Обработка ошибок и ситуаций: Скрипт может проверить, всё ли правильно, и при необходимости вывести сообщение или остановить выполнение.
Создание более гибких сценариев: В условных конструкциях можно реализовать сложные логические цепочки, делая скрипт умнее и адаптивнее к разным ситуациям.
Контроль потоков выполнения: Условия позволяют управлять порядком выполнения команд, делая поведение скрипта динамическим и управляемым.
Использование if else условий.
Создадим новый файл для сегодняшнего урока:
[root@waky bash_practice]# touch script_4.sh
[root@waky bash_practice]# chmod +x script_4.sh
[root@waky bash_practice]#
Шаг 1: Используем if
Запишем в файл script_4.sh следующий код:
#!/bin/bash
name="John Doe"
age=33
exist_file=/etc/os-release
not_exist_file=/etc/not_exist_file.txt
echo "Condition 1:"
if [ $name == "John Doe" ]; then
echo "Hello, $name"
fi
echo "Condition 2:"
if [ "$name" == "John Doe" ]; then
echo "Hello, $name"
fi
echo "Condition 3:"
if [ $age -eq 33 ]; then
echo "$age is equal 33."
fi
echo "Condition 4:"
if [ ! $age -eq 33 ]; then
echo "$age is NOT equal 33."
fi
echo "Condition 5:"
if [ $age -gt 30 ]; then
echo "$age greater than 30"
fi
echo "Condition 6:"
if [ $age -ge 30 ]; then
echo "$age greater or equal 30"
fi
echo "Condition 7:"
if [ -f $exist_file ]; then
echo "$exist_file exists"
fi
echo "Condition 8:"
if [ -f $not_exist_file ]; then
echo "$not_exist_file exists"
fi
Запустим скрипт и проанализируем результат:
[root@waky bash_practice]# ./script_4.sh
Condition 1:
./script_4.sh: line 10: [: too many arguments
Condition 2:
Hello, John Doe
Condition 3:
33 is equal 33.
Condition 4:
Condition 5:
33 greater than 30
Condition 6:
33 greater or equal 30
Condition 7:
/etc/os-release exists
Condition 8:
[root@waky bash_practice]#
Первое условие закончилось ошибкой, это связано с тем, что переменная name состоит из двух слов, и когда переменная преобразуется внутри условия if, каждое слово расценивается как отдельное значение. Отсюда и ошибка too many arguments, переменную надо заключить в кавычки, как это сделано во втором условии, тогда ее содержимое будет рассматриваться как единое целое.
Условия 2, 3, 5, 6 и 7 — верны, потому что имя равно (==) John Doe, 33 равно (—eq) 33, 33 больше чем (—gt) 30, 33 больше либо равно (—ge) 30, а файл /etc/os-release существует (—f).
Условия 4 и 8 — ложны. В 4 условии восклицательный знак (!) перед условием означает обратное условие — не равно 33. С 8 условием все проще, файл не существует, соответственно и результат отрицательный.
Шаг 2: Добавляем else
Отдельные условия if используются не часто, обычно, если условие оказалось ложно это такой же повод для действия, как и правдивое условие. Для этого используется конструкция if else где вторая часть описывает действие, которое нужно предпринять если условие не выполнено.
Перепишем наш скрипт следующим образом:
#!/bin/bash
name="James Bond"
age=55
exist_file=/etc/os-release
not_exist_file=/etc/not_exist_file.txt
echo "Condition 1:"
if [ "$name" == "John Doe" ]; then
echo "Hello, $name"
else
echo "I don't know you, $name"
fi
echo "Condition 2:"
if [ $age -eq 33 ]; then
echo "$age is equal 33."
elif [ $age -lt 33 ]; then
echo "$age lesser than 33."
else
echo "$age greater than 33."
fi
echo "Condition 3:"
if [ -f $not_exist_file ]; then
echo "$not_exist_file exists"
else
echo "$not_exist_file NOT exists"
fi
Запустим скрипт еще раз и проверим результат:
[root@waky bash_practice]# ./script_4.sh
Condition 1:
I don't know you, James Bond
Condition 2:
55 greater than 33.
Condition 3:
/etc/not_exist_file.txt NOT exists
[root@waky bash_practice]#
В этот раз все условия вернули какой либо результат. В этом и смысл else, с его помощью мы задаем действие, на случай если никакое условие в if не правда. Так же обратите внимание, что во втором условии мы использовали условие elif. Оно содержит дополнительную проверку и реакцию, на случай если первая проверка закончилась ложным итогом.
Имейте ввиду, что последовательность условий в if elif имеет значение для логики скрипта. Условия проверяются последовательно, до первого совпадения, и в случае если текущее условие верно, то следующие проверки и реакции отбрасываются.
Проверим это на простом примере. Снова перепишем скрипт:
#!/bin/bash
age=55
if [ $age -gt 100 ]; then
echo "$age greater than 100"
elif [ $age -gt 50 ]; then
echo "$age greater than 50"
elif [ $age -gt 30 ]; then
echo "$age greater than 30"
else
echo "$age NOT greater than 30"
fi
if [ $age -gt 30 ]; then
echo "$age greater than 30"
elif [ $age -gt 40 ]; then
echo "$age greater than 40"
elif [ $age -gt 50 ]; then
echo "$age greater than 50"
else
echo "$age NOT greater than 30"
fi
Проверим результат выполнения скрипта:
[root@waky bash_practice]# ./script_4.sh
55 greater than 50
55 greater than 30
[root@waky bash_practice]#
В обоих случаях скрипт дошел до первого правдивого условия. При этом во втором случае были отброшены более близкие к переменной значения 40 и 50. Скрипт все сделал правильно, 55 больше 30, но из-за того, что мы в условиях выбрали не правильный порядок сравнений, мы получили менее точный результат.
Если вы составляете множественное условие, чтобы определить какому диапазону принадлежит переменная, располагайте условия по возрастанию аргумента в случае условия меньше чем, и по убыванию в случае условия больше чем.
Итоги:
Мы научились использовать условия if else. Разобрали несколько примеров и подметили, как порядок условий может влиять на результат. Прежде чем двигаться дальше, попробуйте сами поиграться с условиями, чтобы лучше понять их структуру и логику.
Следующий урок: в процессе