關於shell變量的最長匹配問題

最近我觀看了老男孩先生的shell編程學習的內容,(還沒看完呢)講的很不錯,首先表示感謝。

在觀看的過程中,有個問題我進行了測試,就是關於%和%%與#和##的用法問題,應該是類似的,我本着不求甚解的心態,將我個人測試的結果發出來,希望可以加深記憶,同時可能也會幫到有些想了解此子串應用又不求甚解的同學。

【我是新手,有什麼寫的不對的地方,還望各位施主能夠不吝嗇自己的知識,多多提出寶貴的意見以及建議,大家共同加油】

言歸正傳。

以下是我的操作。

首先創建如下幾個文件,

[root@smoke test]# vi a.log 

for i in `seq 5`;

do

        echo ceshi$i.txt.tx.txt1.tx.txt2.tx.txt3>>b.log

done


~

~

"a.log" 5L, 76C written

[root@smoke test]# sh a.log 

[root@smoke test]# ll

total 12

-rw-r--r--. 1 root root  76 Jun  9 16:04 a.log

-rw-r--r--. 1 root root 175 Jun  9 16:04 b.log

[root@smoke test]# more b.log 

ceshi1.txt.tx.txt1.tx.txt2.tx.txt3

ceshi2.txt.tx.txt1.tx.txt2.tx.txt3

ceshi3.txt.tx.txt1.tx.txt2.tx.txt3

ceshi4.txt.tx.txt1.tx.txt2.tx.txt3

ceshi5.txt.tx.txt1.tx.txt2.tx.txt3

[root@smoke test]# for f in `cat b.log`;do touch $f;done

[root@smoke test]# ll

total 12

-rw-r--r--. 1 root root  76 Jun  9 16:04 a.log

-rw-r--r--. 1 root root 175 Jun  9 16:04 b.log

-rw-r--r--. 1 root root   0 Jun  9 16:06 ceshi1.txt.tx.txt1.tx.txt2.tx.txt3

-rw-r--r--. 1 root root   0 Jun  9 16:06 ceshi2.txt.tx.txt1.tx.txt2.tx.txt3

-rw-r--r--. 1 root root   0 Jun  9 16:06 ceshi3.txt.tx.txt1.tx.txt2.tx.txt3

-rw-r--r--. 1 root root   0 Jun  9 16:06 ceshi4.txt.tx.txt1.tx.txt2.tx.txt3

-rw-r--r--. 1 root root   0 Jun  9 16:06 ceshi5.txt.tx.txt1.tx.txt2.tx.txt3

上述操作,創建了ceshi1~5.txt.tx.txt1.tx.txt2.tx.txt3這5個文件。

[root@smoke 123]# vi p.sh

for f in `ls *.txt3`

do

        mv $f ${f%tx*}123

done

~

~

"p.sh" 5L, 56C written

[root@smoke test]# sh p.sh 

[root@smoke test]# ll

total 12

-rw-r--r--. 1 root root  76 Jun  9 16:04 a.log

-rw-r--r--. 1 root root 175 Jun  9 16:04 b.log

-rw-r--r--. 1 root root   0 Jun  9 16:06 ceshi1.txt.tx.txt1.tx.txt2.tx.123

-rw-r--r--. 1 root root   0 Jun  9 16:06 ceshi2.txt.tx.txt1.tx.txt2.tx.123

-rw-r--r--. 1 root root   0 Jun  9 16:06 ceshi3.txt.tx.txt1.tx.txt2.tx.123

-rw-r--r--. 1 root root   0 Jun  9 16:06 ceshi4.txt.tx.txt1.tx.txt2.tx.123

-rw-r--r--. 1 root root   0 Jun  9 16:06 ceshi5.txt.tx.txt1.tx.txt2.tx.123

-rw-r--r--. 1 root root  49 Jun  9 16:11 p.sh

利用%,實現從變量f的結尾進行對以tx*結尾的內容進行***,以及在***內容後添加123,可見此操作將最後的一個txt3***並在次位置添加了123。

以下利用%%進行測試,

[root@smoke test]# vi p.sh 

for f in `ls *.123`       #注意這個地方,和上面第一次的區別

do

        mv $f ${f%%tx*}456

done


~

~

"p.sh" 5L, 49C written

[root@smoke test]# sh p.sh 

[root@smoke test]# ll

total 12

-rw-r--r--. 1 root root  76 Jun  9 16:04 a.log

-rw-r--r--. 1 root root 175 Jun  9 16:04 b.log

-rw-r--r--. 1 root root   0 Jun  9 16:06 ceshi1.456

-rw-r--r--. 1 root root   0 Jun  9 16:06 ceshi2.456

-rw-r--r--. 1 root root   0 Jun  9 16:06 ceshi3.456

-rw-r--r--. 1 root root   0 Jun  9 16:06 ceshi4.456

-rw-r--r--. 1 root root   0 Jun  9 16:06 ceshi5.456

-rw-r--r--. 1 root root  49 Jun  9 16:15 p.sh

個人認爲,以上內容可證明,%和%%的區別是從結尾***變量中最近和最遠的匹配字符串的區別。

原創處女作,寫的不好,勿噴,謝謝。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章