Основы программирования в Linux
Спецификаторы преобразований довольно сложны, поэтому мы приведем наиболее распространенные варианты их применения. Более подробную информацию можно найти в интерактивном справочном руководстве командной оболочки bash или на страницах раздела 1 интерактивного руководства к команде
(printf). (Если вы не найдете нужных сведений в разделе 1, попробуйте поискать в разделе 3.) Спецификатор преобразования состоит из символаman 1 printf, за которым следует символ преобразования. Основные варианты преобразований перечислены в табл. 2.8.%Таблица 2.8
Символ преобразования Описание DВывод десятичного числа СВывод символа SВывод строки %Вывод знака %Строка формата используется для интерпретации остальных параметров команды и вывода результата, как показано в следующем примере:
$ <b>printf "%s\n" hello</b>hello$ <b>printf "%s %d\t%s" "Hi There" 15 people</b>Hi There 15 peopleОбратите внимание на то, что для защиты строки
и превращения ее в единый параметр, строку нужно заключить в кавычки (Hi There).""returnКоманда
служит для возврата значений из функций, как уже упоминалось ранее при обсуждении функций. Команда принимает один числовой параметр, который становится доступен в сценарии, вызывающем функцию. Если параметр не задан, командаreturnпо умолчанию возвращает код завершения последней команды.returnsetКоманда
задает переменные-параметры командной оболочки. Она может быть полезна при использовании полей в командах, выводящих значения, разделенные пробелами.setПредположим, что вы хотите использовать в сценарии название текущего месяца. В системе есть команда
, содержащая название месяца в виде строки, но нужно отделить его от других полей. Это можно сделать с помощью комбинации командыdateи конструкцииset, которые обеспечат выполнение команды$(...)и возврат результата (более подробно об этом см. далее). В выводе команды date строка с названием месяца — второй параметр.date#!/bin/shecho the date is $(date)set $(date)echo The month is $2exit 0Программа задает список параметров для вывода команды
и затем использует позиционный параметрdateдля получения названия месяца.$2Мы использовали команду
только как простой пример, демонстрирующий, как извлекать позиционные параметры. Поскольку командаdateзависит от языковых параметров или локализации, в действительности мы бы извлекли название месяца командойdate. У командыdate +%Bмного других вариантов форматирования, более подробную информацию см. на страницах интерактивного справочного руководства к команде.dateКоманду
можно также применять для передачи параметров командной оболочке и тем самым управления режимом ее работы. Наиболее часто используемый вариант командыset, который заставляет сценарий выводить на экран трассировку выполняемой в данный момент команды. Мы обсудим командуset -хи ее дополнительные опции позже в этой главе, когда будем рассматривать отладку программ.setshiftКоманда
сдвигает все переменные-параметры на одну позицию назад, так что параметрshiftстановится параметром$2, параметр$1—$3и т.д. Предыдущее значение параметра$2отбрасывается, а значение параметра$1остается неизменным. Если в вызове команды$0задан числовой параметр, параметры сдвигаются на указанное количество позиций. Остальные переменныеshift,$*и[email protected]также изменяются в связи с новой расстановкой переменных-параметров.$#Команда
часто полезна при поочередном просмотре параметров, переданных в сценарий, и если вашему сценарию требуется 10 и более параметров, вам понадобится командаshiftдля обращения к 10-му параметру и следующим за ним.shiftНапример, вы можете просмотреть все позиционные параметры:
#!/bin/shwhile [ "$1" != "" ]; doecho "$1"shiftdoneexit 0trapКоманда
применяется для задания действий, предпринимаемых при получении сигналов, которые подробно будут обсуждаться далее в этой книге. Обычное действие — удалить сценарий, когда он прерван. Исторически командные оболочки всегда использовали числа для обозначения сигналов, но в современных сценариях следует применять имена, которые берутся из файла signal.h директивыtrapс опущенным префиксом#include. Для того чтобы посмотреть номера сигналов и соответствующие им имена, можно ввести в командной строке командуSIG.trap -lПримечаниеДля тех, кто не знаком с сигналами, это события, асинхронно посылаемые программе. Стандартно они обычно вызывают прекращение выполнения программы.
С помощью команды
передается предпринимаемое действие, за которым следует имя (имена) сигнала для перехвата:trap
<b>trap </b><i>команда сигнал</i>