Выбрать главу

# следующей команде "read", в качестве аргумента была передана переменная $fruit

echo

exit 0

$SECONDS

Время работы сценария в секундах.

#!/bin/bash

# Автор: Mendel Cooper

# Дополнен переводчиком.

#

TIME_LIMIT=10

INTERVAL=1

echo

echo "Для прерывания работы сценария, ранее чем через $TIME_LIMIT секунд, нажмите Control-C."

echo

while [ "$SECONDS" -le "$TIME_LIMIT" ]

do

# Оригинальный вариант сценария содержал следующие строки

# if [ "$SECONDS" -eq 1 ]

# then

# units=second

# else

# units=seconds

# fi

#

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

# существует большее число вариантов, чем в английском,

# переводчик позволил себе смелость несколько подправить сценарий

# (прошу ногами не бить! ;-) )

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

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:hashalclass="underline" histexpand:monitor:history:interactive-comments:emacs

$SHLVL

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

echo $SHLVL

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

$TMOUT

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

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

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

Пример 9-2. Ограничения времени ожидания ввода

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