Рубрики
Uncategorized

Скрипты оболочки: Условное исполнение

Условные условные программирования оболочки. Помечено Linux, обучение, Bash, Devops.

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

Кроме того, обратите внимание, что большая часть кода проверяется только с башмак и 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»