Сценарии оболочки · 7 min read · Nov 13, 2025
Часть 3: Структуры управления решениями в сценариях оболочки
Привет! Мы уже рассмотрели основы сценариев оболочки, такие как прием входных данных, обработка данных с помощью арифметических операций и генерация и отображение вывода в предыдущих частях этого учебника (часть 1 и часть 2). В этой части мы углубимся в более продвинутую тему в языке программирования — принятие решений в программе, но на этот раз мы сделаем это с помощью оболочки bash. Давайте начнем!
Введение
Большинство наших языков программирования сегодня способны принимать решения на основе условий, которые мы задаем. Условие — это выражение, которое оценивается в логическое значение — истина или ложь. Любой программист может сделать свою программу умной на основе решений и логики, которые он вкладывает в свою программу. Оболочка bash поддерживает операторы принятия решений if и switch (case).
Оператор if
If — это оператор, который позволяет программисту принимать решение в программе на основе заданных условий. Если условие выполнено, программа выполнит определенные строки кода, в противном случае программа выполнит другие задачи, которые указал программист. Следующий синтаксис поддерживается оператором if в оболочке bash.
Общий синтаксис
Единичное решение:
if
then
### серия кода идет сюда
fi Двойное решение:
if
then
### серия кода, если условие выполнено
else
### серия кода, если условие не выполнено
fi Несколько условий if:
if
then
### серия кода для condition1
elif
then
### серия кода для condition2
else
### серия кода, если условие не выполнено
fi Синтаксис с одинарными скобками
if [ condition ]
then
### серия кода идет сюда
fiСинтаксис с двойными скобками
if ((condition))
then
### серия кода идет сюда
fiСинтаксис с одинарными скобками является самым старым поддерживаемым синтаксисом в оболочке bash. Он используется вместе со всеми условными операторами в Linux. Тем временем, синтаксис с двойными скобками используется для условных операторов на основе чисел, чтобы предоставить знакомый синтаксис программистам. Все типы операторов if требуют заданного условия для выполнения задачи.
Условные операторы в Linux
Условные операторы используются вместе с оператором управления решениями. Существует несколько типов условных операторов, которые вы можете использовать в оболочке bash, наиболее распространенные из которых: основанные на файлах, строках и арифметике.
Условие на основе файла
Условия на основе файлов являются унарными выражениями и часто используются для проверки статуса файла. Следующий список показывает наиболее часто используемые условия на основе файлов в оболочке bash.
| Оператор | Описание |
| -a file | Возвращает true, если файл существует |
| -b file | Возвращает true, если файл существует и является специальным блочным файлом |
| -c file | Возвращает true, если файл существует и является специальным символьным файлом |
| -d file | Возвращает true, если файл существует и является директорией |
| -e file | Возвращает true, если файл существует |
| -r file | Возвращает true, если файл существует и доступен для чтения |
| -s file | Возвращает true, если файл существует и имеет размер больше нуля |
| -w file | Возвращает true, если файл существует и доступен для записи |
| -x file | Возвращает true, если файл существует и исполняем |
| -N file | Возвращает true, если файл существует и был изменен с момента последнего чтения |
Принятие решения на основе файла
Давайте рассмотрим пример, который проиллюстрирует, как построить решение на основе файла в сценарии bash. В этом примере мы создадим сценарий, который определяет, существует ли файл в домашнем каталоге.
#!/bin/bash
cd
ls
if [ -e sample.sh ]
then
echo "файл существует!"
else
echo "файл не существует"
fi
В этом примере мы убедились, что оболочка вернется в домашний каталог, независимо от нашего текущего активного каталога, используя команду cd. Кроме того, команда ls используется для отображения списка файлов в каталоге, чтобы мы могли проверить, действительно ли файл существует или нет. Как вы можете видеть, сценарий выводит текст “файл существует!”, потому что sample.sh находится в домашнем каталоге.
Примечание: Компилятор оболочки очень строг в отношении синтаксиса, особенно с пробелами. Должен быть пробел между if и открывающей скобкой, а также между скобками и условием.Теперь давайте улучшим наш сценарий, сделав наш код более динамичным, позволяя пользователю вводить имя сценария и определять разрешения данного файла.
#!/bin/bash
cd
ls -l
read -p "Введите имя файла: " filename
if [ -e $filename ]
then
echo "файл существует!"
if [ -r $filename ]
then
status="читаемый "
fi
if [ -w $filename ]
then
status=$status"записываемый "
fi
if [ -x $filename ]
then
status=$status"исполняемый"
fi
echo "разрешение файла: "$status
else
echo "файл не существует"
fi
Условие на основе строки
Принятие решений на основе строкового ввода пользователя также возможно в оболочке bash. Условие на основе строки возвращает бинарное выражение в качестве результата, что означает, что оно возвращает true, если заданное условие выполнено, в противном случае оно возвращает false. Следующие операторы условных операторов на основе строк часто используются:
| Оператор | Описание |
| == | Возвращает true, если строки равны |
| != | Возвращает true, если строки не равны |
| -n | Возвращает true, если строка, которую нужно протестировать, не пуста |
| -z | Возвращает true, если строка, которую нужно протестировать, пуста |
Давайте создадим пример сценария, используя условный оператор на основе строки. Сценарий позволит пользователю ввести две строки и оценить, является ли одна из строк пустой, обе строки равны или не равны.
#!/bin/bash
read -p "Первая строка: " str1
read -p "Вторая строка: " str2
if [ -z "$str1" ]
then
echo "1-я строка пуста"
elif [ -z "$str2" ]
then
echo "2-я строка пуста"
else
if [ $str1 == $str2 ]
then
echo "Строки равны"
else
echo "Строки не равны"
fi
fi
Условие на основе арифметики
Оболочка предоставляет несколько способов объявления условия на основе арифметики. Первый — это использование мнемоник, которые могут использоваться вместе со старым синтаксисом с одинарными скобками, а другой — использование символов, удобных для математики, которые могут использоваться вместе с двойными скобками.
Ниже приведен список доступных мнемоник для условных операторов на основе арифметики в оболочке:
| Оператор | Использование/Описание |
| -eq | Равно |
| -ge | Больше или равно |
| -gt | Больше |
| -le | Меньше или равно |
| -lt | Меньше |
| -ne | Не равно |
Давайте создадим сценарий, который принимает целое число от пользователя и определяет, является ли это целое число нулем, отрицательным, нечетным или четным числом.
#!/bin/bash
read -p "Введите целое число: " int1
if [ $int1 -eq 0 ]
then
echo "Ноль"
elif [ $int1 -lt 0 ]
then
echo "Отрицательное"
else
if [ $((int1%2)) -eq 0 ]
then
echo "Четное"
else
echo "Нечетное"
fi
fi
Арифметический оператор для синтаксиса с двойными скобками:
| Оператор | Использование/Описание |
| == | Равно |
| >= | Больше или равно |
| > | Больше |
| <= | Меньше или равно |
| < | Меньше |
| != | Не равно |
Теперь давайте перестроим наш предыдущий сценарий и используем синтаксис с двойными скобками:
#!/bin/bash
read -p "Введите целое число: " int1
if (( $int1 == 0 ))
then
echo "Ноль"
elif (( $int1 < 0 ))
then
echo "Отрицательное"
else
if (( $((int1%2)) == 0 ))
then
echo "Четное"
else
echo "Нечетное"
fi
fi
Оператор switch
Оператор switch — это еще один вид условного оператора в сценариях оболочки. Он позволяет программисту сравнивать несколько значений с переменной более простым способом по сравнению с условным оператором if. Синтаксис для оператора switch:
case in
)
##серия кода для pattern1
;;
)
##серия кода для pattern2
;;
)
##серия кода для patternN
;;
*)
##стандартные операторы
esac
Шаблон — это возможное значение переменной. Каждый шаблон разделен двойной точкой с запятой, которая служит оператором прерывания шаблона. Оператор switch закрывается оператором esac.
#!/bin/bash
clear
read -p "Целое число1: " int1
read -p "Целое число2: " int2
echo "======================"
printf "Меню: \n[a] Сложение\n[b]Вычитание\n[c]Умножение\n[d]Деление\n"
echo "======================"
read -p "Ваш выбор: " choice
res=0
case $choice in
a)
res=$((int1+int2))
;;
b)
res=$((int1-int2))
;;
c)
res=$((int1*int2))
;;
d)
res=$((int1/int2))
;;
*)
echo "Недопустимый ввод"
esac
echo "Результат: " $res
Заключение
Оболочка bash предоставляет много полезных инструментов для программистов. Как и большинство языков программирования сегодня, она также способна принимать условные решения, что делает сценарии оболочки более интерактивными и умными. В следующей серии мы рассмотрим структуры управления повторениями. До следующего раза.
Ссылки
- http://www.gnu.org/software/bash/manual/html_node/Bash-Conditional-Expressions.html
- https://linuxacademy.com/blog/linux/conditions-in-bash-scripting-if-statements/
Следующий урок: Структуры управления повторениями
Get new posts in your inbox
No spam. Unsubscribe anytime.