Выражение | Истинно, если |
---|---|
-z строка | длина строки равна 0 |
-n строка | длина строки не равна 0 |
стр1 == стр2 | строки совпадают |
стр1 !== стр2 | строки не совпадают |
стр1 < стр2 | строка1 предшествует строке2 в лексикографическом порядке. Алфавит соответствует текущей локали |
стр1 > стр2 | строка1 следует за строкой2 в лексикографическом порядке |
Арифметическое условное выражение имеет формат arg1 OP arg2
, где arg1
и arg2
— целые числа, a OP
— одна из операций:
♦ -eq — равно;
♦ -ne — не равно;
♦ -lt — меньше;
♦ -le — меньше или равно;
♦ -gt — больше;
♦ -ge — больше или равно.
Таким образом, можно переписать предыдущий пример с использованием оператора if:
Листинг 8.2. Пример использования оператора if
echo "Ошибка. Кому переслать протокол?"
echo "Начальнику: b"
echo "Коллегам: c"
echo "Сам разберусь; any key"
read answer
if [ "$answer" == "b" -o "$answer" == "B" ]; then
mail -s "error log" boss < error.log;
elif [ "$answer" == "с" -о "$answer" == "C" ]; then
mail -s 'Help!!! error log' -c ivan den < error.log;
else
echo "OK. Exiting"; exit;
fi
Командные интерпретаторы bash и ksh поддерживают циклы типа for, while, until и select, а интерпретатор sh — только циклы for и while.
Синтаксис:
for переменная [in шаблон]
do
список
done
В результате подстановки шаблона получается список слов. Переменная получает значение первого слова из этого списка, и выполняется список команд, стоящий между do и done. Затем переменная получает значение очередного слова из списка слов, и снова выполняется список команд. Повторение прекращается по исчерпании слов в списке. Отсутствие конструкции [in шаблон] эквивалентно записи in $@.
Список слов можно сформировать и вручную:
$ for day in Mon Tue Wed Thu Fri; do echo "План работы на $day:"; cat $day.plan; done
Еще раз напомню, что любой список в bash нужно заканчивать точкой с запятой.
Пример использования цикла с перечислением: допустим, у вас не хочет собираться некий программный пакет — он рассчитывал, что имена заголовочных файлов в некотором каталоге имеют расширение .h, а у вас они такого расширения не имеют (установлена другая версия библиотеки). При этом содержание этих файлов его устраивает. Так создадим символические ссылки, чтобы он нашел заголовки по знакомому имени:
$ cd /путь/к/каталогу/include
$ for name in *; do ln -s $name $name.h; done
Синтаксис:
while список1
do
список2
done
Оператор выполняет список1
и в случае его успешного завершения (нулевого кода возврата) — список2
. Процедура повторяется до тех пор, пока результат выполнения списка1 не станет ненулевым. Например:
$ i = 10
$ while [ $i -gt 0 ]; do
> echo $i...
> i=${($i-1))
> done; echo 'BANG!!!'
$
Тот же самый обратный отсчет можно реализовать и с помощью цикла for, если у вас установлена утилита seq, печатающая последовательность (sequence) чисел с заданным шагом:
$ for i in `seq 10 -1 0`; do echo $i...; done; echo 'BANG!!!'
Синтаксис:
until список1
do
список2
done
Оператор выполняет список1
и, если он выполнен неуспешно (код возврата ненулевой), то выполняет список2
. Процедура повторяется до тех пор, пока результат выполнения списка1
не станет нулевым.
Синтаксис:
select переменная [in шаблон]
do
список
done