Операторы сравнения
Прежде чем перейти к рассмотрению условных операторов, познакомимся с операторами сравнения. 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 служит для подавления перевода строки при использовании команды.
Наверх
|