Bash. Условный оператор if

Bash. Условный оператор if

Sysadminium

Условный оператор if позволяет проверить условие и от полученного результата выполнить один или другой блок кода. В этой статье научимся им пользоваться.

Синтаксис примерно такой:

if [[ условие ]]; then
   команды
elif [[ условие ]]; then
   команды
else
   команды
fi

Можно использовать несколько elif, или убрать elif и else если они не требуются.

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

Сравнение чисел

Равно (-eq) или не равно (-ne):

$ cat test.sh
#!/bin/bash

a=1
b=2

if [[ "$a" -eq "$b" ]]; then
   echo "$a равно $b"
elif [[ "$a" -ne "$b" ]]; then
   echo "$a не равно $b"
else
   echo "Все остальное"
fi

$ ./test.sh
1 не равно 2

В таком сравнении используются следующие операторы:

-eq - равно
-ne - не равно
-gt - больше
-ge - больше или равно
-lt - меньше
-le - меньше или равно


Сравнение строк

Строки сравниваются оператором <, >, =. Например:

$ cat test.sh
#!/bin/bash

a=110
b=22

# сравниваем числа
if [[ "$a" -gt "$b" ]]; then
   echo "$a больше $b"
elif [[ "$a" -lt "$b" ]]; then
   echo "$a меньше $b"
else
   echo "Все остальное"
fi

# сравниваем строки
if [[ "$a" > "$b" ]]; then
   echo "$a больше $b"
elif [[ "$a" < "$b" ]]; then
   echo "$a меньше $b"
else
   echo "Все остальное"
fi

$ ./test.sh
110 больше 22
110 меньше 22

В таком сравнении используются следующие операторы:

!= - не равно

В сравнении строк применяются не только бинарные операторы где сравниваются две строки, а также унарные где смотрится является ли строка пустой или нет. Обратите внимание, здесь обрабатывается только одна строка, поэтому оператор называется унарным:

[[ -z "$a" ]] - является ли строка пустой
[[ -n "$a" ]] - является ли строка не пустой

Пример с пустой строкой:

$ cat test.sh
#!/bin/bash

a=''

if [[ -z "$a" ]]; then
   echo "Строка пустая"
fi

$ ./test.sh
Строка пустая


Булевы операторы

Булевы операторы ! (нет), &(и), || (или) также можно использовать с if:

[[ условие ]] && [[ условие ]]

Например:

$ cat test.sh #!/bin/bash

a=0
b=1

if [[ -n "$a" ]] && [[ "$a" -gt "$b" ]]; then
   echo "$a не пустая и больше чем $b"
else
   echo "$a либо пустая, либо меньше чем $b"
fi

$ ./test.sh
0 либо пустая, либо меньше чем 1


Проверка файлов

С помощью if можно проверить существует ли файл, является ли файл файлом или каталогом и многое другое. Ниже покажу список подобных операторов.

Унарные операторы:

-e - объект существует (файл или каталог)
-f - объект существует и является файлом
-s - файл не пуст (имеет не нулевой размер)
-d - файл является каталогом
-b - файл является блочным устройством
-c - файл является символьным устройством
-p - файл является каналом
-h - файл является символической ссылкой
-S - файл является сокетом
-t - является ли дескриптор файла открытым и связанным с терминалом. Например для проверки  stdin [ -t 0 ] или stdout [ -t 1 ]
-r - файл доступен для чтения (пользователю, запустившему сценарий)
-w - файл доступен для записи (пользователю, запустившему сценарий)
-x - файл доступен для исполнения (пользователю, запустившему сценарий)
-O - вы являетесь владельцем файла
-G - вы принадлежите к той же группе, что и файл

Бинарные операторы:

f1 -nt f2 - файл f1 более новый, чем f2
f1 -ot f2 - файл f1 более старый, чем f2
f1 -ef f2 - файлы f1 и f2 являются "жесткими" ссылками на один и тот же файл


Использование команды вместо условия

В этом случае используется такая конструкция:

if команда; then

Если команда завершилась с кодом выхода 0, то значит условие выполнилось.

Например:

$ cat test2.txt
яблоко
слива
груша
вишня

$ cat test.sh
#!/bin/bash

if grep вишня test2.txt; then
   echo "Вишня в тексте есть!"
fi 

$ ./test.sh
вишня
Вишня в тексте есть!

На этом все, надеюсь с if разобрались!



Report Page