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

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

Жанры

Искусство программирования на языке сценариев командной оболочки

Купер Мендель

Шрифт:

exec > $2 # Назначить вывод в выходной файл.

# Предполагается, что выходной файл доступен для записи

# (добавить проверку?).

# -----------------------------------------------

cat - | tr a-z A-Z # Перевод в верхний регистр

# ^^^^^ # Чтение со stdin.

# ^^^^^^^^^^ # Запись в stdout.

# Однако, и stdin и stdout были перенаправлены.

# -----------------------------------------------

exec 1>&7 7>&- # Восстановить stdout.

exec 0<&4 4<&- #

Восстановить stdin.

# После восстановления, следующая строка выводится на stdout, чего и следовало ожидать.

echo "Символы из \"$1\" преобразованы в верхний регистр, результат записан в \"$2\"."

exit 0

16.2. Перенаправление для блоков кода

Блоки кода, такие как циклы while, until и for, условный оператор if/then, так же могут смешиваться с перенаправлением stdin. Даже функции могут использовать эту форму перенаправления (см. Пример 22-7). Оператор перенаправления <, в таких случаях, ставится в конце блока.

Пример 16-4. Перенаправление в цикл while

#!/bin/bash

if [ -z "$1" ]

then

Filename=names.data # По-умолчанию, если имя файла не задано.

else

Filename=$1

fi

# Конструкцию проверки выше, можно заменить следующей строкой (подстановка параметров):

#+ Filename=${1:-names.data}

count=0

echo

while [ "$name" != Smith ] # Почему переменная $name взята в кавычки?

do

read name # Чтение из $Filename, не со stdin.

echo $name

let "count += 1"

done <"$Filename" # Перенаправление на ввод из файла $Filename.

# ^^^^^^^^^^^^

echo; echo "Имен прочитано: $count"; echo

# Обратите внимание: в некоторых старых командных интерпретаторах,

#+ перенаправление в циклы приводит к запуску цикла в субоболочке (subshell).

# Таким образом, переменная $count, по окончании цикла, будет содержать 0,

# значение, записанное в нее до входа в цикл.

# Bash и ksh стремятся избежать запуска субоболочки (subshell), если это возможно,

#+ так что этот сценарий, в этих оболочках, работает корректно.

#

# Спасибо Heiner Steven за это примечание.

exit 0

Пример 16-5. Альтернативная форма перенаправления в цикле while

#!/bin/bash

# Это альтернативный вариант предыдущего сценария.

#

Предложил: by Heiner Steven

#+ для случаев, когда циклы с перенаправлением

#+ запускаются в субоболочке, из-за чего переменные, устанавливаемые в цикле,

#+ не сохраняют свои значения по завершении цикла.

if [ -z "$1" ]

then

Filename=names.data # По-умолчанию, если имя файла не задано.

else

Filename=$1

fi

exec 3<&0 # Сохранить stdin в дескр. 3.

exec 0<"$Filename" # Перенаправить stdin.

count=0

echo

while [ "$name" != Smith ]

do

read name # Прочитать с перенаправленного stdin ($Filename).

echo $name

let "count += 1"

done <"$Filename" # Цикл читает из файла $Filename.

# ^^^^^^^^^^^^

exec 0<&3 # Восстановить stdin.

exec 3<&- # Закрыть временный дескриптор 3.

echo; echo "Имен прочитано: $count"; echo

exit 0

Пример 16-6. Перенаправление в цикл until

#!/bin/bash

# То же самое, что и в предыдущем примере, только для цикла "until".

if [ -z "$1" ]

then

Filename=names.data # По-умолчанию, если файл не задан.

else

Filename=$1

fi

# while [ "$name" != Smith ]

until [ "$name" = Smith ] # Проверка != изменена на =.

do

read name # Чтение из $Filename, не со stdin.

echo $name

done <"$Filename" # Перенаправление на ввод из файла $Filename.

# ^^^^^^^^^^^^

# Результаты получаются теми же, что и в случае с циклом "while", в предыдущем примере.

exit 0

Пример 16-7. Перенаправление в цикл for

#!/bin/bash

if [ -z "$1" ]

then

Filename=names.data # По-умолчанию, если файл не задан.

else

Filename=$1

fi

line_count=`wc $Filename | awk '{ print $1 }'`

# Число строк в файле.

#

# Слишком запутано, тем не менее показывает

#+ возможность перенаправления stdin внутри цикла "for"...

#+ если вы достаточно умны.

#

# Более короткий вариант line_count=$(wc < "$Filename")

for name in `seq $line_count` # "seq" выводит последовательность чисел.

# while [ "$name" != Smith ] -- более запутанно, чем в случае с циклом "while" --

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

Вечный. Книга V

Рокотов Алексей
5. Вечный
Фантастика:
боевая фантастика
попаданцы
рпг
5.00
рейтинг книги
Вечный. Книга V

Чехов. Книга 3

Гоблин (MeXXanik)
3. Адвокат Чехов
Фантастика:
альтернативная история
5.00
рейтинг книги
Чехов. Книга 3

Последний попаданец 9

Зубов Константин
9. Последний попаданец
Фантастика:
юмористическая фантастика
рпг
5.00
рейтинг книги
Последний попаданец 9

Серые сутки

Сай Ярослав
4. Медорфенов
Фантастика:
фэнтези
аниме
5.00
рейтинг книги
Серые сутки

Ты нас предал

Безрукова Елена
1. Измены. Кантемировы
Любовные романы:
современные любовные романы
5.00
рейтинг книги
Ты нас предал

Кодекс Охотника. Книга XXIII

Винокуров Юрий
23. Кодекс Охотника
Фантастика:
боевая фантастика
попаданцы
5.00
рейтинг книги
Кодекс Охотника. Книга XXIII

На границе империй. Том 7. Часть 4

INDIGO
Вселенная EVE Online
Фантастика:
боевая фантастика
космическая фантастика
5.00
рейтинг книги
На границе империй. Том 7. Часть 4

Нефилим

Демиров Леонид
4. Мания крафта
Фантастика:
фэнтези
боевая фантастика
рпг
7.64
рейтинг книги
Нефилим

Провинциал. Книга 1

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

Восход. Солнцев. Книга IV

Скабер Артемий
4. Голос Бога
Фантастика:
фэнтези
попаданцы
аниме
5.00
рейтинг книги
Восход. Солнцев. Книга IV

Солдат Империи

Земляной Андрей Борисович
1. Страж
Фантастика:
попаданцы
альтернативная история
6.67
рейтинг книги
Солдат Империи

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

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

Сиротка

Первухин Андрей Евгеньевич
1. Сиротка
Фантастика:
фэнтези
попаданцы
5.00
рейтинг книги
Сиротка

Сумеречный стрелок 7

Карелин Сергей Витальевич
7. Сумеречный стрелок
Фантастика:
городское фэнтези
попаданцы
аниме
5.00
рейтинг книги
Сумеречный стрелок 7