♦ -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. приведен фрагмент сценария, позволяющего быстро просмотреть любой из них.
Читать дальше
Конец ознакомительного отрывка
Купить книгу