如何在Bash脚本中检查nginx -t命令输出是否包含指定字符串
问题根因
你原来的写法失效核心是两个问题:
- 你通过
>/dev/null 2>&1把nginx -t的所有输出都丢弃了,命令替换$()拿到的是空值,永远不可能匹配到目标字符串 nginx -t的校验结果默认是输出到**标准错误(stderr)**而非标准输出(stdout),如果只捕获stdout也会拿到空值
方案1:捕获输出后匹配判断
适合需要后续用到校验输出内容的场景:
# 合并标准错误到标准输出后捕获全部输出 nginx_check_output=$(nginx -t 2>&1) if [[ $nginx_check_output =~ "syntax is ok" && $nginx_check_output =~ "test is successful" ]]; then echo "pass" else echo "FAIL" fi
方案2:直接用grep判断(更简洁)
不需要留存输出的场景可以直接用grep的静默匹配模式,代码更短:
# 合并输出后用grep匹配目标关键词,匹配成功grep返回0退出码 if nginx -t 2>&1 | grep -qF -e "syntax is ok" -e "test is successful"; then echo "pass" else echo "FAIL" fi
补充说明:如果校验的是全局Nginx配置,普通用户可能没有权限读取部分配置片段或者证书文件,建议提权执行:把nginx -t替换为sudo nginx -t即可。
内容的提问来源于stack exchange,提问作者batshman
相关产品推荐
相关产品推荐

