最近我觀看了老男孩先生的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
個人認爲,以上內容可證明,%和%%的區別是從結尾***變量中最近和最遠的匹配字符串的區別。
原創處女作,寫的不好,勿噴,謝謝。