ИТ Блог. Администрирование серверов на основе Linux (Ubuntu, Debian, CentOS, openSUSE)

Bash. Принятие решений с помощью операторов if Else и case

Bash Heredoc

В этой части серии статей для начинающих вы узнаете, как использовать условные операторы в ваших сценариях bash, чтобы заставить их вести себя по-разному в разных сценариях и случаях.

Таким образом вы можете создавать гораздо более эффективные сценарии bash, а также реализовывать проверку ошибок в своих сценариях.

 

Использование оператора if в 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.

Не верите мне? Вы не обязаны. Запустите и убедитесь в этом сами.

 

Использование оператора if-else в bash

Возможно, вы заметили, что при запуске сценария root.sh от имени обычного пользователя вы не получаете никакого вывода. Любой код, который вы хотите запустить, когда условие if оценивается как ложное, можно включить в оператор else следующим образом:

#!/bin/bash

if [ $(whoami) = 'root' ]; then
	echo "Вы в корне"
else
	echo "Вы не в корне"
fi

 

Теперь, когда вы запустите скрипт как обычный пользователь, вам напомнят, что вы не всемогущий пользователь root:

destroyer@andreyex:~$./root.sh
Вы не в корне

 

Использование оператора else if в bash

Вы можете использовать оператор 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 в bash

Вы также можете использовать оператор 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

Вы также можете использовать операторы 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.

 

Условия тестирования в bash

Существует множество условий тестирования, которые можно использовать с операторами 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

 

Бонус: инструкция Bash if else в одной строке

До сих пор все операторы 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.

Exit mobile version