Основы программирования в Linux
Подстановка значений параметровВы уже видели простейший вариант присваивания параметра и подстановки значения параметра:
foo=fredecho $fooПроблема возникает, когда вы хотите вставить дополнительные символы в конец значения переменной. Предположим, что вы хотите написать короткий сценарий обработки файлов 1_tmp и 2_tmp. Вы могли бы написать следующие строки:
#!/bin/shfor i in 1 2 domy_secret_process $i_tmpdoneНо в каждом проходе цикла вы получите следующее сообщение:
my_secret_process: too few argumentsВ чем ошибка?
Проблема заключается в том, что командная оболочка попыталась подставить значение переменной
, которая не существует. Оболочка не считает это ошибкой; она просто не делает никакой подстановки, поэтому в сценарий my_secret_process не передаются никакие параметры. Для обеспечения подстановки в переменную части ее значения$i_tmpнеобходимо$iзаключить в фигурные скобки следующим образом:i#!/bin/shfor i in 1 2 domy_secret_process ${i}_tmpdoneВ каждом проходе цикла вместо
подставляется значение${i}и получаются реальные имена файлов. Вы подставляете значение параметра в строку.iВ командной оболочке можно выполнять разнообразные виды подстановок. Часто они помогают найти красивое решение задач, требующих обработки многих параметров. Самые распространенные виды подстановок значений параметров приведены в табл. 2.18.
Таблица 2.18
Шаблон подстановки параметра Описание ${<i>парам</i>:-<i>значение по умолчанию</i>}Если у нет значения, ему присваивается значение по умолчаниюпарам${#<i>парам</i>}Задается длина парам${<i>парам</i>%<i>строка</i>}От конца значения отбрасывается наименьшая порция, совпадающая сопарам, и возвращается остальная часть значениястрокой${<i>парам</i>%%<i>строка</i>}От конца значения отбрасывается наибольшая порция, совпадающая сопарам, и возвращается остальная часть значениястрокой${<i>парам</i>#<i>строка</i>}От начала значения отбрасывается наименьшая порция, совпадающая сопарам, и возвращается остальная часть значениястрокой${<i>парам</i>##<i>строка</i>}От начала значения отбрасывается наибольшая порция, совпадающая сопарам, и возвращается остальная часть значениястрокойЭти подстановки очень полезны при работе со строками. Последние четыре варианта, удаляющие части строк, особенно пригодятся при обработке имен файлов и путей к ним, как показано в упражнении 2.18.
В приведенном далее сценарии показано применение шаблонов при подстановках значений параметров.
#!/bin/shunset fooecho ${foo:-bar}foo=fudecho ${foo:-bar}foo=/usr/bin/X11/startxecho ${foo#*/}echo ${foo##*/}bar=/usr/local/etc/local/networksecho ${bar%local*}echo ${bar%%local*}exit 0У этого сценария следующий вывод:
barfudusr/bin/X11/startxstartx/usr/local/etc/usrКак это работает
Первая подстановка
дает значение${foo:-bar}, поскольку уbarнет значения в момент выполнения команды. Переменнаяfooостается неизменной, т.е. она остается незаданной.fooПримечаниеПодстановка
установила бы значение переменной${foo:=bar}. Этот строковый шаблон устанавливает, что переменная$fooсуществует и не равнаfoo. Если значение переменной не равноnull, оператор возвращает ее значение, в противном случае вместо этого переменнойnullприсваивается значениеfoo.barПодстановка
выведет на экран${foo:?bar}и аварийно завершит команду, если переменнойfoo: barне существует или ее значение не определено. И наконец,fooвернет${foo:+bar}, еслиbarсуществует и не равнаfoo. Какое разнообразие вариантов!nullШаблон
задает поиск и удаление только левого символа{foo#*/}(символ/соответствует любой строке, в том числе и пустой). Шаблон*задает поиск максимальной подстроки, совпадающей с ним, и, таким образом, удаляет самый правый символ / и все предшествующие ему символы.{foo##*/}Шаблон
определяет просмотр символов в значении параметра, начиная от крайнего правого, до первого появления подстроки${bar%local*}, за которой следует любое количество символов, а в случае шаблонаlocalищется максимально возможное количество символов, начиная от крайнего правого символа значения и заканчивая крайним левым появлением подстроки${bar%%local*}.local