♦ -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
8.4.2. Операторы цикла
Командные интерпретаторы bashи kshподдерживают циклы типа for, while, until и select, а интерпретатор sh— только циклы for и while.
Оператор цикла с перечислением for
Синтаксис:
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
Синтаксис:
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
Синтаксис:
until список1
do
список2
done
Оператор выполняет список1и, если он выполнен неуспешно (код возврата ненулевой), то выполняет список2. Процедура повторяется до тех пор, пока результат выполнения списка1не станет нулевым.
Оператор цикла с выбором select
Синтаксис:
select переменная [in шаблон]
do
список
done
В результате подстановки шаблона получается список слов. К этим словам оператор добавляет порядковые номера и выводит весь набор в стандартный поток ошибок ( stderr ). Если шаблон опущен, то вместо него используется список позиционных параметров. После этого оболочка выводит приглашение и считывает строку из стандартного потока ввода ( stdin ). Если строка содержит номер, соответствующий какому-либо слову из списка, то переменная получает это слово в качестве значения. Если в строке подходящего номера нет, то значением переменной становится пустая строка. После этого выполняется список команд, и процедура повторяется до тех пор, пока в строке ввода не встретится символ конца файла (введите Ctrl+D) или пока в списке команд не встретится команда breakили return.
Этот оператор полезен для создания нумерованных пунктов меню. Например, у меня в каталоге ~/tempесть три файла: proto.txt, file.txtи README. В листинге 8.3. приведен фрагмент сценария, позволяющего быстро просмотреть любой из них.
Читать дальше
Конец ознакомительного отрывка
Купить книгу