- 论坛徽章:
- 0
|
网中人“shell十三问之变量替换” 外传(初学shell必看)
shaoping0330 写到:
dir3/my.file.txt
“#”:相当于最小匹配,遇到一个最小的满足其内表达式的即中止删除动作。
“##”:相当于最大匹配
例:
$ file2=abcd.efgh.ijkl.oopp
$ echo ${file2#*.*.*.*}
$ echo ${file2##*.*.*.*}
..........
有几个现象很奇怪,请大侠解释一下
引用:
[root@lfs tmp]# echo ${file3#*}
*ab*de*cd
[root@lfs tmp]# echo ${file3#**}
*ab*de*cd
[root@lfs tmp]# echo ${file3#***}
*ab*de*cd
上面的3个例子,第一个容易理解,“*”匹配空了
但是为什么第二、第三个会输出同样的结果?难道所有的“*”都匹配空了?
[root@lfs tmp]# echo ${file3#**}
*ab*de*cd
[root@lfs tmp]# echo ${file3#***}
*ab*de*cd
我认为这里有点象0*0=0的意思,因为是一个#号的最小匹配,而且*默认为空,两个*或者多个*都应该是空
引用:
[root@lfs tmp]# echo ${file3##*}
空
为什么上面的“*”没有匹配空?
是否可以这样理解,比如变量值为“*ab*de*cd”,表达式处理的时候认为值是“空*ab*de*cd空”上面的例子“*”匹配最后面的空,所以输出空。
我认为##这里是最大匹配,而*代表file3 ,把file3都删除了,就剩下空了,这样理解比较简单
引用:
[root@lfs tmp]# echo ${file3##\*}
ab*de*cd
[root@lfs tmp]# echo ${file3#\*}
ab*de*cd
我的理解,第一条应该输出“cd”而不是“ab*de*cd”,因为匹配最后一个“*”,可是上面的结果怎么理解?为什么第一条和第二条的结果一样?
这个问题我也没有想明白!!!, |
|