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

на главную - закладки

Жанры

Linux: Полное руководство

Аллен Питер В.

Шрифт:

else

 echo "OK. Exiting"; exit;

fi

8.4.2. Операторы цикла

Командные интерпретаторы bash и ksh поддерживают циклы типа for, while, until и select, а интерпретатор sh — только циклы for и while.

Оператор цикла с перечислением for

Синтаксис:

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

Синтаксис:

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

Синтаксис:

until список1

do

 список2

done

Оператор выполняет

список1
и, если он выполнен неуспешно (код возврата ненулевой), то выполняет
список2
. Процедура повторяется до тех пор, пока результат выполнения
списка1
не станет нулевым.

Оператор цикла с выбором select

Синтаксис:

select переменная [in шаблон]

do

 список

done

В результате подстановки шаблона получается список слов. К этим словам оператор добавляет порядковые номера и выводит весь набор в стандартный поток ошибок (stderr). Если шаблон опущен, то вместо него используется список позиционных параметров. После этого оболочка выводит приглашение и считывает строку из стандартного потока ввода (stdin). Если строка содержит номер, соответствующий какому-либо слову из списка, то переменная получает это слово в качестве значения. Если в строке подходящего номера нет, то значением переменной становится пустая строка. После этого выполняется список команд, и процедура повторяется до тех пор, пока в строке ввода не встретится символ конца файла (введите Ctrl+D) или пока в списке команд не встретится команда break или return.

Этот оператор полезен для создания нумерованных пунктов меню. Например, у меня в каталоге

~/temp
есть три файла:
proto.txt
,
file.txt
и
README
. В листинге 8.3. приведен фрагмент сценария, позволяющего быстро просмотреть любой из них.

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

echo "Выберите файл для просмотра:"

select file in ~/temp/* Quit;

do

 if [ -f $file ]; then cat $file;

 else break;

 fi

done

Запустив этот сценарий, я увижу на экране:

Выберите файл для просмотра:

1) /home/den/temp/file.txt

2) /home/den/temp/proto.txt

3) /home/den/temp/README

4) Quit

#?

Последняя строка — это приглашение, устанавливаемое переменной окружения PS3.

8.5. Условная подстановка параметров

Условная подстановка позволяет проверить, установлен ли определенный параметр, или использовать вместо его значения другое. Значение самого параметра при этом не изменяется. Допустимые виды условных подстановок перечислены в таблице 8.4.

Условная подстановка Таблица 8.4

Конструкция Выполняет подстановку
${параметр:-строка} Значение по умолчанию. Если параметр имеет непустое значение, то подставляется оно, иначе — указанная строка
${параметр:=строка} Присваивание значения по умолчанию. Если параметр не имеет непустого значений, то ему присваивается «строка», после чего значение подставляется. Конструкция допустима только для переменных оболочки
${параметр:?сообщение} Ошибка, если пусто. Если параметр не имеет непустого значения, то выводится указанное сообщение. Сообщение можно опустить, тогда будет выведено стандартное сообщение
${параметр:+строка} Дополнительное значение. Если параметр имеет непустое значение, подставляется «строка», иначе — пустая строка
${параметр#шаблон} Подставляется значение параметра, в котором из головной части удален наименьший фрагмент, удовлетворяющий шаблону
${параметр##шаблон} Подставляется значение параметра, в котором из головной части удален наибольший фрагмент, удовлетворяющий шаблону
${параметр%шаблон} Подставляется значение параметра, в котором из хвостовой части удален наименьший фрагмент, удовлетворяющий шаблону
${параметр%%шаблон} Подставляется значение параметра, в котором из хвостовой части удален наибольший фрагмент, удовлетворяющий шаблону
${#параметр} Если параметр есть * или @, подставляется количество позиционных параметров, иначе — длина значения параметра в байтах
Поделиться:
Популярные книги

Враг из прошлого тысячелетия

Еслер Андрей
4. Соприкосновение миров
Фантастика:
фэнтези
попаданцы
аниме
5.00
рейтинг книги
Враг из прошлого тысячелетия

Дважды одаренный. Том IV

Тарс Элиан
4. Дважды одаренный
Фантастика:
городское фэнтези
альтернативная история
аниме
7.00
рейтинг книги
Дважды одаренный. Том IV

Древесный маг Орловского княжества 6

Павлов Игорь Васильевич
6. Орловское княжество
Фантастика:
аниме
фэнтези
попаданцы
5.00
рейтинг книги
Древесный маг Орловского княжества 6

Барон меняет правила

Ренгач Евгений
2. Закон сильного
Фантастика:
фэнтези
попаданцы
аниме
5.00
рейтинг книги
Барон меняет правила

Газлайтер. Том 21

Володин Григорий Григорьевич
21. История Телепата
Фантастика:
боевая фантастика
аниме
попаданцы
5.00
рейтинг книги
Газлайтер. Том 21

Революция

Валериев Игорь
9. Ермак
Фантастика:
боевая фантастика
попаданцы
альтернативная история
5.00
рейтинг книги
Революция

Древесный маг Орловского княжества

Павлов Игорь Васильевич
1. Орловское княжество
Фантастика:
аниме
фэнтези
фантастика: прочее
попаданцы
5.00
рейтинг книги
Древесный маг Орловского княжества

Кодекс Охотника XXXI

Винокуров Юрий
31. Кодекс Охотника
Фантастика:
попаданцы
аниме
фэнтези
5.00
рейтинг книги
Кодекс Охотника XXXI

Отмороженный 11.0

Гарцевич Евгений Александрович
11. Отмороженный
Фантастика:
боевая фантастика
рпг
попаданцы
фантастика: прочее
фэнтези
5.00
рейтинг книги
Отмороженный 11.0

Шайтан Иван 3

Тен Эдуард
3. Шайтан Иван
Фантастика:
попаданцы
альтернативная история
7.17
рейтинг книги
Шайтан Иван 3

Черный Маг Императора 18

Герда Александр
18. Черный маг императора
Фантастика:
юмористическое фэнтези
аниме
сказочная фантастика
фэнтези
фантастика: прочее
попаданцы
5.00
рейтинг книги
Черный Маг Императора 18

Виконт. Книга 4. Колонист

Юллем Евгений
Псевдоним `Испанец`
Фантастика:
фэнтези
попаданцы
аниме
7.50
рейтинг книги
Виконт. Книга 4. Колонист

Тринадцатый XI

NikL
11. Видящий смерть
Фантастика:
попаданцы
аниме
фэнтези
фантастика: прочее
5.00
рейтинг книги
Тринадцатый XI

Вор

Леонов Леонид Максимович
Проза:
классическая проза
6.83
рейтинг книги
Вор