You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

为何test命令搭配*通配符匹配返回NO?bash脚本问题咨询

问题解析:为什么第三个test语句返回NO?

你的代码示例

x="my_string123"
# 1)
if [[ "${x}" = "my_s"* ]] ; then
    echo "YES"
else
    echo "NO"
fi
# 2)
if test "${x}" == "my_string123" ; then
    echo "YES"
else
    echo "NO"
fi
# 3)
if test "${x}" == "my_str"* ; then
    echo "YES"
else
    echo "NO"
fi

输出结果

YES
YES
NO

核心原因:[[ ]] 和 test([ ])的匹配规则差异

  • 在**[[ ]]**结构中,bash会自动将右侧的*当作通配符处理,执行模式匹配逻辑,所以第一个语句里的"my_s"*能成功匹配my_string123。
  • 而**test(或等价的[ ])命令中,==(POSIX标准中是=,==是bash扩展)仅做精确字符串匹配**,*会被当作普通字符看待。第三个语句里的"my_str"*实际是要匹配字面量字符串my_str*,和变量x的值my_string123完全不相等,因此返回NO。

让test支持通配符匹配的替代方案

如果一定要用test类语法实现模式匹配,推荐用case语句替代:

case "${x}" in
    "my_str"*) echo "YES" ;;
    *) echo "NO" ;;
esac

执行后会返回预期的YES。

内容的提问来源于stack exchange,提问作者user123454321

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.27 01:42:05