<Попередній | зміст | Наступна>
Рядкові операції
Існує великий набір розширень, які можна використовувати для роботи зі струнами. Багато з цих розширень особливо добре підходять для операцій з іменами шляхів.
${#параметр}
розширюється на довжину рядка, що міститься в параметр. Зазвичай, параметр є рядком; однак, якщо параметр є також @ or *, то розширення призводить до кількості позиційних параметрів.
[me@linuxbox ~]$ foo="Цей рядок довгий."
[me@linuxbox ~]$ echo "'$foo' містить ${#foo} символів."
«Цей рядок довгий». має 20 символів.
[me@linuxbox ~]$ foo="Цей рядок довгий."
[me@linuxbox ~]$ echo "'$foo' містить ${#foo} символів."
«Цей рядок довгий». має 20 символів.
${параметр:зсув}
${параметр:зсув: }
Ці розширення використовуються для вилучення частини рядка, що міститься в параметр. Видобуток починається о зсув символів від початку рядка і триває до кінця рядка, якщо не вказано.
[me@linuxbox ~]$ foo="Цей рядок довгий."
[me@linuxbox ~]$ луна ${foo:5}
струна довга.
[me@linuxbox ~]$ луна ${foo:5:6}
рядок
[me@linuxbox ~]$ foo="Цей рядок довгий."
[me@linuxbox ~]$ луна ${foo:5}
струна довга.
[me@linuxbox ~]$ луна ${foo:5:6}
рядок
Якщо значення зсув є негативним, це означає, що воно починається з кінця рядка, а не з початку. Зауважте, що від’ємним значенням має передувати пробіл, щоб уникнути плутанини з ${параметр:-слово} розширення. , якщо є, не повинно бути менше нуля.
If параметр is @, результатом розширення є позиційні параметри, починаючи з
зміщення.
[me@linuxbox ~]$ foo="Цей рядок довгий."
[me@linuxbox ~]$ echo ${foo: -5}
довго.
[me@linuxbox ~]$ echo ${foo: -5:2}
lo
[me@linuxbox ~]$ foo="Цей рядок довгий."
[me@linuxbox ~]$ echo ${foo: -5}
довго.
[me@linuxbox ~]$ echo ${foo: -5:2}
lo
${параметр#модель}
${параметр##модель}
Ці розширення видаляють провідну частину рядка, що міститься в параметр визначені модель. модель є шаблоном підстановки, подібним до тих, що використовуються в розширенні імені шляху. Різниця між цими двома формами полягає в тому, що # форма видаляє найкоротший збіг, тоді як ## форма видаляє найдовший збіг.
[me@linuxbox ~]$ foo=file.txt.zip [me@linuxbox ~]$ луна ${foo#*.} txt.zip
[me@linuxbox ~]$ луна ${foo##*.}
ZIP
[me@linuxbox ~]$ foo=file.txt.zip [me@linuxbox ~]$ луна ${foo#*.} txt.zip
[me@linuxbox ~]$ луна ${foo##*.}
ZIP
${параметр%модель}
${параметр%%модель}
Ці розширення такі ж, як і # та ## розширення вище, за винятком того, що вони видаляють текст з кінця рядка, що міститься в параметр а не з самого початку.
[me@linuxbox ~]$ foo=file.txt.zip
[me@linuxbox ~]$ foo=file.txt.zip
[me@linuxbox ~]$ луна ${foo%.*}
file.txt
[me@linuxbox ~]$ луна ${foo%%.*}
файл
[me@linuxbox ~]$ луна ${foo%.*}
file.txt
[me@linuxbox ~]$ луна ${foo%%.*}
файл
${параметр/модель/рядок}
${параметр//модель/рядок}
${параметр/#модель/рядок}
${параметр/%модель/рядок}
Це розширення виконує пошук і заміну за вмістом параметр. Якщо знайдено текст, що відповідає шаблону модель, його замінено вмістом рядок. У звичайній формі тільки перше поява модель замінюється. В // форму, усі входження замінюються. The /# forma вимагає, щоб збіг відбувався на початку рядка, і /% форма вимагає, щоб відповідність відбувалася в кінці рядка. У кожній формі, /рядок може бути опущено, через що текст відповідає модель для видалення.
[me@linuxbox ~]$ foo=JPG.JPG [me@linuxbox ~]$ відлуння ${foo/JPG/jpg} jpg.JPG
[me@linuxbox ~]$ луна ${foo//JPG/jpg}
jpg.jpg
[me@linuxbox ~]$ луна ${foo/#JPG/jpg}
jpg.JPG
[me@linuxbox ~]$ луна ${foo/%JPG/jpg}
JPG.jpg
[me@linuxbox ~]$ foo=JPG.JPG [me@linuxbox ~]$ відлуння ${foo/JPG/jpg} jpg.JPG
[me@linuxbox ~]$ луна ${foo//JPG/jpg}
jpg.jpg
[me@linuxbox ~]$ луна ${foo/#JPG/jpg}
jpg.JPG
[me@linuxbox ~]$ луна ${foo/%JPG/jpg}
JPG.jpg
Розширення параметрів – це корисно знати. Розширення маніпуляції з рядками можна використовувати як заміну інших поширених команд, наприклад sed та вирізати. Розширення можуть підвищити ефективність сценаріїв, виключивши використання зовнішніх програм. Як приклад, ми змінимо найдовше слово програма, розглянута в попередньому розділі, для використання розширення параметрів ${#j} замість командної заміни $(луна
-n $j | wc -c) та отримана підоболонка, наприклад:
#! / бін / баш
# longest-word3: знайти найдовший рядок у файлі для i; робити
якщо [[ -r $i ]]; тоді max_word= max_len=0
#! / бін / баш
# longest-word3: знайти найдовший рядок у файлі для i; робити
якщо [[ -r $i ]]; тоді max_word= max_len=0
для j в $(рядки $i); робити
len=${#j}
якщо (( len > max_len )); тоді max_len=$len max_word=$j
fi
зроблений
echo "$i: '$max_word' ($max_len символів)"
fi зроблено
для j в $(рядки $i); робити
len=${#j}
якщо (( len > max_len )); тоді max_len=$len max_word=$j
fi
зроблений
echo "$i: '$max_word' ($max_len символів)"
fi зроблено
Далі ми порівняємо ефективність двох версій за допомогою час команда:
[me@linuxbox ~]$ час longest-word2 dirlist-usr-bin.txt
dirlist-usr-bin.txt: 'scrollkeeper-get-extended-content-list' (38 символів)
[me@linuxbox ~]$ час longest-word2 dirlist-usr-bin.txt
dirlist-usr-bin.txt: 'scrollkeeper-get-extended-content-list' (38 символів)
реальний
користувач
0м3.618с
0м1.544с
реальний
користувач
sys 0m1.768s
[me@linuxbox ~]$ час longest-word3 dirlist-usr-bin.txt
dirlist-usr-bin.txt: 'scrollkeeper-get-extended-content-list' (38 символів)
sys 0m1.768s
[me@linuxbox ~]$ час longest-word3 dirlist-usr-bin.txt
dirlist-usr-bin.txt: 'scrollkeeper-get-extended-content-list' (38 символів)
реальний
користувач
0м0.060с
0м0.056с
реальний
користувач
sys 0m0.008s
sys 0m0.008s

Початкова версія скрипту займає 3.618 секунди для сканування текстового файлу, а нова версія, що використовує розширення параметрів, займає лише 0.06 секунди. - дуже значне покращення.
документація