Это вторая часть серии на скриптах оболочки. Если вы пропустили его, вы можете найти первую часть здесь .
Кроме того, обратите внимание, что большая часть кода проверяется только с башмак и ZSH. Оболочки, это может не работать с другими снарядами.
Условное исполнение означает, что вы можете выбрать выполнить код только в том случае, если определенные условия выполнены. Без этой возможности все, что вы сможете сделать, это выполнить одну команду за другой за другой. Возможность проверки различных вещей о состоянии системы, а также переменных среды процесса, означает, что скрипт оболочки может сделать гораздо более мощные вещи, которые в противном случае были бы возможными. В этом посте мы собираемся исследовать Тестовые операторы
, Если/тогда/else
Условные условные и дело
заявления.
Тест ака [
С тестами мы можем проверить, например: если файл существует, если число больше другого, сравните, если строки равны …
Синтаксис:
[ condition-to-test-for ]
Пример:
[ -e /etc/passwd ]
Как говорит вышеупомянутое, другое имя для Тест
это [
. Это также встроенный оболочком (что означает, что сама оболочка будет интерпретировать [
как Тест
Даже если ваша среда Unix установлена по-разному). Когда [
называется, это требует ]
вокруг его аргументов, но в противном случае он делает ту же работу.
test -e /etc/passwd # as above so below [ -e /etc/passwd ]
Это тесты, если etc/passwd
существует, и если это делает это возвращение правда
— Состояние выхода команды 0
Отказ Если это не существует, команда выходит с состоянием выхода 1
(Подробнее о статусах выхода в следующем посте).
Gotcha : Пространства вокруг [
и ]
Символы обязательны! Например: [-E/etc/passwd]
не будет работать; Это интерпретируется как test-e/etc/passwd]
какие ошибки, потому что ]
не имеет начала [
. [
на самом деле программа, а также как Ls
и другие программы, оно должно быть окружена пробелами. Мораль этой истории: поставить пробелы вокруг всех ваших операторов.
Примечание : Вы можете поменять результаты теста с Действительно
:
if [ ! -r "$1" ]; then echo "File $1 is not readable – skipping."; fi
Как вы можете увидеть Тест
это простое, но мощная полезность сравнения. Для получения полной информации, Беги Человек тест
В вашей системе, но вот несколько использований и типичных примеров:
Операторы тестирования файлов:
-d FILE #True if the file is a directory -e FILE #True if the file exists -f FILE #True if the file exists and it's regular file -r FILE #True if the file is readable by you -s FILE #True if the file exists and it's not empty -w FILE #True if the file is writable by you -x FILE #True if the file is executable by you
Струнные тестовые операторы:
-z STRING #True if the string is empty -n STRING #True if the string is not empty STRING1 = STRING2 #True if the strings are equal STRING1 != STRING2 #True if the strings are not equal
Арифметические тесты:
arg1 -eq arg2 #True if the arguments are equal arg1 -ne arg2 #True if the arguments are not equal arg1 -lt arg2 #True if the arg1 is less than arg2 arg1 -le arg2 #True if arg1 is less than or equal to arg2 arg1 -gt arg2 #True if arg1 is greater than arg2 arg1 -ge arg2 #True if arg1 is greater than or equal to arg2
&& и ||
Можно объединить тесты, а/или цепь несколько команд, используя &&
и
&&
mkdir/tmp/bak && cp test.txt/tmp/bak
Команда, которая следует
&&
будет выполнен, если и только предыдущая команда преуспевает (AKA выходит с0
Состояние выхода).CP TEST.TXT/TMP/BAK
CP test.txt/tmp
#! /bin/bash HOST="google.com" ping -c 1 $HOST && echo "$HOST reachable."
ЕСЛИ/ТОГДА
Почти каждый язык программирования имеет форму, если/затем/else, а оболочка не является исключением. Синтаксис использует квадратные скобки для выполнения теста и тогда
и Fi
Требуются операторы, действующие так же, как вьющиеся в курсовые кронштейны {и} в C и некоторые другие языки.
Синтаксис:
if [ condition ] then statements for when the condition is true fi
Кроме линии линии после тогда
Все эти перерывы линейки требуются или могут быть заменены запятой. Напомнить: пробелы вокруг [
и ]
Также требуются символы, поэтому это может быть уменьшено (пожалуйста) в лучшем случае: Если [состояние]; затем заявления; ФИ
Вполне распространено использовать точку с запятой, чтобы поставить затем на одну и ту же строку, что и если.
Пример:
MY_SHELL="zsh" if [ "$MY_SHELL" = "zsh" ] then echo "You are the zsh shell user!" fi
ЕЩЕ
Может быть, вы хотите запустить команду, если это возможно, но если это не может быть сделано, то продолжайте выполнение скрипта. Один (проще и самый распространенный) способ сделать это, будет использоваться иначе заявление:
if [ condition ]; then statements for when the condition is true else statements for when the condition is false fi
#!/bin/bash # Check for likely causes of failure if [ -r "$1" ]; then cat "$1" else echo "Error: $1 is not a readable file." fi
Этот фрагмент пытается кот
Файл прошел к нему как свой первый параметр ( «$ 1»
Положить двойные цитаты вокруг него, чтобы позволить имена имена файлов, включая пробелы) и выписывают сообщение об ошибке, если оно не удалось сделать это.
Элиф
Элиф
это конструкция, которая позволяет вам добавлять условия в еще
Часть Если
утверждение. Кратко для «иначе, если» так, чтобы длинная нить возможных действий можно записать более кратко. Это облегчает писать, проще читать, а главное, легче отлаживать.
#!/bin/bash OS=`uname -s` if [ "$OS" = "FreeBSD" ]; then echo "This Is FreeBSD" elif [ "$OS" = "CYGWIN_NT-5.1" ]; then echo "This is Cygwin" elif [ "$OS" = "SunOS" ]; then echo "This is Solaris" elif [ "$OS" = "Darwin" ]; then echo "This is Mac OSX" elif [ "$OS" = "Linux" ]; then echo "This is Linux" else echo "Failed to identify this OS" fi
Это Многое , Многое более читаемый, чем вложенные еще
Код ад это может превратиться в.
Заявление о случаях
дело
Предоставляет гораздо более чистые, простые для записи и гораздо более читаемой альтернативы Если/тогда/else
Конструкция, особенно когда есть много возможных значений для тестирования. С помощью случая вы перечисляете значения, которые вы хотите идентифицировать и действовать, а затем предоставить блок кода для каждого. Одно общее место для применения Case Septions используют сценарии запуска системы. Синтаксис:
case "$VAR" in pattern_1) # Some commands here. ;; # Execution will stop when the double semicolon is reached pattern_n) # Some commands here. ;; esac
Пример:
#!/bin/bash OS=`uname -s` case "$OS" in FreeBSD) echo "This is FreeBSD" ;; CYGWIN_NT-5.1) echo "This is Cygwin" ;; SunOS) echo "This is Solaris" ;; Darwin) echo "This is Mac OSX" ;; Linux) echo "This is Linux" ;; *) echo "Failed to identify this OS" ;; esac
Хотя это выглядит как специальная директива, *
Это просто самая общая подстановка возможна, поскольку она будет соответствовать абсолютно любой строке. Это также говорит о том, что мы можем сделать более продвинутые сопоставление шаблонов, как Regex
, Например.
Обратите внимание, что шаблоны чувствительны к регистру.
Менее известная особенность реализации Bash of дело
это то, что вы можете закончить утверждение с ;; &
или ; &
вместо только ;;;
Отказ В то время как ;;;
означает, что ни одно из других утверждений не будет выполнено, если вы закончите утверждение с ;; &
Все последующие случаи все равно будут оцениваться. Если вы закончите заявление с ; &
Дело будет рассматриваться как соответствовало.
#!/bin/bash read -p "Give me a word: " input echo -en "That's " case $input in *[[:digit:]]*) echo -en "numerical " ;;& *[[:lower:]]*) echo -en "lowercase " ;;& *[[:upper:]]*) echo -en "uppercase " ;;& *) echo "input." ;; esac $ ./case1.sh Give me a word: Hello 123 That's numerical lowercase uppercase input.
Эта функция специфична для раковины Bash; Это не стандартная особенность оболочки Bourne, поэтому, если вам нужно написать портативный скрипт, не ожидайте этого работать. Это приведет к тому, что сообщение об ошибке синтаксиса на других оболочках.
Этот пост охватил различные способы контроля условного исполнения — от простого Если/потом/иначе построить
, через разные вещи, которые можно сделать с Тест
до более гибкого дело
Заявление о сопоставлении против различных наборов ввода.
Должен признать, что написание о программировании Shell Shell казалась двумя или тремя сообщениями в начале, но есть Лот Чтобы быть покрыты, и даже это и предыдущие посты даже не половина всего, что можно узнать о темах, о которых я написал. Я действительно рекомендую Усовершенствованное руководство по сценарию Bash и Классические скрипты оболочки Если вы хотите изучить программирование Shell на более глубине. Я напишу немного о позиционных параметрах, выходных кодах и (надеюсь) функциях в следующем. Спасибо за чтение!
Оригинал: «https://dev.to/puritanic/shellscripting-conditional-execution-3kgm»