Программирование на BASH
Операторы сравнения

Прежде чем перейти к рассмотрению условных операторов, познакомимся с операторами сравнения. Bash поддерживает несколько операторов сравнения. В случае если условие верно, каждый из них, как и любая корректно завершающаяся программа возвращают значение 0, которое интерпретируется как true, то есть истина. Любое другое значение - false, то есть ложь. Операторы сравнения записываются внутри квадратных скобок, причём, каждая скобка отделяется пробелом от остального текста с обеих сторон. Имеются следующие операторы сравнения:

проверка прав доступа к файлу:
[ -d abcd ] является ли файл abcd каталогом
[ -f abcd ] является ли файл abcd обычным файлом
[ -L abcd ] является ли файл abcd символической ссылкой
[ -r abcd ] есть ли доступ на чтение к файлу abcd
[ -w abcd ] есть ли доступ на запись к файлу abcd
[ -s abcd ] файл abcd имеет ненулевой размер (он не пуст)
[ -u abcd ] имеет ли файл abcd установленный бит SUID
[ -x abcd ] является ли файл abcd исполняемым
проверка строк
[ -z $STRING ] пуста ли строка STRING
[ -n $STRING ] строка STRING не пуста
[ $STRING = $STRING1 ] равны ли строки STRING и STRING1
[ $STRING != $STRING1 ] строки STRING и STRING1 не равны
проверка чисел
при проверке чисел в условии их обязательно необходимо заключить в двойные кавычки
[ $DIGIT -eq $DIGIT1 ] равны ли числа DIGIT и DIGIT1
[ $DIGIT -ne $DIGIT1 ] числа DIGIT и DIGIT1 не равны
[ $DIGIT -gt $DIGIT1 ] число DIGIT больше DIGIT1
[ $DIGIT -lt $DIGIT1 ] число DIGIT меньше DIGIT1
[ $DIGIT -gе $DIGIT1 ] число DIGIT больше или равно DIGIT1
[ $DIGIT -lе $DIGIT1 ] число DIGIT меньше или равно DIGIT1

Если внутри оператора сравнения, перед самим условием поставить знак '!', то мы получим отрицание этого условия. Например:

[ ! -d "/home" ]

Данный оператор сравнения вернёт истину, если "/home" не является каталогом.

Оператор ветвления

Теперь перейдём к самим операторам ветвления. Первый из них это условный оператор if-then-else-fi. Его синтаксис выгляди следующим образом:

if <оператор сравнения1> ; then
<действия 1>
elif <оператор сравнения2> ; then
<действия 2>
else
<действия 3>
fi

Работает это так же как и во многих других языках программирования. То есть, если <оператор сравнения1> вернул значение 0, то будут выполнены <действия 1>, иначе будет проверятся код возврата <оператор сравнения2> и, в случае его истинности, выполнятся <действия 2>, иначе будут выполнены <действия 3>. Ветви elif и else не являются обязательными, ветвей elif, может быть много.

Небольшой пример. Допустим для дальнейшей работы сценария требуется информация из файла "userlist.txt". Неплохо было бы проверить, а есть ли вообще такой файл прежде чем пытаться с ним работать.

#!/bin/bash
FILE="userlist.txt"
if [ ! -f $FILE ] ; then
echo "Отсутствует файл $FILE"
exit
else
echo "Файл $FILE существует"
fi

Оператор множественного ветвления

Вторым оператором ветвления является оператор множественного выбора case-in-esac. Он имеет следующий синтакис:

case <переменная> in
<значение 1>)
<действия 1>
;;
<значение 2>)
<действия 2>
;;

...

<значение N>)
<действия N>
;;
*)
<действия по умолчанию>
esac

Работает естественно как и везде. То есть, если переменная совпадает с одним из значений отделённых скобками, то выполняется соответствующий список действий, который оканчивается символами ';;'. Если же подходящего значения нет, то будет выполнено действие обозначенное - '*', называемое действием по умолчанию. Описывать его не обязательно.

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

#!/bin/bash
echo "Calculator"
echo -n "A = "
read A
echo -n "B = "
read B
echo -n "Operation [add, sub, mul, div, mod]: "
read SIGN

case $SIGN in
add)
echo "A + B = "`expr $A '+' $B`
;;
sub)
echo "A - B = "`expr $A '-' $B`
;;
mul)
echo "A * B = "`expr $A '*' $B`
;;
div)
echo "A / B = "`expr $A '/' $B`
;;
mod)
echo "A % B = "`expr $A '%' $B`
;;
*)
echo "Error: Incorrect operator"
esac

В этом примере, мы читаем со стандартного ввода два значения, и записываем их в переменные $A и $B. Затем предлагаем пользователю ввести желаемую арифметическую операцию, она будет записана в переменную $SIGN. В зависимости от значения переменной $SIGN выбираем необходимое действие, и выводим результат. Команда echo, печатает два аргумента. Строку записанную в двойных кавычках, которая описывает произведённое действие, и результат вычислений вызываемой команды expr над тремя аргументами: парой чисел, и знаком операции (заключены в обратные кавычки для вызова команды expr и передачи ей параметров). В случае если пользователь ввёл операцию, которую мы не предусмотрели, мы выведем сообщение об ошибке "Error: Incorrect operator". Корректность переменных $A и $B, проверяется внутри самой команды expr, и нам не нужно заботится о том, что пользователь может ввести вместо числа буквы, это "лежит на плечах" команды expr.

Символы '*' и '/' заключены в одинарные кавычки, поскольку при вызове команды expr, интерпретатор обработает их подставив имена всех файлов в текущем каталоге, и ссылку на корневой каталог соответственно. Остальные операторы закавычены для сохранения единства стиля. Опция -n в команде echo служит для подавления перевода строки при использовании команды.

Наверх

html counterсчетчик посетителей сайта

Автор: Бритвин Станислав Евгеньевич. e-mail: britvin.slawa@yandex.ru ВоГУ ФПМКТиФ группа ПМ-31, Вологда 2016г.