| Выражение | Истинно, если |
|---|---|
| -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