BASH - конструкция If-Then-Else
Добавлено: 11 ноя 2017, 14:39
Источник: http://eddnet.org/?p=1311
BASH - конструкция If-Then-Else
if…else…fi позволяют вам сделать выбор основанный на справедливости выражения. Как пример, определить существует ли файл или нет, и в зависимости от этого предпринять какие-то действия.
if…then…else…fi синтаксис:
Очень важно запомнить, ваша конструкция должна всегда заканчиваться словом fi.
Выражения используемые с if
В приведенной внизу таблице содержаться операторы которые выполняют команду test или набор команд. Эти операторы заключаются в квадратные скобки [] для проверки выполнения условия.
Давайте перейдем к примерам.
Создадим скрипт который будет определять положительное или отрицательное введенное нами число:
другой пример, определим, существует ли введенный нами пользователь:
Восклицательный знак перед grep $USER /etc/passwd, говорит о том, что условие выполниться если пользователя не существует.
А теперь давайте перепишем этот скрипт только используя специальный параметр $?, получающий код ошибки выполнения последней команды:
Пример использование сравнения строк. скрипт будет проверять root вы или нет:
данный скрипт можно переписать короче (без if else):
Вы так же можете использовать регулярные выражения. Как пример. пускай наш скрипт определяет содержит ли введенный нам текст букву «ч»:
Несколько слов по поводу использования двойных и одинарных квадратных скобок. При использовании двойных скобок ваши переменный не будут разбиты на несколько отдельных слов если вы использовали пробел, как пример, переменная VAR=»var with space» будет единым целым.
BASH - конструкция If-Then-Else
if…else…fi позволяют вам сделать выбор основанный на справедливости выражения. Как пример, определить существует ли файл или нет, и в зависимости от этого предпринять какие-то действия.
if…then…else…fi синтаксис:
Код: Выделить всё
if [ условие ]
then
если условие справедливо
выполнить все команды до else или
до fi
else
если условие не справедливо
выполнить все команды до 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
А теперь давайте перепишем этот скрипт только используя специальный параметр $?, получающий код ошибки выполнения последней команды:
Код: Выделить всё
#!/bin/bash
read -p "Введите имя пользователя : " USER
grep $USER /etc/passwd
if [ $? -ne 0 ];
then
echo "$n не существует."
else
echo "$n существует."
fi
Код: Выделить всё
#!/bin/bash
if [ "$(whoami)" != 'root' ]; then
echo "У вас нет прав для запуска $0."
exit 1;
fi
Код: Выделить всё
#!/bin/bash
[ "$(whoami)" != 'root' ] && ( echo У вас нет прав для запуска; exit 1 )
Код: Выделить всё
#!/bin/bash
LATTER="ч"
read -p "Введите предложение : " STR
if [[ "$STR" == *$LATTER* ]];
then
echo "$LATTER найдено."
else
echo "$LATTER не найдено."
fi