Шаблон подстановки параметра | Описание |
---|---|
${ | Если упарам |
${# | Задается длинапарам |
${ | От конца значенияпарам строкой |
${ | От конца значенияпарам строкой |
${ | От начала значенияпарам строкой |
${ | От начала значенияпарам строкой |
Эти подстановки очень полезны при работе со строками. Последние четыре варианта, удаляющие части строк, особенно пригодятся при обработке имен файлов и путей к ним, как показано в упражнении 2.18.
В приведенном далее сценарии показано применение шаблонов при подстановках значений параметров.
#!/bin/sh
unset foo
echo ${foo:-bar}
foo=fud
echo ${foo:-bar}
foo=/usr/bin/X11/startx
echo ${foo#*/}
echo ${foo##*/}
bar=/usr/local/etc/local/networks
echo ${bar%local*}
echo ${bar%%local*}
exit 0
У этого сценария следующий вывод:
bar
fud
usr/bin/X11/startx
startx
/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
.
Поскольку в системах UNIX и Linux многое основано на идеи фильтров, результат какой-либо операции часто должен перенаправляться вручную. Допустим, вы хотите преобразовать файлы GIF в файлы JPEG с помощью программы cjpeg:
$ cjpeg image.gif > image.jpg
Порой вам может потребоваться выполнить такого рода операцию над большим числом файлов. Как автоматизировать подобное перенаправление? Это очень просто:
#!/bin/sh
for image in *.gif
do
cjpeg $image > {image%%gif}jpg
done
Этот сценарий, giftojpeg, создает в текущем каталоге для каждого файла формата GIF файл формата JPEG.
Встроенные документы