Как использовать операторы Bash If (с 4 примерами)

Опубликовано: 2023-05-08
Ноутбук с Linux, показывающий окно терминала с рисунком земного шара на заднем плане и двоичным водяным знаком
Фатмавати Ачмад Заэнури/Shutterstock
Используйте оператор Linux Bash if для создания условных выражений со структурой if then fi . Добавьте ключевые слова elif для дополнительных условных выражений или ключевое слово else , чтобы определить универсальный раздел кода, который выполняется, если предыдущее условное предложение не выполнялось.

Все нетривиальные скрипты Bash должны принимать решения. Оператор Bash if позволяет сценарию Linux задавать вопросы и, в зависимости от ответа, запускать разные участки кода. Вот как они работают.

Что такое условное выполнение?

Во всех сценариях Bash, кроме самых тривиальных, обычно требуется, чтобы поток выполнения проходил по другому пути через сценарий в зависимости от результата решения. Это называется условным выполнением.

Один из способов решить, какую ветвь выполнения выбрать, — это использовать оператор if . Вы можете услышать операторы if , вызываемые операторами if then или операторами if then else . Это разные названия одного и того же.

9 примеров циклов for в скриптах Linux Bash
СВЯЗАННЫЕ 9 Примеры циклов for в скриптах Linux Bash

Оператор if говорит, что если что-то истинно, то сделайте это . Но если что-то ложно, сделайте это вместо этого. «Что-то» может быть многими вещами, такими как значение переменной, наличие файла или совпадение двух строк.

Условное выполнение жизненно важно для любого осмысленного сценария. Без него вы очень ограничены в том, что вы можете сделать со своим сценарием. Если он не сможет принимать осмысленные решения, вы не сможете браться за реальные проблемы и вырабатывать действенные решения.

Оператор if вероятно, является наиболее часто используемым средством получения условного выполнения. Вот как использовать его в сценариях Bash.

СВЯЗАННЫЕ С: Как проверить, существует ли файл в сценариях Linux Bash

Пример простого оператора if

Это каноническая форма простейшего оператора if :

 если [это условие истинно]
затем
  выполнить-эти-операторы
фи

Если условие в тексте принимает значение true, выполняются строки сценария в предложении then . Если вы просматриваете сценарии, написанные другими, вы можете увидеть оператор if , написанный следующим образом:

 если [это условие истинно]; затем
  выполнить-эти-операторы
фи

Некоторые моменты, на которые следует обратить внимание:

  • Оператор if завершается записью fi .
  • После первой скобки « [ » и перед второй скобкой « ] » условного теста должен быть пробел.
  • Если вы собираетесь поместить ключевое слово then в ту же строку, что и условный тест, убедитесь, что вы используете точку с запятой » ; "после испытания.

Мы можем добавить необязательное предложение else , чтобы выполнить некоторый код, если проверка условия окажется ложной. Предложение else не нуждается в ключевом слове then .

 если [это условие истинно]
затем
  выполнить-эти-операторы
еще
  выполнить-эти-заявления-вместо
фи

В этом сценарии показан простой пример оператора if , в котором используется предложение else . Условный тест проверяет, больше ли возраст клиента или равен 21 году. Если это так, покупатель может войти в помещение, и выполняется условие then . Если они недостаточно старые, выполняется предложение else , и они не допускаются.

 #!/бин/баш

клиент_возраст = 25

если [ $customer_age -ge 21 ]
затем
  Эхо "Заходи".
еще
  echo "Вы не можете войти."
фи

Скопируйте приведенный выше сценарий в редактор, сохраните его как файл с именем «if-age.sh» и используйте команду chmod , чтобы сделать его исполняемым. Вам нужно будет сделать это с каждым из сценариев, которые мы обсуждаем.

 chmod +x if-age.sh 

Использование chmod, чтобы сделать скрипт исполняемым

Запустим наш скрипт.

 ./if-age.sh 

Запуск сценария if-age.sh с переменной age, установленной на 25

Теперь мы отредактируем файл и используем возраст меньше 21 года.

 клиент_возраст = 18

Внесите это изменение в свой сценарий и сохраните изменения. Если мы запустим его сейчас, условие вернет false, и предложение else будет выполнено.

 ./if-age.sh 

Запуск сценария if-age.sh с переменной age, установленной на 18

Элиф пункт

Предложение elif добавляет дополнительные условные тесты. У вас может быть столько предложений elif , сколько вам нужно. Они оцениваются по очереди, пока одно из них не окажется верным. Если ни один из условных тестов elif не оказывается истинным, выполняется предложение else , если оно присутствует.

Этот скрипт запрашивает число, а затем сообщает, четное оно или нечетное. Ноль — четное число, поэтому нам не нужно ничего проверять.

Все остальные числа проверяются путем нахождения модуля деления на два. В нашем случае модуль — это дробная часть результата деления на два. Если дробной части нет, то число делится ровно на два. Следовательно, это четное число.

 #!/бин/баш

echo -n "Введите число: "

читать номер

если [$number -eq 0]
затем
  echo "Вы ввели ноль. Ноль - четное число."
Элиф [$(($число % 2)) -eq 0 ]
затем
  echo "Вы ввели $number. Это четное число."
еще
  echo "Вы ввели $number. Это нечетное число."
фи

Чтобы запустить этот скрипт, скопируйте его в редактор и сохраните как «if-even.sh», а затем используйте chmod, чтобы сделать его исполняемым.

Давайте запустим скрипт несколько раз и проверим его вывод.

 ./если-даже.ш 

Запуск сценария if-even.sh с различными входными данными

Это все работает нормально.

Различные формы условного теста

Скобки « [] », которые мы использовали для наших условных тестов, — это сокращенный способ вызова test программы. Из-за этого все сравнения и тесты, поддерживаемые test , доступны для вашего оператора if .

Это лишь некоторые из них:

  • ! выражение : Истина, если выражение ложно.
  • -n строка : Истинно, если длина строки больше нуля.
  • -z строка : Истинно, если длина строки равна нулю. То есть это пустая строка.
  • строка1 = строка2 : Истинно, если строка1 совпадает со строкой2.
  • строка1 != строка2 : Истинно, если строка1 не совпадает со строкой2.
  • integer1 -eq integer2 : Истинно, если integer1 численно равно integer2
  • integer1 -qt integer2 : Истинно, если integer1 численно больше, чем integer2
  • integer1 -lt integer2 : Истинно, если integer1 численно меньше, чем integer2
  • -d каталог : Истинно, если каталог существует.
  • -e файл : Истинно, если файл существует.
  • -s файл : Истинно, если файл существует с размером больше нуля.
  • -r файл : Истинно, если файл существует и установлено разрешение на чтение.
  • -w файл : Истинно, если файл существует и установлено разрешение на запись.
  • -x файл : Истинно, если файл существует и установлено разрешение на выполнение.

В таблице «файл» и «каталог» могут включать относительные или абсолютные пути к каталогам.

Знак равенства « = » и проверка на равенство -eq — это не одно и то же. Знак равенства выполняет посимвольное сравнение текста. Тест на равенство выполняет численное сравнение.

Мы можем увидеть это, используя test программу в командной строке.

 тест "эта строка" = "эта строка"
 проверить "эта строка" = "эта строка"
 тест 1 = 001
 тест 1 -eq 001

В каждом случае мы используем команду echo для вывода кода возврата последней команды. Ноль означает истину, единицу — ложь.

Использование тестовой программы в командной строке для проверки различных сравнений

Использование знака равенства « = » дает нам ложный ответ, сравнивающий 1 с 001. Это правильно, потому что это две разные строки символов. Численно они имеют одно и то же значение — единицу, — поэтому оператор -eq возвращает истинный ответ.

Если вы хотите использовать сопоставление с подстановочными знаками в своем условном тесте, используйте синтаксис двойной скобки « [[ ]] ».

 #!/бин/баш

если [[ $USER == *ve ]]
затем
  эхо "Привет, $USER"
еще
  echo "$USER не заканчивается на "ve""
фи

Этот скрипт проверяет имя учетной записи текущего пользователя. Если он заканчивается на « ve », он печатает имя пользователя. Если он не заканчивается на « ve », сценарий сообщит вам об этом и завершит работу.

 ./if-wild.sh 

Запуск сценария if-wild.sh, показывающего поиск по подстановочным знакам в условной проверке оператора if.

СВЯЗАННЫЕ: Условное тестирование в Bash: если, то, иначе, elif

Вложенные операторы if

Вы можете поместить оператор if внутрь другого оператора if .

Это вполне приемлемо, но вложенность операторов if делает код менее удобным для чтения и более трудным для сопровождения. Если вы обнаружите, что вкладываете более двух или трех уровней операторов if , вам, вероятно, потребуется реорганизовать логику вашего сценария.

Вот скрипт, который получает день в виде числа от одного до семи. Один — понедельник, семь — воскресенье.

Он сообщает нам часы работы магазина. Если это будний день или суббота, он сообщает, что магазин открыт. Если это воскресенье, он сообщает, что магазин закрыт.

Если магазин открыт, вложенный оператор if выполняет вторую проверку. Если сегодня среда, это говорит нам, что он открыт только утром.

 #!/бин/баш

# получить день в виде числа 1..7
день=$(дата +"%u")

если [ $день -le 6 ]
затем
  ## магазин открыт
  если [ $день -eq 3 ]
  затем
    # Среда - полдня
    echo "По средам мы работаем только утром."
  еще
    # обычные дни недели и суббота
   echo "Мы открыты весь день."
  фи
еще
  # не работает по воскресеньям
  echo "Сегодня воскресенье, мы закрыты."
фи

Скопируйте этот скрипт в редактор, сохраните его как файл с именем «if-shop.sh» и сделайте его исполняемым с помощью команды chmod .

Мы запустили сценарий один раз, а затем изменили часы компьютера на среду и повторно запустили сценарий. Затем мы изменили день на воскресенье и запустили его еще раз.

 ./if-shop.sh
 ./if-shop.sh
 ./if-shop.sh 

Запуск сценария if-shop.sh с компьютерными часами, установленными на будний день, затем на среду, затем на воскресенье

СВЯЗАННЫЕ С: Как использовать условные тесты с двойными скобками в Linux

Случай Если

Условное выполнение — это то, что делает программирование и сценарии более мощными, а скромный оператор if вполне может быть наиболее часто используемым способом переключения пути выполнения в коде. Но это не значит, что это всегда ответ.

Написание хорошего кода означает знание того, какие варианты у вас есть и какие из них лучше всего использовать для решения конкретного требования. Оператор if великолепен, но не позволяйте ему быть единственным инструментом в вашей сумке. В частности, ознакомьтесь с оператором case , который может быть решением в некоторых сценариях.

СВЯЗАННЫЕ С: Как использовать операторы case в сценариях Bash