Сценарии оболочки · 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

Оператор switch в linux

Заключение

Оболочка bash предоставляет много полезных инструментов для программистов. Как и большинство языков программирования сегодня, она также способна принимать условные решения, что делает сценарии оболочки более интерактивными и умными. В следующей серии мы рассмотрим структуры управления повторениями. До следующего раза.

Ссылки

Следующий урок: Структуры управления повторениями

Share: X/Twitter LinkedIn

Get new posts in your inbox

No spam. Unsubscribe anytime.