Bash 意外行为中与通配符的字符串比较

String Comparison with Wildcard in Bash Unexpected Behaviour

提问人:cjt00 提问时间:8/8/2023 更新时间:8/8/2023 访问量:78

问:

这可能很容易解决,但我似乎找不到适合这里的解决方案。

我无法弄清楚为什么这个 if 语句的评估结果为 true:

#/bin/bash

err="User dimensions query limit exceeded"

if [ "${err}" != "User"* ]; then
    echo "In the if statement"
    exit 1
fi

我尝试了括号的各种组合并移动 *,将 != 更改为 -ne 等,但无济于事。

谢谢。

bash if-statement 通配符

评论

1赞 Inian 8/8/2023
POSIX 不支持这样的字符串匹配,如果针对 POSIX 兼容性的脚本,则需要使用 statement 或使用 bash 的扩展测试运算符shcase[[
0赞 pjh 8/8/2023
Shellcheck 识别了代码的几个问题。该报告包含指向有关问题以及如何解决这些问题的详细信息的链接。最好在所有新的和修改的 shell 代码上运行 Shellcheck
0赞 user1934428 8/8/2023
bash-internal 命令不支持通配符匹配。在这方面,它的行为类似于外部命令(参见 man 测试)。[[
0赞 pjh 8/8/2023
这回答了你的问题吗?Bash 中单方括号和双方括号的区别
0赞 glenn jackman 8/8/2023
另外:gnu.org/software/bash/manual/bash.html#index-_005b_005b

答:

2赞 Jon Skeet 8/8/2023 #1

我相信这是因为您正在使用而不是.我的猜测是,当您不希望它时,正在执行文件名扩展。[ ... ][[ ... ]]"User"*

只是使用特定于 bash 的,应该修复它:[[]]

#/bin/bash

err="User dimensions query limit exceeded"

if [[ "${err}" != "User"* ]]; then
    echo "In the if statement"
    exit 1
fi

在这一点上,我怀疑条件行可以简化,因为 bash 如何处理:[[ ... ]]

if [[ $err != User* ]]; then

...但我对细节的了解还不够多,无法 100% 自信。(它适用于我的简短测试......