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