В этой части серии статей для начинающих вы узнаете, как использовать условные операторы в ваших сценариях bash, чтобы заставить их вести себя по-разному в разных сценариях и случаях.
Таким образом вы можете создавать гораздо более эффективные сценарии bash, а также реализовывать проверку ошибок в своих сценариях.
Самая фундаментальная конструкция в любой структуре принятия решений — это условие if. Общий синтаксис базового оператора if следующий:
if [ condition ]; then ваш код fi
Оператор if закрывается fi(обратное if).
Обратите внимание на белое пространство!
Теперь давайте создадим пример скрипта root.sh. Этот сценарий будет повторять утверждение «вы являетесь пользователем root», только если вы запустите сценарий как пользователь root:
#!/bin/bash if [ $(whoami) = 'root' ]; then echo "Вы в корне" fi
Команда whoami выводит имя пользователя. Из статьи по переменным bash вы знаете, что $(command) для подстановки команд используется синтаксис, и он дает вам выходные данные команды.
Условие $(whoami) = ‘root’ будет истинным, только если вы вошли в систему как пользователь root.
Не верите мне? Вы не обязаны. Запустите и убедитесь в этом сами.
Возможно, вы заметили, что при запуске сценария root.sh от имени обычного пользователя вы не получаете никакого вывода. Любой код, который вы хотите запустить, когда условие if оценивается как ложное, можно включить в оператор else следующим образом:
#!/bin/bash if [ $(whoami) = 'root' ]; then echo "Вы в корне" else echo "Вы не в корне" fi
Теперь, когда вы запустите скрипт как обычный пользователь, вам напомнят, что вы не всемогущий пользователь root:
destroyer@andreyex:~$./root.sh Вы не в корне
Вы можете использовать оператор elif (else-if) всякий раз, когда хотите проверить более одного выражения (условия) одновременно.
Например, следующий bash-сценарий age.sh принимает ваш возраст в качестве аргумента и выводит содержательное сообщение, соответствующее вашему возрасту:
#!/bin/bash AGE=$1 if [ $AGE -lt 13 ]; then echo "Ты же еще ребенок." elif [ $AGE -lt 20 ]; then echo "Ты же подросток." elif [ $AGE -lt 65 ]; then echo "Ты уже взрослая." else echo "Ты-старейшина." fi
Теперь выполните несколько запусков скрипта age.sh, чтобы протестировать его с разными возрастами:
destroyer@andreyex:~$./age.sh 11 Ты же еще ребенок. destroyer@andreyex:~$./age.sh 18 Ты же подросток. destroyer@andreyex:~$./age.sh 44 Ты уже взрослая. destroyer@andreyex:~$./age.sh 70 Ты-старейшина.
Обратите внимание, что мы использовали -lt тестовое условие (меньше) с переменной $AGE.
Также имейте в виду, что у вас может быть несколько elifоператоров, но только один elseоператор в конструкции if, и он должен быть закрыт с помощью fi.
Вы также можете использовать оператор if в другом операторе if. Например, взгляните на следующий сценарий bash weather.sh :
#!/bin/bash TEMP=$1 if [ $TEMP -gt 5 ]; then if [ $TEMP -lt 15 ]; then echo "Погода холодная." elif [ $TEMP -lt 25 ]; then echo "Погода хорошая." else echo "Погода стоит жаркая." fi else echo "На улице холодно ..." fi
Сценарий принимает любую температуру в качестве аргумента и затем отображает сообщение, отражающее, какой будет погода. Если температура больше пяти, выполняется вложенный (внутренний) оператор if-elif. Давайте сделаем несколько запусков скрипта, чтобы увидеть, как он работает:
destroyer@andreyex:~$./weather.sh 0 На улице холодно ... destroyer@andreyex:~$./weather.sh 8 Погода холодная. destroyer@andreyex:~$./weather.sh 16 Погода хорошая. destroyer@andreyex:~$./weather.sh 30 Погода стоит жаркая.
Вы также можете использовать операторы case в bash для замены нескольких операторов if, поскольку они иногда сбивают с толку и трудны для чтения. Общий синтаксис конструкции case следующий:
case "variable" in "pattern1" ) Command … ;; "pattern2" ) Command … ;; "pattern2" ) Command … ;; esac
Обращать внимание!
Операторы case особенно полезны при работе с сопоставлением с образцом или регулярными выражениями. Чтобы продемонстрировать это, взгляните на следующий сценарий bash char.sh :
#!/bin/bash CHAR=$1 case $CHAR in [a-z]) echo "Маленький Алфавит." ;; [A-Z]) echo "Большой Алфавит." ;; [0-9]) echo "Число." ;; *) echo "Специальный символ." esac
Сценарий принимает один символ в качестве аргумента и показывает, является ли этот символ маленьким/большим алфавитом, числом или специальным символом.
destroyer@andreyex:~$./char.sh a Маленький Алфавит. destroyer@andreyex:~$./char.sh Z Большой Алфавит. destroyer@andreyex:~$./char.sh 7 Число. destroyer@andreyex:~$./char.sh $ Специальный символ.
Обратите внимание, что я использовал подстановочный знак звездочки (*) для определения случая по умолчанию, который является эквивалентом инструкции else в условии if.
Существует множество условий тестирования, которые можно использовать с операторами if. Условия тестирования различаются, если вы работаете с числами, строками или файлами. Думайте о них как о логических операторах в bash.
Я включил некоторые из самых популярных условий тестирования в таблицу ниже:
Состояние | эквивалент |
---|---|
$a -lt $b | $a <$b |
$a -gt $b | $a > $b |
$a -le $b | $a <= $b |
$a -ge $b | $a >= $b |
$a -eq $b | $a равно $b |
$a -ne $b | $a не равно $b |
-e $FILE | $FILE существует |
-d $FILE | $FILE существует и является каталогом. |
-f $FILE | $FILE существует и является обычным файлом. |
-L $FILE | $FILE существует и является программной ссылкой. |
$STRING1 = $STRING2 | $STRING1 равно $STRING2 |
$STRING1! = $STRING2 | $STRING1 не равно $STRING2 |
-z $STRING1 | $STRING1 пуст |
К счастью, вам не нужно запоминать какие-либо условия тестирования, потому что вы можете найти их на странице руководства по тестированию:
destroyer@andreyex:~$man test
Давайте создадим последний сценарий с именем filetype.sh, который определяет, является ли файл обычным файлом, каталогом или программной ссылкой:
#!/bin/bash if [ $# -ne 1 ]; then echo "Error: Invalid Число of arguments" exit 1 fi file=$1 if [ -f $file ]; then echo "$file is a regular file." elif [ -L $file ]; then echo "$file is a soft link." elif [ -d $file ]; then echo "$file is a directory." else echo "$file does not exist" fi
Мы немного улучшили сценарий, добавив проверку количества аргументов. Если аргументов нет или более одного аргумента, сценарий выведет сообщение и завершится без выполнения остальных операторов в сценарии.
Давайте сделаем несколько запусков скрипта, чтобы протестировать его с различными типами файлов:
destroyer@andreyex:~$./filetype.sh weather.sh weather.sh is a regular file. destroyer@andreyex:~$./filetype.sh /bin /bin is a soft link. destroyer@andreyex:~$./filetype.sh /var /var is a directory. destroyer@andreyex:~$./filetype.sh Error: Invalid Число of arguments
До сих пор все операторы if else, которые вы видели, использовались в правильном сценарии bash. Это достойный способ сделать это, но вы не обязаны этому.
Если вы просто хотите увидеть результат в самой оболочке, вы можете использовать операторы if else в одной строке в bash.
Предположим, у вас есть этот сценарий bash.
if [ $(whoami) = 'root' ]; then echo "Вы в корне" else echo "Вы не в корне" fi
Вы можете использовать все операторы if else в одной строке следующим образом:
if [ $(whoami) = 'root' ]; then echo "root"; else echo "not root"; fi
Вы можете скопировать и вставить вышеуказанное в терминал и увидеть результат самостоятельно.
По сути, вы просто добавляете точки с запятой после команд, а затем добавляете следующий оператор if-else.
Потрясающие! Это должно дать вам хорошее представление об условных операторах в Bash. Надеюсь, вам понравилось делать ваши bash-скрипты умнее!
Следите за новостями на следующей неделе, так как вы узнаете, как использовать различные конструкции циклов в своих сценариях bash.