Вы уже видели простейший вариант присваивания параметра и подстановки значения параметра:
foo=fredecho $fooПроблема возникает, когда вы хотите вставить дополнительные символы в конец значения переменной. Предположим, что вы хотите написать короткий сценарий обработки файлов 1_tmp и 2_tmp. Вы могли бы написать следующие строки:
#!/bin/shfor i in 1 2 do my_secret_process $i_tmpdoneНо в каждом проходе цикла вы получите следующее сообщение:
my_secret_process: too few argumentsВ чем ошибка?
Проблема заключается в том, что командная оболочка попыталась подставить значение переменной
$i_tmp$ii#!/bin/shfor i in 1 2 do my_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}barfoofooПодстановка
${foo:=bar}$foofoonullnullfoobarПодстановка
${foo:?bar}foo: barfoo${foo:+bar}barfoonullШаблон
{foo#*/}/*{foo##*/}Шаблон
${bar%local*}local${bar%%local*}local