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


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


KEYWORD=address # При входе, в файл /var/log/messages, # добавляется строка "remote IP address xxx.xxx.xxx.xxx" ONLINE=22 USER_INTERRUPT=13 CHECK_LINES=100 # Количество проверяемых строк.

trap 'rm -f $TEMPFILE; exit $USER_INTERRUPT' TERM INT # Удалить временный файл, когда сценарий завершает работу по control-c.

echo

while [ $TRUE ] #Бесконечный цикл. do tail -$CHECK_LINES $LOGFILE> $TEMPFILE # Последние 100 строк из системного журнала переписать во временный файл. # Совершенно необходимо, т.к. новейшие версии ядер генерируют много сообщений при входе. search=`grep $KEYWORD $TEMPFILE` # Проверить наличие фразы "address", # свидетельствующей об успешном входе.

if [ ! -z "$search" ] # Кавычки необходимы, т.к. переменная может содержать пробелы. then echo "On-line" rm -f $TEMPFILE # Удалить временный файл. exit $ONLINE else echo -n "." # ключ -n подавляет вывод символа перевода строки, # так вы получите непрерывную строку точек. fi

sleep 1 done

# Обратите внимание: если изменить содержимое переменной KEYWORD # на "Exit", то сценарий может использоваться для контроля # неожиданного выхода (logoff).

exit 0

# Nick Drage предложил альтернативный метод:

while true do ifconfig ppp0 | grep UP 1> /dev/null && echo "соединение установлено" && exit 0 echo -n "." # Печать последовательности точек (.....), пока соединение не будет установлено. sleep 2 done

# Проблема: Нажатия Control-C может оказаться недостаточным, чтобы завершить этот процесс. # (Точки продолжают выводиться на экран.) # Упражнение: Исправьте этот недостаток.

# Stephane Chazelas предложил еще одну альтернативу:

CHECK_INTERVAL=1

while ! tail -1 "$LOGFILE" | grep -q "$KEYWORD" do echo -n . sleep $CHECK_INTERVAL done echo "On-line"

# Упражнение: Найдите сильные и слабые стороны # каждого из этих подходов.

Аргумент DEBUG, команды trap, заставляет сценарий выполнять указанное действие после выполнения каждой команды. Это можно использовать для трассировки переменных.

Пример 29-7. Трассировка переменной

#!/bin/bash

trap 'echo "VARIABLE-TRACE> $LINENO: \$variable = \"$variable\""' DEBUG # Выводить значение переменной после исполнения каждой команды.

variable=29

echo "Переменная \"\$variable\" инициализирована числом $variable."

let "variable *= 3" echo "Значение переменной \"\$variable\" увеличено в 3 раза."

# Конструкция "trap 'commands' DEBUG" может оказаться очень полезной # при отладке больших и сложных скриптов, # когда размещение множества инструкций "echo $variable" # может потребовать достаточно большого времени.

# Спасибо Stephane Chazelas.

exit 0

<


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