Основы программирования в Linux - Страница 35
Вы уже видели простейший вариант присваивания параметра и подстановки значения параметра:
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 $_tmpdoneВ каждом проходе цикла вместо
$iВ командной оболочке можно выполнять разнообразные виды подстановок. Часто они помогают найти красивое решение задач, требующих обработки многих параметров. Самые распространенные виды подстановок значений параметров приведены в табл. 2.18.
Таблица 2.18
| Шаблон подстановки параметра | Описание |
|---|---|
${парам:-значение по умолчанию} | Если у парам |
${#парам} | Задается длина парам |
${парам%строка} | От конца значения парамстрокой |
${парам%%строка} | От конца значения парамстрокой |
${парам#строка} | От начала значения парамстрокой |
${парам##строка} | От начала значения парамстрокой |
Эти подстановки очень полезны при работе со строками. Последние четыре варианта, удаляющие части строк, особенно пригодятся при обработке имен файлов и путей к ним, как показано в упражнении 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