Условный оператор If/Then в Bash.

if compound составная проверка if/then if

Если результатом проверки является tue, оператор if осуществляет выполнение содержащихся в нем команд.

В других языках программирования истинному утверждению соответствует число «1», а ложному «0». Bash ведет себя иначе. При проверке входящего значения или выражения истинности соответствует число «0» а ложности «1». Это связанно с тем, что результат выражения на самом деле не преобразуется к логическому типу, он является кодом возврата программы.

В Linux за успешный код завершения программы принято считать число ноль, а за ошибочный соответственно единицу.

В общем виде конструкцию применения условного оператора можно представить следующим образом «if проверяемое_выражение; then набор_команд fi».

Конструкция начинается с ключевого слова if, за которым следует выражение, требующее проверки. После проверки должно располагаться ключевое слово then, свидетельствующее о начале блока команд.

Если проверка входящих параметров располагается на одной строчке с then, после неё необходимо добавить точку с запятой «;».

Конец блока команд должен быть завершен ключевым словом fi.

#!/bin/bash
#если файл существует, выводим сообщение
if [[ -f '/etc/passwd' ]]; then echo "Файл с определением пользователей существует"; fi

#получаем ввод и сверяемся со строкой пароля
password='test67'
echo -n "введите пароль: "read string
  if [[ $password = $string ]]
    then echo "Пароль введен корректно"
  else 
    echo "Ошибка ввода пароля"
  fi

Проверка входящих выражений

Bash позволяет осуществлять проверку условий тремя способами

Выражение Описание
[ выражение ] Одинарные квадратные скобки являются псевдонимом встроенной команды test. Они позволяют сравнивать значения друг с другом, а также проверять файлы и директории на существование при указании их имен.
[[ выражение ]] Использование двойных кавычек в условном операторе if предпочтительнее предыдущего варианта. Они не являются псевдонимом сторонней команды, а встроены в интерпретатор Bash. Это положительно сказывается на скорости выполнения. К тому же двойные квадратные скобки позволяют использовать логические операторы && или
(( арифметическая_операция )) Результат арифметической операции также принимается за логическое значение. Внутри двойных круглых скобок можно использовать операторы >, <, <=, >=, =, != для сравнения чисел.

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

Таблица операторов Bash для проверок значений в условиях

Оператор Описание
Сравнения чисел
-eq или = Равно.
-ge или >= Больше или равно.
-ne или != Не равно.
-gt или > Больше.
-lt или < Меньше.
-le или <= Меньше или равно.
Проверка файлов
-f Существует и является файлом (не директорией).
-d Существует и является директорией.
-r Доступен для чтения.
-w Доступен для записи.
-x Файл является исполняемым.
-O Принадлежит текущему пользователю.
-G Группа идентична текущему пользователю.
Сравнение строк  
= Равенство строк.
!= Неравенство строк.
< Меньше по ASCII-коду.
> Больше по ASCII-коду.
-n В строке больше нуля символов.
-z В строке ноль символов. [[ -z ${var} ]]

Пример объединения проверок

#!/bin/bash
#два выражения, объединенных логическим "и"
if (( 4*5 > 15 )) && [ -d '/var/log/apt' ]; then
echo 'Условие истинно'
fi

#аналогичное выражение, но с двойными скобками
if [[ 4*5 -gt 15 && -d '/var/log/apt' ]]; then
echo 'Условие истинно'
fi

#пример арифметической операции в условии
number=145
divider=3
if (( $number/$divider > 30 )); then
echo "${number} деленное на ${divider} равно $[$number/$divider]"
fi

Заметка

Выражение должно отделяться хотя бы одним пробелом от открывающих и закрывающих скобок. Также учитывайте, что операторы сравнения >, <, =, != можно использовать как внутри квадратных скобок, так и в круглых. Однако в квадратных скобках они применяются для сравнения строк, а внутри круглых для чисел.

Альтернативное условие Else

При использовании условного оператора if/then можно задать блок команд, который будет выполнен в случае ложности выражения. Bash позволяет сделать это за счет ключевого слова else. Поместите его в промежутке then и fi. Все команды, лежащие между else и fi, будут считаться альтернативой истинности условия.

#!/bin/bash
#проверка строки на длину и совпадение
code='4567'
string=''
echo -n 'введите проверочный код: '
read string
if [[ -n $string ]]; 
  #вложенная проверка условия 
    if [[ $code = $string ]]; 
      then 
        echo 'проверочный код совпал' 
      else 
        echo 'код не прошел проверку' 
    fi
  else echo 'слишком короткий код'
fi

Примеры

  • Проверка существования файла:
if ! [ -f /path/to/file ]; then
echo 'No file'
fi
  • Другой вариант:
if test -f /path/to/file
  then
    echo 'No file'
fi
  • Проверка существования директории:
if ! [ -d /path/directory/ ]; then
  echo 'No directory'
fi
  • Проверка существования пользователя:
grep "username:" /etc/passwd >/dev/null
if [ $? -ne 0 ]; then
  echo 'No username found'
fi
  • проверить, пуста ли переменная в Bash
if [[ -z "$var" ]]; then
 do echo "what you want"
fi
  • Проверка, установлен ли пакет в системе
if ! [[ `dpkg -l xemacs21-bin` ]]; then
       apt-get -y install xemacs21-bin
    else
      echo 'package present in system'
fi
  • Проверка, существует ли команда в системе?
if command -v systemctl >/dev/null 2>&1; then echo Yes; else echo None; fi