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

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

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

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

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

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

#

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

exit 0

<p><strong>Пример 16-5. Альтернативная форма перенаправления в цикле </strong><emphasis><strong>while</strong></emphasis></p>

#!/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

<p><strong>Пример 16-6. Перенаправление в цикл </strong><emphasis><strong>until</strong></emphasis></p>

#!/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

<p><strong>Пример 16-7. Перенаправление в цикл </strong><emphasis><strong>for</strong></emphasis></p>

#!/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" --

do

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

echo $name

if [ "$name" = Smith ]

then

break

fi

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

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

exit 0

Предыдущий пример можно модифицировать так, чтобы перенаправить вывод из цикла.

<p><strong>Пример 16-8. Перенаправление устройств (stdin и stdout) в цикле </strong><emphasis><strong>for</strong></emphasis></p>

#!/bin/bash

if [ -z "$1" ]

then

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

else

Filename=$1

fi

Savefile=$Filename.new # Имя файла, в котором сохраняются результаты.

FinalName=Jonah # Имя, на котором завершается чтение.

line_count=`wc $Filename | awk '{ print $1 }'` # Число строк в заданном файле.

for name in `seq $line_count`

do

read name

echo "$name"

if [ "$name" = "$FinalName" ]

then

break

fi

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

# ^^^^^^^^^^^^^^^^^^^^^^^^^^^ и сохранение результатов в файле.

exit 0

<p><strong>Пример 16-9. Перенаправление в конструкции </strong><emphasis><strong>if/then</strong></emphasis></p>

#!/bin/bash

if [ -z "$1" ]

then

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

else

Filename=$1

fi

TRUE=1

if [ "$TRUE" ] # конструкции "if true" и "if :" тоже вполне допустимы.

then

read name

echo $name

fi <"$Filename"

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

# Читает только первую строку из файла.

exit 0

<p><strong>Пример 16-10. Файл с именами "names.data", для примеров выше</strong></p>

Aristotle

Belisarius

Capablanca

Euler

Goethe

Hamurabi

Jonah

Laplace

Maroczy

Purcell

Schmidt

Semmelweiss

Smith

Turing

Venn

Wilson

Znosko-Borowski

# Это файл с именами для примеров

#+ "redir2.sh", "redir3.sh", "redir4.sh", "redir4a.sh", "redir5.sh".

Перенаправление stdout для блока кода, может использоваться для сохранения результатов работы этого блока в файл. См. Пример 3-2.

Встроенный документ -- это особая форма перенаправления для блоков кода.

<p><strong>16.3. Область применения</strong></p>

Как один из вариантов грамотного применения перенаправления ввода/вывода, можно назвать разбор и "сшивание" вывода от команд (см. Пример 11-6). Это позволяет создавать файлы отчетов и журналов регистрации событий.

<p><strong>Пример 16-11. Регистрация событий</strong></p>

#!/bin/bash

# logevents.sh, автор: Stephane Chazelas.

# Регистрация событий в файле.

Перейти на страницу:

Похожие книги

1С: Бухгалтерия 8 с нуля
1С: Бухгалтерия 8 с нуля

Книга содержит полное описание приемов и методов работы с программой 1С:Бухгалтерия 8. Рассматривается автоматизация всех основных участков бухгалтерии: учет наличных и безналичных денежных средств, основных средств и НМА, прихода и расхода товарно-материальных ценностей, зарплаты, производства. Описано, как вводить исходные данные, заполнять справочники и каталоги, работать с первичными документами, проводить их по учету, формировать разнообразные отчеты, выводить данные на печать, настраивать программу и использовать ее сервисные функции. Каждый урок содержит подробное описание рассматриваемой темы с детальным разбором и иллюстрированием всех этапов.Для широкого круга пользователей.

Алексей Анатольевич Гладкий

Программирование, программы, базы данных / Программное обеспечение / Бухучет и аудит / Финансы и бизнес / Книги по IT / Словари и Энциклопедии
1С: Управление торговлей 8.2
1С: Управление торговлей 8.2

Современные торговые предприятия предлагают своим клиентам широчайший ассортимент товаров, который исчисляется тысячами и десятками тысяч наименований. Причем многие позиции могут реализовываться на разных условиях: предоплата, отсрочка платежи, скидка, наценка, объем партии, и т.д. Клиенты зачастую делятся на категории – VIP-клиент, обычный клиент, постоянный клиент, мелкооптовый клиент, и т.д. Товарные позиции могут комплектоваться и разукомплектовываться, многие товары подлежат обязательной сертификации и гигиеническим исследованиям, некондиционные позиции необходимо списывать, на складах периодически должна проводиться инвентаризация, каждая компания должна иметь свою маркетинговую политику и т.д., вообщем – современное торговое предприятие представляет живой организм, находящийся в постоянном движении.Очевидно, что вся эта кипучая деятельность требует автоматизации. Для решения этой задачи существуют специальные программные средства, и в этой книге мы познакомим вам с самым популярным продуктом, предназначенным для автоматизации деятельности торгового предприятия – «1С Управление торговлей», которое реализовано на новейшей технологической платформе версии 1С 8.2.

Алексей Анатольевич Гладкий

Финансы / Программирование, программы, базы данных