Linux Bash:为什么这个字符串的映射成功了?

Linux Bash:为什么这个字符串的映射成功了?,linux,bash,shell,unix,grep,Linux,Bash,Shell,Unix,Grep,我正在尝试通过将帮助开关导出为-?、-h或--help来检查是否已将其传递给我的程序。如果没有,我只需将所有内容转发到另一个脚本,如下所示: if echo "$*" | egrep -q -- '-?|-h|--help'; then help exit 0 fi exec another/script "$@" 出于某种原因,我的系统似乎不起作用。我跟踪到,egrep成功返回以搜索空字符串,例如,这将打印0: echo '' | egrep -q -- '-?|-h|--

我正在尝试通过将帮助开关导出为
-?
-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
一起使用将失败:

echo -h | grep -- -?
echo $? # 1

我假设扩展grep将
视为一个特殊字符,那么?

这是因为
是shell中的一个特殊模式字符,在正则表达式中处理方式不同。看看man bash:

Pattern Matching
...
The special pattern characters have the following meanings:
...
?      Matches any single character
在你的例子中:

echo -h | egrep -- -?
echo $? # 0
“?”
是前面字符的零次或1次重复。(正如注释中正确指出的那样)在正则表达式中,
“?”
失去了匹配单个字符的特殊含义,而是表示匹配
零次或
1次。要保留字符本身,您需要显式请求
-
本身,例如在字符类中


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

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

问题不在于,
在正则表达式中确实意味着什么,但它不是指“单个字符”,而是指“零或一”,所以
-?
意味着
-
或者空字符串和空字符串总是匹配吗?您给出的对
man bash
的引用描述了全局,不是正则表达式。对ManBash的引用是对模式匹配的引用——谢谢你,Etan,是的,我不清楚。
egrep -q -- '-\?|-h|--help'