<Предыдущая | Содержание: | Следующая>
Строковые операции
Существует большой набор расширений, которые можно использовать для работы со строками. Многие из этих расширений особенно хорошо подходят для операций с путями.
$ {#параметр}
расширяется до длины строки, содержащейся в параметр. Как обычно, параметр это строка; однако, если параметр либо @ or *, то расширение дает количество позиционных параметров.
[я @ linuxbox ~] $ foo="Эта строка длинная."
[я @ linuxbox ~] $ echo "'$foo' состоит из ${#foo} символов."
«Эта строка длинная». имеет длину 20 символов.
[я @ linuxbox ~] $ foo="Эта строка длинная."
[я @ linuxbox ~] $ echo "'$foo' состоит из ${#foo} символов."
«Эта строка длинная». имеет длину 20 символов.
${параметр:смещение}
${параметр:смещение: }
Эти расширения используются для извлечения части строки, содержащейся в параметр. Добыча начинается в смещение символов с начала строки и продолжается до конца строки, если только указан.
[я @ linuxbox ~] $ foo="Эта строка длинная."
[я @ linuxbox ~] $ эхо ${foo:5}
строка длинная.
[я @ linuxbox ~] $ эхо ${foo:5:6}
string
[я @ linuxbox ~] $ foo="Эта строка длинная."
[я @ linuxbox ~] $ эхо ${foo:5}
строка длинная.
[я @ linuxbox ~] $ эхо ${foo:5:6}
string
Если значение смещение является отрицательным, считается, что он начинается с конца строки, а не с начала. Обратите внимание, что отрицательным значениям должен предшествовать пробел, чтобы избежать путаницы с ${параметр:-слово} расширение. , если он присутствует, не должен быть меньше нуля.
If параметр is @, результат разложения позиционные параметры, начиная с
смещение.
[я @ linuxbox ~] $ foo="Эта строка длинная."
[я @ linuxbox ~] $ эхо ${foo: -5}
долго.
[я @ linuxbox ~] $ эхо ${foo: -5:2}
lo
[я @ linuxbox ~] $ foo="Эта строка длинная."
[я @ linuxbox ~] $ эхо ${foo: -5}
долго.
[я @ linuxbox ~] $ эхо ${foo: -5:2}
lo
${параметр#описания}
${параметр##описания}
Эти расширения удаляют начальную часть строки, содержащейся в параметр определяется описания. описания является подстановочным знаком, подобным тем, которые используются в расширении имени пути. Отличие этих двух форм в том, что # form удаляет самое короткое совпадение, а ## form удаляет самое длинное совпадение.
[я @ linuxbox ~] $ foo=файл.txt.zip [я @ linuxbox ~] $ эхо ${foo#*.} txt.zip
[я @ linuxbox ~] $ эхо ${foo##*.}
застежка-молния
[я @ linuxbox ~] $ foo=файл.txt.zip [я @ linuxbox ~] $ эхо ${foo#*.} txt.zip
[я @ linuxbox ~] $ эхо ${foo##*.}
застежка-молния
${параметр%описания}
${параметр%%описания}
Эти расширения аналогичны # и ## выше, за исключением того, что они удаляют текст с конца строки, содержащейся в параметр а не с самого начала.
[я @ linuxbox ~] $ foo=файл.txt.zip
[я @ linuxbox ~] $ foo=файл.txt.zip
[я @ linuxbox ~] $ эхо ${foo%.*}
file.txt
[я @ linuxbox ~] $ эхо ${foo%%.*}
файл
[я @ linuxbox ~] $ эхо ${foo%.*}
file.txt
[я @ linuxbox ~] $ эхо ${foo%%.*}
файл
${параметр/описания/string}
${параметр//описания/string}
${параметр/#описания/string}
${параметр/%описания/string}
Это расширение выполняет поиск и замену содержимого параметр. Если найден текст, соответствующий подстановочному знаку описания, он заменяется содержимым string. В нормальной форме только первое вхождение описания заменяется. в // форма, все вхождения заменяются. То /# форма требует, чтобы совпадение происходило в начале строки, а /% form требует совпадения в конце строки. В каждой форме /string может быть опущен, в результате чего текст, совпадающий с описания быть удаленным.
[я @ linuxbox ~] $ foo=JPG.JPG [я @ linuxbox ~] $ эхо ${foo/JPG/jpg} jpg.JPG
[я @ linuxbox ~] $ эхо ${foo//JPG/jpg}
jpg.jpg
[я @ linuxbox ~] $ эхо ${foo/#JPG/jpg}
jpg.JPG
[я @ linuxbox ~] $ эхо ${foo/%JPG/jpg}
JPG.jpg
[я @ linuxbox ~] $ foo=JPG.JPG [я @ linuxbox ~] $ эхо ${foo/JPG/jpg} jpg.JPG
[я @ linuxbox ~] $ эхо ${foo//JPG/jpg}
jpg.jpg
[я @ linuxbox ~] $ эхо ${foo/#JPG/jpg}
jpg.JPG
[я @ linuxbox ~] $ эхо ${foo/%JPG/jpg}
JPG.jpg
Расширение параметров полезно знать. Расширения для работы со строками можно использовать вместо других распространенных команд, таких как СЕПГ и вырезать. Расширения могут повысить эффективность скриптов, исключив использование внешних программ. В качестве примера мы изменим самое длинное слово программа, обсуждавшаяся в предыдущей главе, для использования расширения параметра ${#j} вместо подстановки команды $ (эхо
-n $j | wc -c) и полученную подоболочку, например так:
#! / Bin / Баш
# longest-word3: найти самую длинную строку в файле для i; делать
если [[-r $ i]]; тогда max_word = max_len = 0
#! / Bin / Баш
# longest-word3: найти самую длинную строку в файле для i; делать
если [[-r $ i]]; тогда max_word = max_len = 0
для j в $(строки $i); делать
лен=${#j}
если ((len> max_len)); тогда max_len = $ len max_word = $ j
fi
сделанный
echo "$ i: '$ max_word' ($ max_len символов)"
фи сделано
для j в $(строки $i); делать
лен=${#j}
если ((len> max_len)); тогда max_len = $ len max_word = $ j
fi
сделанный
echo "$ i: '$ max_word' ($ max_len символов)"
фи сделано
Далее мы сравним эффективность двух версий, используя время команда:
[я @ linuxbox ~] $ время самое длинное слово2 dirlist-usr-bin.txt
dirlist-usr-bin.txt: 'scrollkeeper-get-extended-content-list' (38 символов)
[я @ linuxbox ~] $ время самое длинное слово2 dirlist-usr-bin.txt
dirlist-usr-bin.txt: 'scrollkeeper-get-extended-content-list' (38 символов)
реальные
пользователь
0m3.618s
0m1.544s
реальные
пользователь
система 0m1.768s
[я @ linuxbox ~] $ время самое длинное слово3 dirlist-usr-bin.txt
dirlist-usr-bin.txt: 'scrollkeeper-get-extended-content-list' (38 символов)
система 0m1.768s
[я @ linuxbox ~] $ время самое длинное слово3 dirlist-usr-bin.txt
dirlist-usr-bin.txt: 'scrollkeeper-get-extended-content-list' (38 символов)
реальные
пользователь
0m0.060s
0m0.056s
реальные
пользователь
система 0m0.008s
система 0m0.008s
Исходная версия скрипта сканирует текстовый файл за 3.618 секунды, в то время как новая версия, использующая расширение параметра, занимает всего 0.06 секунды. - очень значительное улучшение.