wdx1992828 发表于 2018-8-30 07:44:17

关于shell变量的最长匹配问题

  最近我观看了老男孩先生的shell编程学习的内容,(还没看完呢)讲的很不错,首先表示感谢。
  在观看的过程中,有个问题我进行了测试,就是关于%和%%与#和##的用法问题,应该是类似的,我本着不求甚解的心态,将我个人测试的结果发出来,希望可以加深记忆,同时可能也会帮到有些想了解此子串应用又不求甚解的同学。
  【我是新手,有什么写的不对的地方,还望各位施主能够不吝啬自己的知识,多多提出宝贵的意见以及建议,大家共同加油】
  言归正传。
  以下是我的操作。
  首先创建如下几个文件,
  # 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
  # sh a.log
  # ll
  total 12
  -rw-r--r--. 1 root root76 Jun9 16:04 a.log
  -rw-r--r--. 1 root root 175 Jun9 16:04 b.log
  # 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
  # for f in `cat b.log`;do touch $f;done
  # ll
  total 12
  -rw-r--r--. 1 root root76 Jun9 16:04 a.log
  -rw-r--r--. 1 root root 175 Jun9 16:04 b.log
  -rw-r--r--. 1 root root   0 Jun9 16:06 ceshi1.txt.tx.txt1.tx.txt2.tx.txt3
  -rw-r--r--. 1 root root   0 Jun9 16:06 ceshi2.txt.tx.txt1.tx.txt2.tx.txt3
  -rw-r--r--. 1 root root   0 Jun9 16:06 ceshi3.txt.tx.txt1.tx.txt2.tx.txt3
  -rw-r--r--. 1 root root   0 Jun9 16:06 ceshi4.txt.tx.txt1.tx.txt2.tx.txt3
  -rw-r--r--. 1 root root   0 Jun9 16:06 ceshi5.txt.tx.txt1.tx.txt2.tx.txt3
  上述操作,创建了ceshi1~5.txt.tx.txt1.tx.txt2.tx.txt3这5个文件。
  # vi p.sh
  for f in `ls *.txt3`
  do
  mv $f ${f%tx*}123
  done
  ~
  ~
  "p.sh" 5L, 56C written
  # sh p.sh
  # ll
  total 12
  -rw-r--r--. 1 root root76 Jun9 16:04 a.log
  -rw-r--r--. 1 root root 175 Jun9 16:04 b.log
  -rw-r--r--. 1 root root   0 Jun9 16:06 ceshi1.txt.tx.txt1.tx.txt2.tx.123
  -rw-r--r--. 1 root root   0 Jun9 16:06 ceshi2.txt.tx.txt1.tx.txt2.tx.123
  -rw-r--r--. 1 root root   0 Jun9 16:06 ceshi3.txt.tx.txt1.tx.txt2.tx.123
  -rw-r--r--. 1 root root   0 Jun9 16:06 ceshi4.txt.tx.txt1.tx.txt2.tx.123
  -rw-r--r--. 1 root root   0 Jun9 16:06 ceshi5.txt.tx.txt1.tx.txt2.tx.123
  -rw-r--r--. 1 root root49 Jun9 16:11 p.sh
  利用%,实现从变量f的结尾进行对以tx*结尾的内容进行***,以及在***内容后添加123,可见此操作将最后的一个txt3***并在次位置添加了123。
  以下利用%%进行测试,
  # vi p.sh
  for f in `ls *.123`       #注意这个地方,和上面第一次的区别
  do
  mv $f ${f%%tx*}456
  done
  ~
  ~
  "p.sh" 5L, 49C written
  # sh p.sh
  # ll
  total 12
  -rw-r--r--. 1 root root76 Jun9 16:04 a.log
  -rw-r--r--. 1 root root 175 Jun9 16:04 b.log
  -rw-r--r--. 1 root root   0 Jun9 16:06 ceshi1.456
  -rw-r--r--. 1 root root   0 Jun9 16:06 ceshi2.456
  -rw-r--r--. 1 root root   0 Jun9 16:06 ceshi3.456
  -rw-r--r--. 1 root root   0 Jun9 16:06 ceshi4.456
  -rw-r--r--. 1 root root   0 Jun9 16:06 ceshi5.456
  -rw-r--r--. 1 root root49 Jun9 16:15 p.sh
  个人认为,以上内容可证明,%和%%的区别是从结尾***变量中最近和最远的匹配字符串的区别。
  原创处女作,写的不好,勿喷,谢谢。

页: [1]
查看完整版本: 关于shell变量的最长匹配问题