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

# === НАЧАЛО БЛОКА ИЗМЕНЕНИЙ, ВНЕСЕННЫХ ПЕРЕВОДЧИКОМ ===

let "last_two_sym = $SECONDS - $SECONDS / 100 * 100" # десятки и единицы

if [ "$last_two_sym" -ge 11 -a "$last_two_sym" -le 19 ]

then

units="секунд" # для чисел, которые заканчиваются на "...надцать"

else

let "last_sym = $last_two_sym - $last_two_sym / 10 * 10" # единицы

case "$last_sym" in

"1" )

units="секунду" # для чисел, заканчивающихся на 1

;;

"2" | "3" | "4" )

units="секунды" # для чисел, заканчивающихся на 2, 3 и 4

;;

* )

units="секунд" # для всех остальных (0, 5, 6, 7, 8, 9)

;;

esac

fi

# === КОНЕЦ БЛОКА ИЗМЕНЕНИЙ, ВНЕСЕННЫХ ПЕРЕВОДЧИКОМ ===

echo "Сценарий отработал $SECONDS $units."

# В случае перегруженности системы, скрипт может перескакивать через отдельные

#+ значения счетчика

sleep $INTERVAL

done

echo -e "\a" # Сигнал!

exit 0

$SHELLOPTS

список допустимых опций интерпретатора shell. Переменная доступна только для чтения.

bash$ echo $SHELLOPTS

braceexpand:hashall:histexpand:monitor:history:interactive-comments:emacs

$SHLVL

Уровень вложенности shell. Если в командной строке

echo $SHLVL

дает 1, то в сценарии значение этой переменной будет больше на 1, т.е. 2.

$TMOUT

Если переменная окружения $TMOUT содержит ненулевое значение, то интерпретатор будет ожидать ввод не более чем заданное число секунд, что, в первичном приглашении (см. описание PS1 выше), может привести к автоматическому завершению сеанса работы.

К сожалению это возможно только во время ожидания ввода с консоли или в окне терминала. А как было бы здорово, если бы можно было использовать эту внутреннюю переменную, скажем в комбинации с командой read! Но в данном контексте эта переменная абсолютно не применима и потому фактически бесполезна в сценариях. (Есть сведения о том, что в ksh время ожидания ввода командой read можно ограничить.)

Организация ограничения времени ожидания ввода от пользователя в сценариях возможна, но это требут довольно сложных махинаций. Как один из вариантов, можно предложить организовать прерывание цикла ожидания по сигналу. Но это потребует написание функции обработки сигналов командой trap (см. Пример 29-5).

<p><strong>Пример 9-2. Ограничения времени ожидания ввода</strong></p>

#!/bin/bash

# timed-input.sh

# TMOUT=3 бесполезно в сценариях

TIMELIMIT=3 # Три секунды в данном случае, но может быть установлено и другое значение

PrintAnswer()

{

if [ "$answer" = TIMEOUT ]

then

echo $answer

else # Чтобы не спутать разные варианты вывода.

echo "Ваше любимое растение $answer"

kill $! # "Прибить" ненужную больше функцию TimerOn, запущенную в фоновом процессе.

# $! -- PID последнего процесса, запущенного в фоне.

fi

}

TimerOn()

{

sleep $TIMELIMIT && kill -s 14 $$ &

# Ждать 3 секунды, после чего выдать sigalarm сценарию.

}

Int14Vector()

{

answer="TIMEOUT"

PrintAnswer

exit 14

}

trap Int14Vector 14 # переназначить процедуру обработки прерывания от таймера (14)

echo "Ваше любимое растение? "

TimerOn

read answer

PrintAnswer

# По общему признанию, это не очень хороший способ ограничения времени ожидания,

#+ однако опция "-t"команды "read" упрощает задачу.

# См. "t-out.sh", ниже.

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

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

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

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

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

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

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

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

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