| стр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
