Bash:为什么egrepping这个字符串成功了?

时间:2016-03-24 03:15:13

标签: linux bash shell unix grep

我试图通过为df1 = data[data.result==0] df2 = data[data.result==1] -?-h添加帮助开关来检查是否已将帮助开关传递给我的程序。如果没有,我只需将所有内容转发给另一个脚本,如下所示:

--help

出于某种原因,这似乎并不适用于我的系统。我追踪到if echo "$*" | egrep -q -- '-?|-h|--help'; then help exit 0 fi exec another/script "$@" 成功返回空字符串搜索的事实,例如这将打印egrep

0

为什么会发生这种情况,我该怎么做才能解决这个问题?谢谢!

编辑:还注意到,虽然此命令会成功:

echo '' | egrep -q -- '-?|-h|--help'
echo $?

将其与常规echo -h | egrep -- -? echo $? # 0 一起使用将失败:

grep

我假设扩展grep将echo -h | grep -- -? echo $? # 1 视为特殊字符,那么呢?

2 个答案:

答案 0 :(得分:2)

在正则表达式中,?表示前一个字符的零个或一个副本,在本例中为-。因此-?表示-的零或一个匹配。 -的零匹配匹配空字符串,因此这个正则表达式将匹配所有内容。你需要转义?所以它将按字面解释,而不是正则表达式元字符。

egrep -q -- '-\?|-h|--help'

答案 1 :(得分:1)

这是因为?是shell中的特殊模式字符,并且在正则表达式中区别对待。看看man bash:

Pattern Matching
...
The special pattern characters have the following meanings:
...
?      Matches any single character

所以在你的例子中:

echo -h | egrep -- -?
echo $? # 0

'?'是前一个字符-的零或1次重复。 (正如评论中正确指出的那样)正则表达式 '?'失去了与单个字符匹配的特殊含义,而是指zero或{{1}的匹配}次。要保留字符本身,您需要明确请求1-本身,例如字符类

?