Вход/Регистрация
Основы программирования в Linux
вернуться

Мэтью Нейл

Шрифт:

#!/bin/sh

echo the date is $(date)

set $(date)

echo The month is $2

exit 0

Программа задает список параметров для вывода команды

date
и затем использует позиционный параметр
$2
для получения названия месяца.

Мы использовали команду

date
только как простой пример, демонстрирующий, как извлекать позиционные параметры. Поскольку команда
date
зависит от языковых параметров или локализации, в действительности мы бы извлекли название месяца командой
date +%B
. У команды
date
много других вариантов форматирования, более подробную информацию см. на страницах интерактивного справочного руководства к команде.

Команду

set
можно также применять для передачи параметров командной оболочке и тем самым управления режимом ее работы. Наиболее часто используемый вариант команды
set -х
, который заставляет сценарий выводить на экран трассировку выполняемой в данный момент команды. Мы обсудим команду
set
и ее дополнительные опции позже в этой главе, когда будем рассматривать отладку программ.

shift

Команда

shift
сдвигает все переменные-параметры на одну позицию назад, так что параметр
$2
становится параметром
$1
, параметр
$3
—
$2
и т.д. Предыдущее значение параметра
$1
отбрасывается, а значение параметра 
$0
остается неизменным. Если в вызове команды
shift
задан числовой параметр, параметры сдвигаются на указанное количество позиций. Остальные переменные
$*
,
$@
и
$#
также изменяются в связи с новой расстановкой переменных-параметров.

Команда

shift
часто полезна при поочередном просмотре параметров, переданных в сценарий, и если вашему сценарию требуется 10 и более параметров, вам понадобится команда
shift
для обращения к 10-му параметру и следующим за ним.

Например, вы можете просмотреть все позиционные параметры:

#!/bin/sh

while [ "$1" != "" ]; do

 echo "$1"

 shift

done

exit 0

trap

Команда

trap
применяется для задания действий, предпринимаемых при получении сигналов, которые подробно будут обсуждаться далее в этой книге. Обычное действие — удалить сценарий, когда он прерван. Исторически командные оболочки всегда использовали числа для обозначения сигналов, но в современных сценариях следует применять имена, которые берутся из файла signal.h директивы
#include
с опущенным префиксом
SIG
. Для того чтобы посмотреть номера сигналов и соответствующие им имена, можно ввести в командной строке команду
trap -l
.

Примечание

Для тех, кто не знаком с сигналами, это события, асинхронно посылаемые программе. Стандартно они обычно вызывают прекращение выполнения программы.

С помощью команды

trap
передается предпринимаемое действие, за которым следует имя (имена) сигнала для перехвата:

trap команда сигнал

Напоминаем, что обычно сценарии обрабатываются интерпретатором сверху вниз, поэтому вы должны задать, команду

trap
перед той частью сценария, которую хотите защитить.

Для возврата к стандартной реакции на сигнал, просто задайте

команду
как
–
. Для игнорирования сигнала задайте в
команде
пустую строку
''
. Команда trap без параметров выводит текущий список перехватов и действий.

В табл. 2.9 перечислены самые важные, включенные в. стандарт Х/Open сигналы, которые можно отследить (со стандартными номерами в скобках). Дополнительную информацию можно найти на страницах раздела 7 интерактивного справочного руководства, посвященного сигналам (

man 7 signal
).

Таблица 2.9

Сигнал Описание
HUP (1)
Неожиданный останов; обычно посылается, когда отключается терминал или пользователь выходит из системы
INT (2)
Прерывание; обычно посылается нажатием комбинации клавиш <Ctrl>+<C>
QUIT (3)
Завершение выполнения; обычно посылается нажатием комбинации клавиш <Ctrl>+<\>
ABRT (6)
Аварийное завершение; обычно посылается при возникновении серьезной ошибки выполнения
ALRM (14)
Аварийный сигнал; обычно посылается для обработки превышений лимита времени
TERM (15)
Завершение; обычно посылается системой, когда она завершает работу

А теперь выполните упражнение 2.15.

Упражнение 2.15. Сигналы прерываний

В следующем сценарии показана простая обработка сигнала.

#!/bin/sh

trap 'rm -f /tmp/my_tmp_file_$$' INT

echo creating file /tmp/my_tmp_file_$$

date > /tmp/my_tmp_file_$$

echo "press interrupt (CTRL-C) to interrupt..."

while [ -f /tmp/my_tmp_file_$$ ] ; do

  • Читать дальше
  • 1
  • ...
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36
  • 37
  • 38
  • 39
  • 40
  • 41
  • ...

Ебукер (ebooker) – онлайн-библиотека на русском языке. Книги доступны онлайн, без утомительной регистрации. Огромный выбор и удобный дизайн, позволяющий читать без проблем. Добавляйте сайт в закладки! Все произведения загружаются пользователями: если считаете, что ваши авторские права нарушены – используйте форму обратной связи.

Полезные ссылки

  • Моя полка

Контакты

  • chitat.ebooker@gmail.com

Подпишитесь на рассылку: