Когда переменная х примет значение 10, цикл завершит свою работу, так как программа test вернет значение
until список1 do
список2
done
Цикл until прекратит работу, когда условие, указанное в списке
х=1;
while ! [$х –ge 10]
do echo $x echo $x
X = $ (($Х + 1))
done
х=1;
until [$x –ge 10]
do
X=$(($Х + 1))
done
Циклы, приведенные в листингах 19.4 и 19.5, выведут одинаковую последовательность цифр на экран:
1 2 3 4 5 6 7 8 9 10
Рассмотрим еще один полезный цикл select, который позволяет создавать нумерованные пункты меню. Его конструкция такова:
select имя in список1
do
список2
done
echo "Выберите файл для просмотра
select file in /home/den/temp/* QUIT
do
if [-e $file]; then less $file
else
break
done;
В моем временном каталоге /home/den/temp находится всего два файла — file.txt, proto.txt, поэтому на экране монитора будет отображено следующее:
Выберите файл для просмотра:
/home/den/temp/.
/home/den/temp/..
/home/den/temp/file.txt
/home/den/temp/proto.txt
QUIT
Первые два файла — это ссылки на текущий и родительский каталоги. Пункты меню 3 и 4 — это файлы, которые можно выбрать для просмотра. QUIT — это последний элемент списка. При его выборе сработает оператор break и цикл завершится.
19.7.7. Подстановка переменных
Мы уже рассмотрели подстановку команд, сейчас рассмотрим подстановку переменных (см. табл. 19.41).
Подстановка переменных Таблица 19.41
Конструкция | Описание |
---|---|
${переменная:-значение} | Если переменная определена и не является пустой строкой, подставляется ее значение, иначе подставляется значение, указанное в конструкции. Реальное значение переменной при этом не изменяется |
${переменна:=значение} | Значение присваивается переменной, если она не определена или является пустой строкой |
${переменная:?сообщение} | Если переменная не определена или является пустой строкой, выводится указанное сообщение |
${переменная:+значение} | Если переменная инициализирована (определена), вместо нее используется указанное в конструкции значение. Реальное значение переменной не изменяется |
${переменная} | Если переменная определена, то подставляется ее значение. Скобки используются лишь тогда, если после переменной стоит символ, который может «приклеиться» к имени переменной |
${1 :? "Не хватает параметра"}
Данное сообщение будет выведено, если сценарий будет запущен без параметров. Если указать хотя бы один параметр, сообщение не будет отображаться на экране.
19.7.8. Функции
Описание функции выглядит так:
имя { список; }
cdir
{
# изменяем каталог
cd /
}
При выполнении функция не создает нового процесса, а выполняется в среде процесса, содержащего эту функцию. Аргументы функции можно передать ей как обыкновенные параметры при вызове сценария. Функции можно описывать в любом месте сценария, но вызов функции должен осуществляться только после ее описания. Возвращаясь к примеру, модифицируйте функцию:
#!/bin/bash
# файл fn
echo $$
cdir
{
# изменяем каталог
echo "Х=$Х"
Х=2
echo "Params $0 $# $1 $2"
echo "PID = $$"
return 0
cd $1
}
X=1
echo "X=$X"
cdir /etc
# вызов функции "cd" с параметрами
echo $?
echo "X=$X"
На экране вы увидите примерно следующую информацию:
788
Х=1
Х=1
Params fn l /etc
788
0