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


Программирование на языке сценариев командной оболочки - стр. 212


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")




- Начало -  - Назад -  - Вперед -