Искусство программирования на языке сценариев командной оболочки
Шрифт:
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 "соединение
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"
# Упражнение: Найдите сильные и слабые стороны
# каждого из этих подходов.
Пример 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
trap '' 2 # Сигнал 2 (Control-C) -- запрещен.
command
command
command
trap 2 # Разрешение реакции на Control-C
Глава 30. Необязательные параметры (ключи)
Необязательные параметры -- это дополнительные ключи (опции), которые оказывают влияние на поведение сценария и/или командной оболочки.
Команда set позволяет задавать дополнительные опции прямо внутри сценария. В том месте сценария, где необходимо, чтобы та или иная опция вступила в силу, вставьте такую конструкцию set -o option-name, или в более короткой форме -- set -option-abbrev. Эти две формы записи совершенно идентичны по своему действию.
#!/bin/bash
set -o verbose
# Вывод команд перед их исполнением.
#!/bin/bash
set -v
# Имеет тот же эффект, что и выше.
#!/bin/bash
set -o verbose
# Вывод команд перед их исполнением.
command
...
command
set +o verbose
#
command
# команда не выводится.
set -v
# Вывод команд перед их исполнением.
command
...
command
set +v
# Запретить вывод команд перед их исполнением.
command
exit 0
Как вариант установки опций, можно предложить указывать их в заголовке сценария (в строке sha-bang) -- #!.
#!/bin/bash -x
#
# Далее следует текст сценария.
Так же можно указывать дополнительные ключи в командной строке, при запуске сценария. Некоторые из опций работают только если они заданы из командной строки, например – i– - ключ интерактивного режима работы скрипта.
bash -v script-name
bash -o verbose script-name
Ниже приводится список некоторых полезных опций, которые могут быть указаны как в полной форме так и в сокращенной.
Таблица 30-1. Ключи Bash
Краткое имя | Полное имя | Описание |
---|---|---|
– C | noclobber | Предотвращает перезапись файла в операциях перенаправления вывода (не распространяется на конвейеры (каналы) -- >|) |
– D | (нет) | Выводит список строк в двойных кавычках, которым предшествует символ $, сам сценарий не исполняется |
– a | allexport | Экспорт всех, определенных в сценарии, переменных |
– b | notify | Выводит уведомление по завершении фоновой задачи (job) (довольно редко используется в сценариях) |
– c ... | (нет) | Читает команды из ... |
– f | noglob | Подстановка имен файлов (globbing) запрещена |
– i | interactive | Сценарий запускается в интерактивном режиме |
– p | privileged | Сценарий запускается как "suid" (осторожно!) |
– r | restricted | Сценарий запускается в ограниченном режиме (см. Глава 20). |
– u | nounset | При попытке обращения к неопределенным переменным, выдает сообщение об ошибке и прерывает работу сценария |
– v | verbose | Выводит на stdout каждую команду прежде, чем она будет исполнена |
– x | xtrace | Подобна -v, но выполняет подстановку команд |
– e | errexit | Прерывает работу сценария при появлении первой же ошибки (когда команда возвращает ненулевой код завершения) |
– n | noexec | Читает команды из сценария, но не исполняет их (проверка синтаксиса) |
– s | stdin | Читает команды с устройства stdin |
– t | (нет) | Выход после исполнения первой команды |
– | (нет) | Конец списка ключей (опций), последующие аргументы будут восприниматься как позиционные параметры. |
– - | (нет) | Эквивалент предыдущей опции (-). |