Dizi İşlemleri
Dizeler üzerinde çalışmak için kullanılabilecek çok sayıda genişletme vardır. Bu genişletmelerin çoğu, özellikle yol adları üzerindeki işlemler için çok uygundur.
${#parametre}
içerdiği dizenin uzunluğuna genişler parametre. Normalde, parametre bir dizedir; ancak, eğer parametre ya @ or *, ardından genişletme, konumsal parametrelerin sayısıyla sonuçlanır.
[ben@linuxbox ~]$ foo="Bu dize uzun."
[ben@linuxbox ~]$ echo "'$foo' ${#foo} karakter uzunluğundadır."
'Bu dize uzun.' 20 karakter uzunluğundadır.
[ben@linuxbox ~]$ foo="Bu dize uzun."
[ben@linuxbox ~]$ echo "'$foo' ${#foo} karakter uzunluğundadır."
'Bu dize uzun.' 20 karakter uzunluğundadır.
${parametre:ofset}
${parametre:ofset:uzunluk}
Bu genişletmeler, içerdiği dizenin bir bölümünü çıkarmak için kullanılır. parametre. çıkarma başlar ofset karakter dizisinin başlangıcından itibaren ve karakter dizisinin sonuna kadar devam eder. uzunluk belirtilir.
[ben@linuxbox ~]$ foo="Bu dize uzun."
[ben@linuxbox ~]$ yankı ${foo:5}
dize uzun.
[ben@linuxbox ~]$ yankı ${foo:5:6}
dizi
[ben@linuxbox ~]$ foo="Bu dize uzun."
[ben@linuxbox ~]$ yankı ${foo:5}
dize uzun.
[ben@linuxbox ~]$ yankı ${foo:5:6}
dizi
Eğer değeri ofset negatif ise, dizenin başından değil sonundan başladığı anlamına gelir. Negatif değerlerin önünde bir boşluk olması gerektiğine dikkat edin, ${parametre:-sözcük} genişleme. uzunlukvarsa, sıfırdan küçük olmamalıdır.
If parametre is @, genişlemenin sonucu uzunluk konumsal parametreler, başlayan
telafi etmek.
[ben@linuxbox ~]$ foo="Bu dize uzun."
[ben@linuxbox ~]$ yankı ${foo: -5}
uzun.
[ben@linuxbox ~]$ yankı ${foo: -5:2}
lo
[ben@linuxbox ~]$ foo="Bu dize uzun."
[ben@linuxbox ~]$ yankı ${foo: -5}
uzun.
[ben@linuxbox ~]$ yankı ${foo: -5:2}
lo
${parametre#model}
${parametre##model}
Bu genişletmeler, içerdiği dizenin önde gelen bir bölümünü kaldırır. parametre tarafından tanımlanan model. model yol adı genişletmesinde kullanılanlar gibi bir joker karakter kalıbıdır. İki formdaki fark, # form en kısa eşleşmeyi kaldırırken, ## form en uzun eşleşmeyi kaldırır.
[ben@linuxbox ~]$ foo=dosya.txt.zip [ben@linuxbox ~]$ yankı ${foo#*.} txt.zip
[ben@linuxbox ~]$ yankı ${foo##*.}
zip
[ben@linuxbox ~]$ foo=dosya.txt.zip [ben@linuxbox ~]$ yankı ${foo#*.} txt.zip
[ben@linuxbox ~]$ yankı ${foo##*.}
zip
${parametre%model}
${parametre%%model}
Bu açılımlar aynı # ve ## içindeki dizenin sonundaki metni kaldırmaları dışında, yukarıdaki genişletmeler parametre en başından değil.
[ben@linuxbox ~]$ foo=dosya.txt.zip
[ben@linuxbox ~]$ foo=dosya.txt.zip
[ben@linuxbox ~]$ yankı ${foo%.*}
file.txt
[ben@linuxbox ~]$ yankı ${foo%%.*}
dosya
[ben@linuxbox ~]$ yankı ${foo%.*}
file.txt
[ben@linuxbox ~]$ yankı ${foo%%.*}
dosya
${parametre/model/dizi}
${parametre//model/dizi}
${parametre/#model/dizi}
${parametre/%model/dizi}
Bu genişletme, içeriğin üzerinde bir arama ve değiştirme işlemi gerçekleştirir. parametre. Joker karakterle eşleşen metin bulunursa model, içeriği ile değiştirilir dizi. Normal formda, yalnızca ilk oluşumu model Değiştirildi. İçinde // form, tüm oluşumlar değiştirilir. bu /# form, eşleşmenin dizenin başında olmasını gerektirir ve /% form, eşleşmenin dizenin sonunda olmasını gerektirir. Her formda, /dizi atlanabilir, bu da metnin eşleşmesine neden olur. model silinecek.
[ben@linuxbox ~]$ foo=JPG.JPG [ben@linuxbox ~]$ yankı ${foo/JPG/jpg} jpg.JPG
[ben@linuxbox ~]$ yankı ${foo//JPG/jpg}
jpg.jpg
[ben@linuxbox ~]$ yankı ${foo/#JPG/jpg}
jpg.JPG
[ben@linuxbox ~]$ yankı ${foo/%JPG/jpg}
JPG.jpg
[ben@linuxbox ~]$ foo=JPG.JPG [ben@linuxbox ~]$ yankı ${foo/JPG/jpg} jpg.JPG
[ben@linuxbox ~]$ yankı ${foo//JPG/jpg}
jpg.jpg
[ben@linuxbox ~]$ yankı ${foo/#JPG/jpg}
jpg.JPG
[ben@linuxbox ~]$ yankı ${foo/%JPG/jpg}
JPG.jpg
Parametre genişletmeyi bilmek iyi bir şeydir. Dize işleme genişletmeleri, aşağıdakiler gibi diğer yaygın komutların yerine kullanılabilir. susuzluk ve kesim. Genişletmeler, harici programların kullanımını ortadan kaldırarak komut dosyalarının verimliliğini artırabilir. Örnek olarak, değiştireceğiz en uzun kelime parametre genişletmeyi kullanmak için önceki bölümde tartışılan program ${#j} komut ikamesi yerine $(yankı
-n $j | wc -c) ve ortaya çıkan alt kabuğu, şöyle:
#! / Bin / bash
# long-word3: i için bir dosyadaki en uzun dizeyi bulun; yapmak
eğer [[ -r $i ]]; sonra max_word= max_len=0
#! / Bin / bash
# long-word3: i için bir dosyadaki en uzun dizeyi bulun; yapmak
eğer [[ -r $i ]]; sonra max_word= max_len=0
j için $(dizeler $i); yapmak
uzunluk=${#j}
if (( len > max_len )); sonra max_len=$len max_word=$j
fi
yapılmış
echo "$i: '$max_word' ($max_len karakter)"
bitti
j için $(dizeler $i); yapmak
uzunluk=${#j}
if (( len > max_len )); sonra max_len=$len max_word=$j
fi
yapılmış
echo "$i: '$max_word' ($max_len karakter)"
bitti
Daha sonra, aşağıdakileri kullanarak iki versiyonun verimliliğini karşılaştıracağız. zaman komut:
[ben@linuxbox ~]$ zaman en uzun-word2 dirlist-usr-bin.txt
dirlist-usr-bin.txt: 'scrollkeeper-get-extended-content-list' (38 karakter)
[ben@linuxbox ~]$ zaman en uzun-word2 dirlist-usr-bin.txt
dirlist-usr-bin.txt: 'scrollkeeper-get-extended-content-list' (38 karakter)
gerçek
kullanıcı
0m3.618s
0m1.544s
gerçek
kullanıcı
sistem 0m1.768s
[ben@linuxbox ~]$ zaman en uzun-word3 dirlist-usr-bin.txt
dirlist-usr-bin.txt: 'scrollkeeper-get-extended-content-list' (38 karakter)
sistem 0m1.768s
[ben@linuxbox ~]$ zaman en uzun-word3 dirlist-usr-bin.txt
dirlist-usr-bin.txt: 'scrollkeeper-get-extended-content-list' (38 karakter)
gerçek
kullanıcı
0m0.060s
0m0.056s
gerçek
kullanıcı
sistem 0m0.008s
sistem 0m0.008s

Komut dosyasının orijinal sürümünün metin dosyasını taraması 3.618 saniye sürerken, parametre genişletme kullanan yeni sürüm yalnızca 0.06 saniye sürer. - çok önemli bir gelişme.
Dökümanlar