Bash中使用通配符进行字符串比较出现异常行为
问题分析与解决
你的问题出在bash中[(test命令)的字符串比较逻辑:在[的语境下,!=右侧的"User"*会被当作字面字符串处理,而不是通配符模式匹配。你的err变量值是User dimensions query limit exceeded,和字面量User*显然不相等,所以if条件判定为true,进入分支执行。
正确解决方案
方案1:使用bash扩展的双括号[[ ... ]]
[[是bash的扩展语法,支持原生的模式匹配,通配符会被正确解析:
#!/bin/bash err="User dimensions query limit exceeded" if [[ "${err}" != "User"* ]]; then echo "In the if statement" exit 1 fi
此时"User"*会被解析为"以User开头的任意字符串",因为err符合这个前缀,所以!=的结果为false,不会进入if分支。
方案2:POSIX兼容的case语句
如果需要脚本兼容所有POSIX标准shell(不限于bash),可以用case实现模式匹配:
#!/bin/bash err="User dimensions query limit exceeded" case "${err}" in "User"*) ;; # 匹配前缀为User的情况,不执行任何操作 *) echo "In the if statement"; exit 1 ;; # 不匹配时执行分支内容 esac
错误尝试说明
-ne是用于数字比较的运算符,完全不适合字符串匹配,所以这个尝试从逻辑上就不对。- 单纯调整括号组合(比如用
( ))不会改变test命令的匹配规则,只有切换到[[或case才能实现模式匹配。
内容的提问来源于stack exchange,提问作者cjt00
相关产品推荐
相关产品推荐

