POSIX为shell为进行模式匹配提供了四种参数替换结构(老版本的shell可能不支持),每种结构有两个参数:变量名(或变量号)及模式。
第一种模式:
${variable%pattern},这种模式时,shell在variable中查找,看它是否一给的模式pattern结尾,如果是,就从命令行把variable中的内容去掉右边最短的匹配模式
第二种模式:
${variable%%pattern},这种模式时,shell在variable中查找,看它是否一给的模式pattern结尾,如果是,就从命令行把variable中的内容去掉右边最长的匹配模式
第三种模式:
${variable#pattern} 这种模式时,shell在variable中查找,看它是否一给的模式pattern开始,如果是,就从命令行把variable中的内容去掉左边最短的匹配模式
第四种模式:
${variable##pattern} 这种模式时,shell在variable中查找,看它是否一给的模式pattern结尾,如果是,就从命令行把variable中的内容去掉右边最长的匹配模式
这四种模式中都不会改变variable的值,其中,只有在pattern中使用了*匹配符号时,%和%%,#和##才有区别。
for example:
[root@root shell]# var=testcase [root@root shell]# echo $var testcase [root@root shell]# echo ${var%s*e} 从最右边删除最短匹配 testca [root@root shell]# echo $var testcase [root@root shell]# echo ${var%%s*e} 从最右边删除最长匹配 te [root@root shell]# echo $var 变量没有改变 testcase [root@root shell]# echo ${var#?e} 从最左边删除最短匹配 stcase [root@root shell]# echo $var testcase [root@root shell]# echo ${var#*e} 从最左边删除最短匹配 stcase [root@root shell]# echo $var testcase [root@root shell]# echo ${var##*e} 从最左边删除最长匹配,即删除所有
[root@root shell]# echo $var testcase [root@root shell]# echo ${var##*s} 从最左边删除最长匹配 e [root@root shell]# echo $var testcase [root@root shell]# echo ${var#test} 删除test case [root@root shell]# echo $var testcase [root@root shell]# echo ${var#tests} 没有匹配 testcase [root@root shell]#
|
这些模式匹配很有用,比如可以实现basename命令功能相似的shell程序
[root@root shell]#cat mybasename
#!/bin/bash
echo ${1##*/}
[root@root shell]#./mybasename /user/bin
bin
[root@root shell]# |
阅读(913) | 评论(0) | 转发(0) |