${!префикс*}
${!префикс@}
Эти две формы подстановки возвращают имена существующих переменных, начинающиеся с указанного префикса. Согласно документации bash, обе формы действуют совершенно одинаково. Следующая команда выводит список всех переменных окружения с именами, начинающимися с BASH:
[[email protected] ~]$ echo ${!BASH*}
BASH BASH_ARGC BASH_ARGV BASH_COMMAND BASH_COMPLETION BASH_COMPLETION_DIR BASH_LINENO BASH_SOURCE BASH_SUBSHELL BASH_VERSINFO BASH_VERSION
Операции со строками
Существует множество форм подстановки, которые можно использовать для работы со строками. Многие из них особенно хорошо подходят для операций с путями. Форма
${#параметр}
вернет длину строки, содержащуюся в указанном параметре. Обычно роль параметра играет строка, но если передать @ или *, то механизм подстановки вернет число позиционных параметров.
[[email protected] ~]$ foo="This string is long."
[[email protected] ~]$ echo "'$foo' is ${#foo} characters long."
'This string is long.' is 20 characters long.
Следующая форма подстановки:
${параметр:смещение}
${параметр:смещение:длина}
используется для извлечения фрагмента строки, содержащейся в параметре. Извлечение начинается с указанного смещения от начала строки и продолжается до конца строки, если не указана длина.
[[email protected] ~]$ foo="This string is long."
[[email protected] ~]$ echo ${foo:5}
string is long.
[[email protected] ~]$ echo ${foo:5:6}
string
Если указать отрицательное смещение, его отсчет начнется с конца строки вместо начала. Обратите внимание, что отрицательному значению должен предшествовать пробел, чтобы предотвратить путаницу с формой ${параметр:-слово}. Длина, если указана, в этом случае также должна быть меньше 0. Если в качестве параметра передать @, результатом подстановки будет длина позиционных параметров, начиная с указанного смещения.
[[email protected] ~]$ foo="This string is long."
[[email protected] ~]$ echo ${foo: -5}
long.
[[email protected] ~]$ echo ${foo: -5:2}
lo
Следующие две формы:
${параметр#шаблон}
${параметр##шаблон}
возвращают значение параметра, удаляя из него начальную часть, определяемую указанным шаблоном. В шаблоне допускается использовать групповые символы: например, те, что используются в подстановке путей. Эти две формы отличаются тем, что форма # удаляет кратчайшее совпадение, тогда как форма ## удаляет самое длинное совпадение.
[[email protected] ~]$ foo=file.txt.zip
[[email protected] ~]$ echo ${foo#*.}
txt.zip
[[email protected] ~]$ echo ${foo##*.}
zip
Следующие две формы:
${параметр%шаблон}
${параметр%%шаблон}
действуют так же, как формы # и ##, представленные выше, но удаляют текст с конца строки, содержащейся в параметре.
[[email protected] ~]$ foo=file.txt.zip
[[email protected] ~]$ echo ${foo%.*}
file.txt
[[email protected] ~]$ echo ${foo%%.*}
file
Следующие формы:
${параметр/шаблон/строка}
${параметр//шаблон/строка}
${параметр/#шаблон/строка}
${параметр/%шаблон/строка}
выполняют поиск с заменой в содержимом указанного параметра. Если в параметре будет найдено совпадение с шаблоном, который может содержать групповые символы, это совпадение будет заменено содержимым указанной строки. Первая форма заменит только первое совпадение с шаблоном. Форма // заменит все найденные совпадения. Форма /# выполняет замену, только если совпадение с шаблоном найдено в самом начале строки, а форма /% выполняет замену, только если совпадение найдено в конце строки. Часть /строка можно опустить, и тогда совпавший фрагмент будет удален.
[[email protected] ~]$ foo=JPG.JPG
[[email protected] ~]$ echo ${foo/JPG/jpg}
jpg.JPG
[[email protected] ~]$ echo ${foo//JPG/jpg}
jpg.jpg
[[email protected] ~]$ echo ${foo/#JPG/jpg}
jpg.JPG
[[email protected] ~]$ echo ${foo/%JPG/jpg}
JPG.jpg
Механизм подстановки параметров — ценный инструмент. Его возможности для работы со строками можно использовать вместо других широко используемых команд, таких как sed и cut. Применение механизма подстановки способствует увеличению производительности сценария за счет отсутствия необходимости выполнять внешние программы. Например, изменим программу longest-word из предыдущей главы, задействовав подстановку параметра ${#j} взамен подстановки команды $(echo $j | wc -c), которая к тому же выполняется в подоболочке:
#!/bin/bash
# longest-word3 : поиск самой длинной строки в файле
for i; do
if [[ -r $i ]]; then
max_word=
max_len=
for j in $(strings $i); do
len=${#j}
if (( len > max_len )); then
max_len=$len
max_word=$j
fi
done
echo "$i: '$max_word' ($max_len characters)"
fi
shift
done
Далее, сравним эффективность двух версий с помощью команды time:
[[email protected] ~]$ time longest-word2 dirlist-usr-bin.txt
dirlist-usr-bin.txt: 'scrollkeeper-get-extended-content-list' (38 characters)
real 0m3.618s
user 0m1.544s
sys 0m1.768s
[[email protected] ~]$ time longest-word3 dirlist-usr-bin.txt
dirlist-usr-bin.txt: 'scrollkeeper-get-extended-content-list' (38 characters)
real 0m0.060s
user 0m0.056s
sys 0m0.008s
Первоначальной версии потребовалось 3,618 секунды, чтобы просканировать текстовый файл, тогда как новой версии, использующей механизм подстановки параметров, понадобилось всего 0,06 секунды — весьма существенное улучшение.
Вычисление и подстановка арифметических выражений
В главе 7 мы видели, как работает механизм подстановки результатов арифметических выражений. Он используется для выполнения разных арифметических операций с целыми числами. Ниже приводится его базовый синтаксис
$((выражение))
где выражение — это любое допустимое арифметическое выражение.
Он тесно связан с составной командой (( )), использовавшейся в главе 27 для вычисления арифметических выражений (оценки истинности).
В предыдущих главах мы видели некоторые наиболее типичные выражения и операторы, а здесь рассмотрим более полный их список.
Основание системы счисления
В главе 9 мы познакомились с восьмеричными (в системе счисления с основанием 8) и шестнадцатеричными (в системе счисления с основанием 16) числами. В арифметических выражениях командная оболочка позволяет использовать целочисленные константы в системах счисления с любым основанием. В табл. 34.1 показаны формы записи чисел с указанием основания системы счисления.
Таблица 34.1. Определение основания системы счисления
Форма записи
Описание
Число
По умолчанию числа без упоминания системы счисления интерпретируются как десятичные числа (в системе счисления с основанием 10)
0число
В арифметических выражениях числа, начинающиеся с нуля, интерпретируются как восьмеричные (в системе счисления с основанием 8)
0xчисло
Форма записи шестнадцатеричных чисел
основание#число
Число в системе счисления с указанным основанием
Несколько примеров:
[[email protected] ~]$ echo $((0xff))
255