为何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
相关产品推荐
相关产品推荐

