我有一个关于shell脚本常规表达式中的通配符的问题 vi a.sh
if [[ $1 == 1*3 ]]; then
echo "matching"
else
echo "not matching"
fi
如果我运行sh a.sh 123
,则输出为:“匹配”。
但根据http://www.tldp.org/LDP/GNU-Linux-Tools-Summary/html/x11655.htm:
*(星号)
进行中的项目将匹配零次或多次。即。 n *会 匹配n,nn,nnnn,nnnnnnn但不是na或任何其他角色。
它应该只匹配3,13,113,111..3。
但为什么它匹配123?
答案 0 :(得分:3)
在documentation you linked中你正在讨论“正则表达式”。
但是,重要的是“标准通配符(通配模式)”中的内容:
标准通配符(通配模式)
这可以表示任意数量的字符(包括零,换句话说,零个或多个字符)。如果你指定了“cd *”它 会使用“cda”,“cdrom”,“cdrecord”和任何以...开头的东西 “cd”还包括“cd”本身。 “m * l”可以通过磨,m,ml和 任何以m开头并以l结尾的东西。
也就是说,它不是指前一个字符,而是指一组字符(零个或多个)。它等同于普通正则表达式中的.*
。
因此,表达式1*3
会匹配以1
开头+ 0或更多字符+ 3
结尾的内容。
答案 1 :(得分:2)
在Unix / Linux World中有两种不同的模式匹配:
grep
,sed
和许多其他实用程序中找到的复杂模式匹配。随着时间的推移,可以找到许多扩展。这些扩展在POSIX中被称为原始(现在被认为是过时的),现代和扩展。*.txt
等操作时找到的匹配所有文本文件的文件。这些更简单,更简单。有一些扩展名(例如**
匹配Ant中的子目录)。在Bash中使用[[ ... == ... ]]
而不带引号时,您正在使用通配文件匹配。如果要使用正则表达式,则需要使用=~
运算符:
if [[ $foo =~ ^11*3 ]] # Matches 13, 113, 1113, 11113
then