最近我观看了老男孩先生的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

个人认为,以上内容可证明,%和%%的区别是从结尾***变量中最近和最远的匹配字符串的区别。

原创×××作,写的不好,勿喷,谢谢。