Отметим, что в сообщении, выдаваемом интерпретатором, всегда указывается имя неопределенной переменной.
В другой конструкции ${var-thing} выбирается $var, если оно определено, и thing — в противном случае. В подобной конструкции ${var-thing} значение $var также устанавливается равным thing:
$ echo ${junk-'Hi there'}
Hi there
$ echo ${junk?)
junk: parameter not set значение junk не изменилось
$ echo {junk='Hi there'}
Hi there
$ echo ${junk?}
Hi there junk принял значение Hi there
$
Правила получения значений переменных приведены в табл. 5.3. Возвращаясь к нашему исходному примеру
t=${1-60}
видим, что t присваивается $1 или 60, если аргумент не задан.
$var | Значение var; ничего, если var не определено |
${var} | То же; полезно, если за именем переменной следует буквенно-цифровая строка |
${var-thing} | Значение var, если оно определено; в противном случае — thing; $var не изменяется |
${var=thing} | Значение var, если оно определено; в противном случае — thing. Если var не определено, то $var присваивается thing |
${var?строка} | Если var определено — $var; в противном случае выводится строка и интерпретатор прекращает работу. При пустой строке выводится: var: parameter not set |
${var+thing} | thing, если $var определено; в противном случае — ничего |
Таблица 5.3: Получение значений переменных в языке
Обратите внимание на реализацию команд true и false в /usr/bin или /bin. (Как бы вы определили, где они находятся?)
Измените команду watchfor так, чтобы пользователь мог задавать несколько имен, а не вводить 'joe|mary'.
Напишите версию команды watchwho, которая использует команду comm вместо awk для сравнения новой и старой информации. Какая версия вам больше нравится?
Напишите версию команды watchwho, в которой вывод команды who хранится в переменных языка shell, а не в файлах. Какая версия лучше? Какая версия быстрее работает? Следует ли в командах watchwho и checkmail автоматически использовать операцию &?
В чем состоит различие между пустой командой языка shell: и символом примечания #? Нужны ли они?
5.4 Команда trap: обработка прерываний
Если во время выполнения команды watchwho нажать клавишу /tmp. Команда watchwho удаляет временные файлы перед окончанием своей работы. Необходимы средства обнаружения таких ситуаций и восстановления после прерывания.
При нажатии клавиши &, от прерываний, но не от отключений.
В гл. 7 сигналы рассматриваются подробнее, но для работы с ними на языке shell глубоких знаний не требуется. Встроенная команда интерпретатора trap устанавливает последовательность команд, которая должна выполняться при возникновении сигнала:
trap последовательность_команд список_номеров_сигналов