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

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

Жанры

Основы программирования в 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.07
рейтинг книги
Угрюм-река

Темпус

Шмелев Дмитрий
1. Темпус
Фантастика:
научная фантастика
5.00
рейтинг книги
Темпус

Великое испытание

Imperew
2. Ютрейн
Фантастика:
фэнтези
ненаучная фантастика
рпг
5.00
рейтинг книги
Великое испытание

Воронцов. Перезагрузка. Книга 5

Тарасов Ник
5. Воронцов. Перезагрузка
Фантастика:
попаданцы
альтернативная история
фэнтези
фантастика: прочее
6.00
рейтинг книги
Воронцов. Перезагрузка. Книга 5

iOS. Приемы программирования

Нахавандипур Вандад
Компьютеры и Интернет:
программирование
5.00
рейтинг книги
iOS. Приемы программирования

Монстры

Говард Роберт Ирвин
2009. Антология
Фантастика:
фэнтези
социально-философская фантастика
ужасы и мистика
юмористическая фантастика
детективная фантастика
6.40
рейтинг книги
Монстры

Вирус «Reamde»

Стивенсон Нил Таун
Фантастика:
научная фантастика
7.00
рейтинг книги
Вирус «Reamde»

Последний Паладин. Том 4

Саваровский Роман
4. Путь Паладина
Фантастика:
фэнтези
попаданцы
аниме
5.00
рейтинг книги
Последний Паладин. Том 4

Я князь. Книга XVIII

Дрейк Сириус
18. Дорогой барон!
Фантастика:
юмористическое фэнтези
попаданцы
аниме
5.00
рейтинг книги
Я князь. Книга XVIII

Герои 1812 года

Дуров Валерий Александрович
680. Жизнь замечательных людей
Документальная литература:
биографии и мемуары
5.00
рейтинг книги
Герои 1812 года

Филогенез

Фостер Алан Дин
Фантастика:
космическая фантастика
5.00
рейтинг книги
Филогенез

Warhammer: Битвы в Мире Фэнтези. Омнибус. Том 2

Коллектив авторов
Warhammer Fantasy Battles
Фантастика:
фэнтези
5.00
рейтинг книги
Warhammer: Битвы в Мире Фэнтези. Омнибус. Том 2

Последний Паладин. Том 7

Саваровский Роман
7. Путь Паладина
Фантастика:
фэнтези
попаданцы
аниме
5.00
рейтинг книги
Последний Паладин. Том 7

Стеллар. Заклинатель

Прокофьев Роман Юрьевич
3. Стеллар
Фантастика:
боевая фантастика
8.42
рейтинг книги
Стеллар. Заклинатель