linux - Bash:为什么对这个字符串进行 egrepping 会成功?

标签 linux bash shell unix grep

我正在尝试通过对 -?-h--help< 进行 egrepping 来检查是否已将帮助开关传递到我的程序。如果没有,我只是将所有内容转发给另一个脚本,如下所示:

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 将 ? 视为特殊字符,那么?

最佳答案

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

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

关于linux - Bash:为什么对这个字符串进行 egrepping 会成功?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36192675/

相关文章:

bash - bash脚本文件翼手龙意外结束

linux - 想要使用 awk 根据顺序切换 2 个值

shell - 检查文本文件中的两个变量

regex - 如何匹配单行字符串上最后一次出现的模式

linux - 为大型网络软件编写功能测试

linux - 如何提取以特定字符开头的标题行(忽略前导空格)?

regex - 使用 bash 更正文件编号

python - 将用户输入的字符串插入 Linux 命令 [python 脚本]?

c++ - 无法更改 CMake 中的默认链接器

shell - 一个月中的一周