If, else, case в Bash

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

If утверждения (и, тесно связанные, case ) позволяют нам принимать решения в наших сценариях Bash. Они позволяют нам решить, следует ли запускать часть кода на основе условий, которые мы можем установить. Если утверждения, объединенные с циклами (которые мы рассмотрим в следующем уроке), позволят нам создавать гораздо более сложные сценарии, которые могут решить более крупные задачи.

Основные положения

Базовый оператор if эффективно говорит, что если конкретный тест верен, тогда выполните заданный набор действий. Если это не так, не выполняйте эти действия. Если следующий формат:

if [ <некоторый тест> ]
then
<команды>
fi

Все , что между then и fi (если в обратном направлении) будет выполняться только если тест (в квадратных скобках) истинно.

Давайте рассмотрим простой пример:

if_example.sh

#!/bin/bash
# Базовый оператор if

if [ $1 -gt 100 ]
then
echo Hey that\'s a large number.
pwd
fi

date

Давайте разберем это:

  • Строка 4 - Посмотрим, больше ли первый аргумент командной строки, чем 100
  • Строка 6 и 7 - будет запущена, только если тест в строке 4 вернется. У вас может быть так много команд здесь, как вам нравится.
  • Строка 6 - обратная косая черта (\) перед одиночной кавычкой (') необходима, поскольку одинарная кавычка имеет особое значение для bash, и мы не хотим этого специального значения. Обратная косая черта ускользает от специального значения, чтобы снова сделать обычную одиночную кавычку.
  • Строка 8 - fi сигнализирует конец оператора if. Все команды после этого будут выполняться как обычно.
  • Строка 10 - поскольку эта команда находится за пределами оператора if, она будет выполняться независимо от результата инструкции if.

Контрольная работа

Квадратные скобки ([]) в выражении if являются фактически ссылкой на командный тест . Это означает, что здесь могут использоваться все операторы, которые позволяют тестировать. Посмотрите страницу руководства для теста, чтобы увидеть все возможные операторы (их немало), но некоторые из наиболее распространенных из них перечислены ниже.

оператор Описание
! ЭКСПРЕССИЯ EXPRESSION неверно.
-n STRING Длина STRING больше нуля.
-z STRING Длина STRING равна нулю (т.е. она пуста).
STRING1 = STRING2 STRING1 равен STRING2
STRING1! = STRING2 STRING1 не равен STRING2
INTEGER1 -eq INTEGER2 INTEGER1 численно равен INTEGER2
INTEGER1 -gt INTEGER2 INTEGER1 численно больше INTEGER2
INTEGER1 -lt INTEGER2 INTEGER1 численно меньше INTEGER2
-d ФАЙЛ ФАЙЛ существует и является каталогом.
-e ФАЙЛ Файл существует.
-r ФАЙЛ ФАЙЛ существует, и разрешение на чтение предоставляется.
-s FILE ФАЙЛ существует и размер больше нуля (т. е. Он не пуст).
-W FILE ФАЙЛ существует, и разрешение на запись предоставляется.
-x ФАЙЛ ФАЙЛ существует, и разрешение на выполнение предоставляется.

Несколько замечаний:

  • = немного отличается от -eq . [001 = 1] вернет false как = выполняет сравнение строк (т. е. Символ для символа тот же), тогда как -eq делает числовое значение сравнения [001 -eq 1] вернет true.
  • Когда мы ссылаемся на FILE выше, мы фактически подразумеваем путь . Помните, что путь может быть абсолютным или относительным и может ссылаться на файл или каталог.
  • Поскольку [] является лишь ссылкой на командный тест, мы можем экспериментировать и пытаться снимать с тестом в командной строке, чтобы убедиться, что наше понимание его поведения верное.

Давайте разберем это:

  • Строка 1 - выполнить сравнение на основе строк. Тест не печатает результат, поэтому вместо этого мы проверяем его статус выхода, что мы будем делать на следующей строке.
  • Строка 2 - переменная $? содержит статус выхода предыдущей команды запуска (в этом случае тест). 0 означает TRUE (или успех). 1 = FALSE (или отказ).
  • Строка 4 - На этот раз мы проводим численное сравнение.
  • Строка 7 - Создайте новый пустой файл myfile (предполагая, что myfile еще не существует).
  • Строка 8 - размер myfile больше нуля?
  • Строка 11 - Перенаправление некоторого содержимого в myfile, так что размер больше нуля.
  • Строка 12 - снова проверьте размер файла myfile . На этот раз он ИСТИНА.

Отступ

Цель состоит в том, чтобы улучшить удобочитаемость и усложнить нам простые, глупые ошибки. В Bash нет никаких правил относительно отступов, поэтому вы можете отступать или не отступать, как вам нравится, и ваши скрипты будут работать точно так же. Я настоятельно рекомендую вам сделать отступ от вашего кода (особенно по мере увеличения ваших скриптов), иначе вам будет все труднее видеть структуру в ваших сценариях.

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

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

nested_if.sh

#!/bin/bash
# Вложенные операторы if

if [ $1 -gt 100 ]
then
echo Hey that\'s a large number.
if (( $1 % 2 == 0 ))
then
echo And is also an even number.
fi
fi

Давайте разберем это:

  • Строка 4 - Выполните следующее, только если первый аргумент командной строки больше 100.
  • Строка 8 - это вариация света в выражении if . Если мы хотим проверить выражение, мы можем использовать двойные скобки, как и для переменных .
  • Строка 10 - запускается только в том случае, если оба оператора if истинны.

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

If Else

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

if [ <some test> ]
then
<commands>
else
<other commands>
fi

Теперь мы можем легко прочитать из файла, если он представлен как аргумент командной строки, иначе прочитанный из STDIN.

else.sh

#!/bin/bash
# else example
if [ $# -eq 1 ]
then
nl $1
else
nl /dev/stdin
fi

If Elif Else

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

if [<некоторый тест>], 
then
<команды> 
elif [<some test>], 
then
<разные команды> 
else
<другие команды> 
fi

Например, может случиться так, что если вам исполнилось 18 или более, вы можете пойти на вечеринку. Если вы не, но у вас есть письмо от ваших родителей, вы можете пойти, но должны вернуться до полуночи. В противном случае вы не можете пойти.

if_elif.sh

#!/bin/bash
# elif statements

if [ $1 -ge 18 ]
then
echo You may go to the party.
elif [ $2 == 'yes' ]
then
echo You may go to the party but be back before midnight.
else
echo You may not go to the party.
fi

Вы можете иметь столько ветвей elif, сколько хотите. Заключительное дополнение также является необязательным.

Логические операции

Иногда мы только хотим что-то сделать, если выполняются несколько условий. В других случаях мы хотели бы выполнить действие, если выполнено одно из нескольких условий. Мы можем разместить их с булевыми операторами .

  • и - &&
  • или - ||

Например, возможно, мы хотим выполнить операцию только в том случае, если файл читаем и имеет размер больше нуля.

and.sh

#!/bin/bash
# and example

if [ -r $1 ] && [ -s $1 ]
then
echo This file is useful.
fi

Возможно, мы хотели бы выполнить что-то немного другое, если пользователь либо bob, либо andy.

or.sh

#!/bin/bash
# or example

if [ $USER == 'bob' ] || [ $USER == 'andy' ]
then
ls -alh
else
ls
fi

Case

Иногда мы можем захотеть использовать разные пути, основанные на переменной, соответствующей ряду шаблонов. Мы могли бы использовать ряд утверждений if и elif, но это скоро вырастет, чтобы быть недвусмысленно. К счастью, есть case, который может сделать многие вещи удобнее. Это немного сложно объяснить, поэтому вот несколько примеров, чтобы проиллюстрировать:

case <variable> in
<pattern 1>)
<commands>
;;
<pattern 2>)
<other commands>
;;
esac

Вот пример:

case.sh

#!/bin/bash
# case example

case $1 in
start)
echo starting
;;
stop)
echo stoping
;;
restart)
echo restarting
;;
*)
echo don\'t know
;;
esac

Давайте разберем это:

  • Строка 4 - Эта строка начинает механизм case.
  • Строка 5 - Если $ 1 равно «start», выполните следующие действия. the) означает конец рисунка.
  • Строка 7 - Мы идентифицируем конец этого набора операторов с двойной точкой с запятой (;;). После этого следует рассмотреть следующий случай.
  • Строка 14 - Помните, что тест для каждого случая является шаблоном. * Представляет собой любое количество любых символов. Очень важно поймать все, если, если ни один из других случаев не соответствует. Это не обязательно, но часто используется.
  • Строка 17 - esac - это случай назад и указывает, что мы находимся в конце описания дела. Любые другие утверждения после этого будут выполняться в обычном режиме.

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

disk_useage.sh

#!/bin/bash
# Print a message about disk useage.

space_free=$( df -h | awk '{ print $5 }' | sort -n | tail -n 1 | sed 's/%//' )

case $space_free in
[1-5]*)
echo Plenty of disk space available
;;
[6-7]*)
echo There could be a problem in the near future
;;
8*)
echo Maybe we should look at clearing out old files
;;
9*)
echo We could have a serious problem on our hands soon
;;
*)
echo Something is not quite right here
;;
esac

 

Часть 4. Сложение, вычитание, умножение, деление, модуль в Bash
Часть 6. Циклы for, while, until в Bash

Источник: https://ryanstutorials.net/bash-scripting-tutorial/bash-if-statements.php

1 Звезда2 Звезды3 Звезды4 Звезды5 Звезд (Пока оценок нет)
Adblock
detector