Чтение онлайн

на главную - закладки

Жанры

Основы программирования в 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

 echo File exists

 sleep 1

done

echo The file no longer exists trap 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

 echo File exists

 sleep 1

done

echo we never get here

exit 0

Если вы выполните этот сценарий, нажимая и удерживая нажатой клавишу <Ctrl> и затем нажимая клавишу <C> (или любую другую прерывающую комбинацию клавиш) в каждом из циклов, то получите следующий вывод:

creating file /tmp/my_tmp_file_141

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

File exists

File exists

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

Наследие Маозари 9

Панежин Евгений
9. Наследие Маозари
Фантастика:
попаданцы
постапокалипсис
рпг
сказочная фантастика
6.25
рейтинг книги
Наследие Маозари 9

Мечников. Открытие века

Алмазов Игорь
4. Жизнь Лекаря с нуля
Фантастика:
альтернативная история
аниме
фэнтези
фантастика: прочее
попаданцы
5.00
рейтинг книги
Мечников. Открытие века

Спокойный Ваня 2

Кожевников Павел Андреевич
2. Спокойный Ваня
Фантастика:
аниме
фэнтези
попаданцы
5.00
рейтинг книги
Спокойный Ваня 2

Газлайтер. Том 26

Володин Григорий Григорьевич
26. История Телепата
Фантастика:
боевая фантастика
попаданцы
аниме
5.00
рейтинг книги
Газлайтер. Том 26

На границе империй. Том 2

INDIGO
2. Фортуна дама переменчивая
Фантастика:
космическая фантастика
7.35
рейтинг книги
На границе империй. Том 2

Атаман. Гексалогия

Корчевский Юрий Григорьевич
Фантастика:
попаданцы
альтернативная история
историческое фэнтези
8.15
рейтинг книги
Атаман. Гексалогия

Неудержимый. Книга XXVIII

Боярский Андрей
28. Неудержимый
Фантастика:
аниме
фэнтези
попаданцы
5.00
рейтинг книги
Неудержимый. Книга XXVIII

Кодекс Охотника. Книга XXIX

Винокуров Юрий
29. Кодекс Охотника
Фантастика:
попаданцы
аниме
фэнтези
5.00
рейтинг книги
Кодекс Охотника. Книга XXIX

Тринадцатый XIII

NikL
13. Видящий смерть
Фантастика:
городское фэнтези
аниме
фэнтези
попаданцы
5.00
рейтинг книги
Тринадцатый XIII

Камень

Минин Станислав
1. Камень
Фантастика:
боевая фантастика
6.80
рейтинг книги
Камень

Адвокат Империи 6

Карелин Сергей Витальевич
6. Адвокат империи
Фантастика:
городское фэнтези
аниме
дорама
попаданцы
5.00
рейтинг книги
Адвокат Империи 6

Дважды одаренный. Том II

Тарс Элиан
2. Дважды одаренный
Фантастика:
городское фэнтези
альтернативная история
аниме
5.00
рейтинг книги
Дважды одаренный. Том II

Месть Паладина

Юллем Евгений
5. Псевдоним `Испанец`
Фантастика:
фэнтези
попаданцы
аниме
7.00
рейтинг книги
Месть Паладина

Язычник

Мазин Александр Владимирович
5. Варяг
Приключения:
исторические приключения
8.91
рейтинг книги
Язычник