Страница 1 из 1

BASH - конструкция If-Then-Else

Добавлено: 11 ноя 2017, 14:39
xor
Источник: http://eddnet.org/?p=1311

BASH - конструкция If-Then-Else
if…else…fi позволяют вам сделать выбор основанный на справедливости выражения. Как пример, определить существует ли файл или нет, и в зависимости от этого предпринять какие-то действия.

if…then…else…fi синтаксис:

Код: Выделить всё

if [ условие ]
then
 если условие справедливо
 выполнить все команды до else или
 до fi
else
 если условие не справедливо
 выполнить все команды до fi
fi
Очень важно запомнить, ваша конструкция должна всегда заканчиваться словом fi.

Выражения используемые с if

В приведенной внизу таблице содержаться операторы которые выполняют команду test или набор команд. Эти операторы заключаются в квадратные скобки [] для проверки выполнения условия.

Код: Выделить всё

[ -a FILE ] Правда если FILE существует.
[ -b FILE ] Правда если FILE существует и это специальный блоковый файл.
[ -c FILE ] Правда если FILE существует и это специальный знаковый файл.
[ -d FILE ] Правда если FILE существует и это директория.
[ -e FILE ] Правда если FILE существует.
[ -f FILE ] Правда если FILE существует и это регулярный файл.
[ -g FILE ] Правда если FILE существует и установлен SGID бит.
[ -h FILE ] Правда если FILE существует и это символический ссылка.
[ -k FILE ] Правда если FILE существует и второй промежуточный бит округления установлен.
[ -p FILE ] Правда если FILE существует и это named pipe (FIFO).
[ -r FILE ] Правда если FILE существует и он доступен на чтение.
[ -s FILE ] Правда если FILE существует и больше нуля.
[ -u FILE ] Правда если FILE существует и SUID (set user ID) бит установлен.
[ -w FILE ] Правда если FILE существует и он доступен на запись.
[ -x FILE ] Правда если FILE существует и он доступен на исполнение.
[ -O FILE ] Правда если FILE существует принадлежит существующему пользователю
[ -G FILE ] Правда если FILE существует принадлежит существующей группе.
[ -L FILE ] Правда если FILE существует и это символический ссылка.
[ -N FILE ] Правда если FILE существует и был изменен с тех пор как был прочитан.
[ -S FILE ] Правда если FILE существует и это сокет.
[ FILE1 -nt FILE2 ] Правда, если файл FILE1 изменялся чаще чем FILE2, или есои FILE1 существует, а FILE2 нет.
[ FILE1 -ot FILE2 ] Правда, если файл FILE1 старше чем FILE2, или FILE1 существует, а FILE2 нет.
[ FILE1 -ef FILE2 ] Правда, если FILE1 и FILE2 относятся к одному устройству и номеру инода.
[ -o OPTIONNAME ] Правда если shell опция "OPTIONNAME" включена.
[ -z STRING ] Правда если длинна "STRING" равна 0.
[ -n STRING ] or [ STRING ] Правда если длинна "STRING" не равна 0.
[ STRING1 == STRING2 ] Правда если выражения эквивалентны. 
[ STRING1 != STRING2 ] Правда если выражения не эквивалентны.
[ STRING1 < STRING2 ] Правда если "STRING1" лексикографически упорядоченно до "STRING2".
[ STRING1 > STRING2 ] Правда если "STRING1" лексикографически упорядоченно после "STRING2".
[ ARG1 OP ARG2 ] "OP" это один из следующих параметров -eq, -ne, -lt, -le, -gt or -ge. Эти бинарные арифметические 
операторы возвращают результат "правда" если "ARG1" эквивалентен(-eq), не эквивалентен(-ne), меньше чем(-lt), 
меньше или эквивалентен(-le), больше чем(-gt), больше или эквивалентно(-ge) к "ARG2".  
[ ! EXPR ] правда если выражение EXPR не справедливо.
[ ( EXPR ) ] возвращает значение EXPR. Это может быть использовано для изменения приоритета операторов.
[ EXPR1 -a EXPR2 ] правда, если оба выражения EXPR1 и EXPR2 справедливы.
[ EXPR1 -o EXPR2 ] правда, если хотя бы одно выражение EXPR1 или EXPR2 справедливы.
Давайте перейдем к примерам.

Создадим скрипт который будет определять положительное или отрицательное введенное нами число:

Код: Выделить всё

#!/bin/bash
read -p "Введите число : " n
if [ $n -ge 0 ];
then
      echo "$n положительное число."
else
      echo "$n отрицательное число."
fi
другой пример, определим, существует ли введенный нами пользователь:

Код: Выделить всё

#!/bin/bash
read -p "Введите имя пользователя : " USER
if ! grep $USER /etc/passwd
then
      echo "$n не существует."
else
      echo "$n существует."
fi
Восклицательный знак перед grep $USER /etc/passwd, говорит о том, что условие выполниться если пользователя не существует.

А теперь давайте перепишем этот скрипт только используя специальный параметр $?, получающий код ошибки выполнения последней команды:

Код: Выделить всё

#!/bin/bash
read -p "Введите имя пользователя : " USER
grep $USER /etc/passwd
if [ $? -ne 0 ]; 
then
      echo "$n не существует."
else
      echo "$n существует."
fi
Пример использование сравнения строк. скрипт будет проверять root вы или нет:

Код: Выделить всё

#!/bin/bash
if [ "$(whoami)" != 'root' ]; then
        echo "У вас нет прав для запуска $0."
        exit 1;
fi
данный скрипт можно переписать короче (без if else):

Код: Выделить всё

#!/bin/bash
[ "$(whoami)" != 'root' ] && ( echo У вас нет прав для запуска; exit 1 )
Вы так же можете использовать регулярные выражения. Как пример. пускай наш скрипт определяет содержит ли введенный нам текст букву «ч»:

Код: Выделить всё

#!/bin/bash
LATTER="ч"
read -p "Введите предложение : " STR
if [[ "$STR" == *$LATTER* ]]; 
then
      echo "$LATTER найдено."
else
      echo "$LATTER не найдено."
fi
Несколько слов по поводу использования двойных и одинарных квадратных скобок. При использовании двойных скобок ваши переменный не будут разбиты на несколько отдельных слов если вы использовали пробел, как пример, переменная VAR=»var with space» будет единым целым.