Теперь, когда мы уже знакомы с конструкциями test и if, рассмотрим небольшой пример, демонстрирующий вложенность операторов if и использование команды test. Пример приведен в листинге 19.2.
echo –n "Какую оценку ты получил сегодня по программированию? "
read x
if [ $х = 5 ]
then echo "Отлично !"
elif [ $х = 4 ]
then echo "Хорошо"
elif [ $x = 3 ]
then echo "Удовлетворительно"
elif [ $x = 2 ]
then echo "Надо бы пересдать"
else
echo "Как вообще можно было получить такую оценку???"
fi
Если вы введете 5, сценарий отобразит на экране слово «Отлично», при вводе 4 вы увидите слово «Хорошо» и так далее. Если вы введете 0, 1 или число больше пяти, вы увидите на экране последнюю фразу: «Как вообще можно было получить такую оценку???».
Конструкция выбора (case — выбор) имеет следующий синтаксис:
case значение in
шаблон1) список1 ;;
…
шаблонN) списокN ;;
esac
Рассмотрим сценарий (см. листинг 19.3), аналогичный сценарию 19.2, но использующий конструкцию case вместо if.
echo –n " Какую оценку ты получил сегодня по программированию? "
read x
case $x in
5) echo "Отлично !" ;;
4) echo "Хорошо" ;;
3) echo "Удовлетворительно" ;;
2) echo "Надо бы пересдать" ;;
*) echo "Как вообще можно было получить такую оценку???" ;;
esac
Работа сценария аналогична первому сценарию: при вводе оценок 2, 3, 4, 5 будут отображены соответствующие сообщения, а во всех остальных случаях — последнее сообщение.
Примечание. Структура оператора case больше напоминает структуру оператора case в языке Pascal, чем в языке С. Последняя строка выбора с шаблоном *) будет выбрана, когда не произойдет ни одного совпадения с ранее указанными шаблонами. Если же произошло совпадение с шаблоном шаблонN, то будет выполнен список списокN. После выполнения списка команд списокN будет произведен выход из структуры case —так же как и в Pascal. В языке С наблюдается нечто другое: если будет обнаружено совпадение, скажем с шаблоном3, то будут выполнены последовательности операторов 3, 4, 5, … N. Чтобы прервать выполнение блока case в языке С нужно использовать оператор break. В bash же такого нет.
Если для одного списка команд нужно описать два или более шаблонов, используется символ | (OR).
case num in
1|2|3) echo "1 or 2 or 3" ;;
4|5) echo "4 or 5" ;;
*) echo "other num" ;;
esac
Интерпретаторы bash и ksh поддерживают циклы for, while, until, select, a интерпретатор sh только for и while.
Синтаксис цикла for:
for имя_переменной in список1 do
список2
done
Простой пример:
for i in 1 2 3 4 5; do echo $i; done
На экране вы увидите:
1 2 3 4 5
Еще раз напомню, что любой список в bash должен заканчиваться точкой с запятой. Начинающие «программисты» делают много ошибок, связанных именно с этой особенностью списков. Пример использования: построчно вывести содержимое файла /etc/passwd вы можете с помощью такого цикла:
for str in `cat /etc/passwd` do
echo "$str";
done
Цикл for закончит свою работу, когда будет обработан последний элемент списка, в данном случае, когда на экран будет выведена последняя строка файла /etc/passwd.
Синтаксис цикла while:
while список1 do
список2
done
Цикл while будет выполняться, пока условие, заданное в списке
будет истинным. Поэтому цикл while иногда называют циклом с истинным условием. Например,
х=1
while [$х –It 10]
do
echo $х
X = $(( $Х + 1 ))
done
На экране вы увидите:
1 2 3 4 5 6 7 8 9