- •Сценарии оболочки
- •Запуск сценария
- •Область видимости переменных
- •Средства ввода-вывода
- •Вычисление арифметических выражений
- •Управляющие конструкции
- •Условный оператор
- •Команда test
- •1. Условия проверки файлов:
- •2. Условия проверки строк:
- •3. Условия сравнения целых чисел:
- •Оператор выбора
- •Операторы цикла Язык оболочки позволяет организовывать циклическое выполнение команд. В распоряжение пользователю предлагается 4 варианта циклов: while, until, for и select.
Операторы цикла Язык оболочки позволяет организовывать циклическое выполнение команд. В распоряжение пользователю предлагается 4 варианта циклов: while, until, for и select.
Цикл while
Оператор цикла while имеет следующий синтаксис:
while <условие>
do
<список>
done
При выполнении цикла сначала выполняется список команд, представляющих <условие>. Если результат ненулевой, то происходит выход из цикла, в противном случае выполняется тело цикла <список> и происходит переход на следующую итерацию. Хотя в качестве условия <команда> может использоваться любая допустимая в UNIX команда, обычно это команда test.
Ниже приведен пример сценария, в котором производится выдача на терминал десяти последовательных чисел от 0 до 9.
#!/bin/sh
x=0
while [ $x –lt 10 ] # значение переменной x меньше 10?
do
echo $x # выводим х
x=`expr $x + 1` # увеличиваем x на 1
done
В следующем примере в файл log каждую минуту записывается текущая дата и время:
#!/bin/bash
while (true)
do
date >> log
sleep 60 # подождать минуту
done
Цикл until
Оператор цикла until аналогичен оператору while и имеет следующий синтаксис:
until <условие>
do
<список>
done
Отличие между циклами while и until заключается в том, что результат, возвращаемый при выполнении списка команд <условия>, берется с отрицанием: <список> выполняется в том случае, если последняя команда в списке <условие> возвращает ненулевой статус выхода.
Ниже приведен пример сценария, в котором производится выдача на терминал десяти последовательных чисел от 0 до 9, но уже с использованием цикла until.
#!/bin/sh
x=0
until [ $x -ge 10 ] # значение переменной x больше или равно 10?
do
echo $x # выводим х
x=`expr $x + 1` # увеличиваем x на 1
done
Цикл for
Цикл for выполняет команды из <списка> для каждого <элемента> и имеет следующий синтаксис:
for <переменная> [in <элемент1> <элемент2> … <элементN>]
do
<список>
done
Оператор for работает немного не так, как в обычных языках программирования. Вместо того чтобы организовывать увеличение или уменьшение на единицу значения некоторой переменной при каждом проходе цикла, он при каждом проходе цикла присваивает переменной очередное значение из заданного списка элементов. В качестве элементов можно использовать различные шаблоны.
Если конструкция [in <элемент1> <элемент2> … <элементN>] опущена, то список команд <список> выполняется один раз для каждого позиционного параметра, который задан.
Рассмотрим пример использования цикла for:
#!/bin/sh
for FILE in $HOME/*.txt
do
cp $FILE ${HOME}/scripts
chmod a+r ${HOME}/texts/${FILE}
done
В приведённом примере все файлы из домашнего каталога пользователя, которые заканчиваются на .txt, копируются в каталог texts и делаются доступными для чтения всем пользователям.
Язык программирования оболочки содержит операторы, нарушающие нормальное выполнение цикла. Эти операторы имеют названия – break (позволяет выполнить безусловный выход из цикла) и continue (приводит к тому, что программа немедленно переходит к следующей итерации цикла без выполнения остальных команд в цикле).
Цикл select
Цикл select позволяет создавать удобные меню. Он полезен, когда необходимо, чтобы пользователь выбрал один элемент из предлагаемого списка. Оператор select имеет такой же вид, как и оператор for, за исключением ключевого слова:
select <переменная> [in <элемент1> <элемент2> … <элементN>]
do
<список>
done
При выполнении данного оператора цикла все элементы из списка высвечиваются на экране вместе с их порядковыми номерами, после чего появляется специальное приглашение для ввода. Обычно оно имеет вид #? (стандартное приглашение PS3).
Введённый пользователем номер пункта меню записывается в переменную REPLY, а в <переменную> заносится значение соответствующего <элемента> из списка элементов. Если введена пустая строка, то список для выбора будет выдан заново.
После того как пользователем будет сделан допустимый выбор, выполнятся команды из <списка>, после чего выполнение цикла повторяется с самого начала. Выход из цикла осуществляется теми же средствами, что и для while и for.
Пример:
#!/bin/bash
echo What operating system do you prefer?
select name in "Red Hat Linux" "Ubuntu" "Free BSD" "Other"; do
break
done
if [ $REPLY == 1 ]
then
echo You chose $name. Good choice!
elif [ $REPLY == 2 -o $REPLY == 3 -o $REPLY == 4 ]
then
echo You chose $name.
else
echo You must choose the right number!
fi
После запуска этого сценария на экран будет выдан следующий запрос:
What operating system do you prefer?
1) Red Hat Linux
2) Ubuntu
3) Free BSD
4) Other
#?
Оболочка ожидает ввода строки на стандартном вводе после символов #?. Нажмите любую из 4 предложенных цифр (1, 2, 3 или 4) и увидите соответствующее сообщение. Если вы, например, введете 1, то увидите сообщение:
You chose Red Hat Linux. Good choice!
При вводе цифры, отличной от 1, 2, 3 или 4, вы увидите сообщение
You must choose the right number!