POSIX sh脚本中[ "$(...)" = *FAIL* ]匹配逻辑失效如何修复
失效原因
POSIX 规范中,test 命令(即方括号[ ])的字符串相等比较=仅支持字面量匹配,右侧的通配符*会被当作普通字符处理,不会触发子串匹配逻辑。因此原有写法实际是在判断最后一行是否完全等于*FAIL*这个字符串,自然永远无法命中,始终走else分支返回0。
修正方案
以下两种方案均完全符合POSIX规范,无bash专属特性,兼容#!/bin/sh要求:
方案1:使用grep匹配(最常用)
grep -q是POSIX标准参数,作用是静默匹配,仅通过退出码返回是否匹配成功:
#!/bin/sh # ........ if tail -n 1 log_file.txt | grep -q "FAIL"; then exit 1 else # some command here exit 0 fi
方案2:使用case语句(无外部命令调用,性能更好)
POSIX标准的case语句原生支持通配符模式匹配,不需要调用额外外部程序,执行效率更高:
#!/bin/sh # ........ last_line=$(tail -n 1 log_file.txt) case "$last_line" in *FAIL*) exit 1 ;; *) # some command here exit 0 ;; esac
内容的提问来源于stack exchange,提问作者Nabla
相关产品推荐
相关产品推荐

