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

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

Жанры

Командная строка Linux
Шрифт:

По-настоящему мощной особенностью for является разнообразие способов формирования списка слов. Например, можно использовать подстановку в фигурных скобках:

[me@linuxbox ~]$ for i in {A..D}; do echo $i; done

A

B

C

D

или подстановку имен файлов:

[me@linuxbox ~]$ for i in distros*.txt; do echo $i; done

distros-by-date.txt

distros-dates.txt

distros-key-names.txt

distros-key-vernums.txt

distros-names.txt

distros.txt

distros-vernums.txt

distros-versions.txt

или

подстановку команд:

#!/bin/bash

# longest-word : поиск самой длинной строки в файле

while [[ -n $1 ]]; do

if [[ -r $1 ]]; then

max_word=

max_len=0

for i in $(strings $1); do

len=$(echo $i | wc -c)

if (( len > max_len )); then

max_len=$len

max_word=$i

fi

done

echo "$1: '$max_word' ($max_len characters)"

fi

shift

done

Этот пример осуществляет поиск самой длинной строки в файле. Когда в командной строке указано несколько имен файлов, сценарий вызывает процедуру strings (входит в состав пакета GNU binutils), чтобы получить список «слов» из каждого файла. Цикл for обрабатывает каждое слово по очереди и определяет, является ли оно самым длинным из встречавшихся до сих пор. По завершении цикла сценарий выводит самое длинное слово.

Если необязательный компонент слова в команде for отсутствует, она по умолчанию обрабатывает позиционные параметры. Чтобы показать использование этого способа, изменим сценарий longest-word:

#!/bin/bash

# longest-word2 : поиск самой длинной строки в файле

for i; do

if [[ -r $i ]]; then

max_word=

max_len=0

for j in $(strings $i); do

len=$(echo $j | wc -c)

if (( len > max_len )); then

max_len=$len

max_word=$j

fi

done

echo "$i: '$max_word' ($max_len characters)"

fi

done

Почему i?

Вы могли заметить, что во всех примерах цикла for выше использовалась переменная i. Почему? В действительности за этим выбором не стоят какие-то определенные причины, кроме стремления следовать традициям. В команде for можно использовать любую допустимую переменную, но чаще всего используется переменная i, а также j и k.

Своими корнями эта традиция уходит в язык программирования Fortran. В Fortran необъявленные переменные, начинающиеся с букв I, J, K, L и M, автоматически становились целочисленными, тогда как переменные, начинающиеся с любой другой буквы, — действительными,

или вещественными (способны хранить числа с дробной частью). Эта особенность вынуждала программистов использовать переменные I, J и K в качестве переменных цикла, так как использование их в качестве временных переменных (чем переменные цикла в действительности и являются) требовало меньших усилий.

Из-за этого даже в среде программистов на Fortran ходила острота: «GOD is real, unless declared integer» (Бог действителен, пока явно не объявлен целым).

Как видите, мы заменили внешний цикл while циклом for. Так как список слов в команде for отсутствует, она перебирает позиционные параметры. Во внутреннем цикле вместо переменной i теперь используется переменная j. Кроме того, нам больше не нужна команда shift.

for: форма в стиле языка C

В некоторые версии bash добавлена вторая форма синтаксиса команды for, напоминающая одноименный оператор в языке программирования C, которая поддерживается также многими другими языками.

for (( выражение1; выражение2; выражение3 )); do

команды

done

где выражение1, выражение2 и выражение3 — это арифметические выражения, а коман­ды — это команды, выполняемые в каждой итерации цикла.

Своим поведением эта форма эквивалентна следующей конструкции:

(( выражение1 ))

while (( выражение2 )); do

команды

(( выражение3 ))

done

выражение1 инициализирует цикл, выражение2 определяет условие завершения цикла, выражение3 выполняется в конце каждой итерации.

Ниже приводится пример типичного применения:

#!/bin/bash

# simple_counter : демонстрация команды for в стиле языка C

for (( i=0; i<5; i=i+1 )); do

echo $i

done

Этот сценарий произведет следующий вывод:

[me@linuxbox ~]$ simple_counter

0

1

2

3

4

Здесь выражение1 инициализирует переменную i значением 0, выражение2 позволяет продолжать итерации, пока значение i остается меньше 5, выражение3 увеличивает на единицу значение i в конце каждой итерации.

Форма команды for в стиле языка C выглядит предпочтительнее, если требуется работать с числовыми последовательностями. Несколько примеров ее применения будут приведены в следующих двух главах.

Заключительное замечание

Поделиться:
Популярные книги

Архил...? 4

Кожевников Павел
4. Архил...?
Фантастика:
фэнтези
попаданцы
альтернативная история
5.50
рейтинг книги
Архил...? 4

Мятежник

Прокофьев Роман Юрьевич
4. Стеллар
Фантастика:
боевая фантастика
7.39
рейтинг книги
Мятежник

Дурашка в столичной академии

Свободина Виктория
Фантастика:
фэнтези
7.80
рейтинг книги
Дурашка в столичной академии

Котенок. Книга 3

Федин Андрей Анатольевич
3. Котенок
Фантастика:
попаданцы
альтернативная история
5.00
рейтинг книги
Котенок. Книга 3

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

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

Печать мастера

Лисина Александра
6. Гибрид
Фантастика:
попаданцы
технофэнтези
аниме
фэнтези
6.00
рейтинг книги
Печать мастера

Господин следователь. Книга 3

Шалашов Евгений Васильевич
3. Господин следователь
Детективы:
исторические детективы
5.00
рейтинг книги
Господин следователь. Книга 3

Вернуть невесту. Ловушка для попаданки 2

Ардова Алиса
2. Вернуть невесту
Любовные романы:
любовно-фантастические романы
7.88
рейтинг книги
Вернуть невесту. Ловушка для попаданки 2

Командир Красной Армии

Поселягин Владимир Геннадьевич
1. Командир Красной Армии
Фантастика:
попаданцы
8.72
рейтинг книги
Командир Красной Армии

Рота Его Величества

Дроздов Анатолий Федорович
Новые герои
Фантастика:
боевая фантастика
8.55
рейтинг книги
Рота Его Величества

Босс Мэн

Киланд Ви
Любовные романы:
современные любовные романы
8.97
рейтинг книги
Босс Мэн

Два лика Ирэн

Ром Полина
Любовные романы:
любовно-фантастические романы
6.08
рейтинг книги
Два лика Ирэн

Не грози Дубровскому! Том III

Панарин Антон
3. РОС: Не грози Дубровскому!
Фантастика:
фэнтези
попаданцы
аниме
5.00
рейтинг книги
Не грози Дубровскому! Том III

Идеальный мир для Лекаря 27

Сапфир Олег
27. Лекарь
Фантастика:
аниме
фэнтези
5.00
рейтинг книги
Идеальный мир для Лекаря 27