Чтение онлайн

ЖАНРЫ

Linux-сервер своими руками

Колисниченко Денис Николаевич

Шрифт:

Пример.

х=124 ; export х ; [ 111 –It "$х" ] ; echo $?

0

Поскольку 111 меньше, чем 124, на экране вы увидите 0 (истина).

Примечание. Во всех примерах, вы, наверное, заметили использование команды export. Это необходимо для того, чтобы порожденному процессу (не забывайте: test — это отдельная программа) переменнаях была доступна.

Теперь, когда мы уже знакомы с конструкциями test и if, рассмотрим небольшой пример, демонстрирующий вложенность операторов if и использование команды test. Пример приведен в листинге 19.2.

Листинг 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-esac

Конструкция выбора (case — выбор) имеет следующий синтаксис:

case значение in

шаблон1) список1 ;;

шаблонN) списокN ;;

esac

Рассмотрим сценарий (см. листинг 19.3), аналогичный сценарию 19.2, но использующий конструкцию case вместо if.

Листинг 19.3. Пример использования оператора case

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

Когда переменная х примет значение 10, цикл завершит свою работу, так как программа test вернет значение false (x уже не меньше, а равен 10). Цикл until (до) имеет похожую структуру, но выполняется несколько иначе:

until список1 do

 список2

done

Цикл until прекратит работу, когда условие, указанное в списке список1, станет истинным. Другими словами, он будет выполняться пока это условие ложно. Цикл while, наоборот, выполняется пока условие истинно. Лучше всего разница между этими циклами видна на примере (сравните листинги 19.4 и 19.5)

Листинг 19.4. Цикл while

х=1;

while ! [$х –ge 10]

do echo $x echo $x

 X = $ (($Х + 1))

done

Листинг 19.5. Цикл until

х=1;

until [$x –ge 10]

do

 X=$(($Х + 1))

done

Циклы, приведенные в листингах 19.4 и 19.5, выведут одинаковую последовательность цифр на экран:

1 2 3 4 5 6 7 8 9 10

Рассмотрим еще один полезный цикл select, который позволяет создавать нумерованные пункты меню. Его конструкция такова:

Поделиться с друзьями: