Поиск по сайту:

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


Резюме. Используйте оператор Linux Bash if для создания условных выражений со структурой if then fi . Добавьте ключевые слова elif для дополнительных условных выражений или ключевое слово else, чтобы определить общий раздел кода, который выполняется, если предыдущее условное предложение не выполнялось.

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

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

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

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

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

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

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

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

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

if [ this-condition-is-true ]
then
  execute-these-statements
fi

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

if [ this-condition-is-true ]; then
  execute-these-statements
fi

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

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

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

if [ this-condition-is-true ]
then
  execute-these-statements
else
  execute-these-statements-instead
fi

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

#!/bin/bash

customer_age=25

if [ $customer_age -ge 21 ]
then
  echo "Come on in."
else
  echo "You can't come in."
fi

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

chmod +x if-age.sh

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

./if-age.sh

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

customer_age=18

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

./if-age.sh

Элиф пункт

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

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

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

#!/bin/bash

echo -n "Enter a number: "

read number

if [ $number -eq 0 ]
then
  echo "You entered zero. Zero is an even number."
elif [ $(($number % 2)) -eq 0 ]
then
  echo "You entered $number. It is an even number."
else
  echo "You entered $number. It is an odd number."
fi

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

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

./if-even.sh

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

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

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

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

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

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

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

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

test "this string" = "this string"
test "this string" = "that string"
test 1 = 001
test 1 -eq 001

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

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

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

#!/bin/bash

if [[ $USER == *ve ]]
then
  echo "Hello $USER"
else
  echo "$USER does not end in 've'"
fi

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

./if-wild.sh

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

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

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

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

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

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

#!/bin/bash

# get the day as a number 1..7
day=$(date +"%u")

if [ $day -le 6 ]
then
  ## the shop is open
  if [ $day -eq 3 ]
  then
    # Wednesday is half-day
    echo "On Wednesdays we open in the morning only."
  else
    # regular week days and Saturday
   echo "We're open all day."
  fi
else
  # not open on Sundays
  echo "It's Sunday, we're closed."
fi

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

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

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

Случай Если

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

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