Bash中使用grep判断Docker容器存在的if else语句执行异常问题
问题根因
该异常是set -e参数的特性与grep的返回值规则共同导致的:
set -e的作用是:脚本执行过程中只要任意命令返回非0的退出状态码,就会立即终止脚本运行grep命令如果没有匹配到任何内容时,退出状态码为1而非0,当目标镜像不存在时,docker ps | grep my-dev-image这条管道命令的最终退出码就是1,直接触发set -e的退出逻辑,不会执行到后续的if判断
解决方案
方案1:给grep命令追加容错处理
给grep命令结尾加|| true,强制让这条命令的退出码永远为0,不会触发set -e退出:
#!/usr/bin/env bash set -e IMAGE=$(docker ps | grep my-dev-image || true) if [[ -z "$IMAGE" ]]; then echo "It is not there" else echo "It is there" fi
方案2:直接用if判断命令执行结果
如果不需要后续用到IMAGE变量的内容,可以直接把判断逻辑写到if条件里,set -e不会终止if条件内的命令,搭配grep的-q参数实现静默匹配,执行效率更高:
#!/usr/bin/env bash set -e if docker ps | grep -q my-dev-image; then echo "It is there" else echo "It is not there" fi
方案3:临时关闭set -e再重新开启
如果要保持原有赋值逻辑,可以临时关闭set -e执行赋值后再恢复规则:
#!/usr/bin/env bash set -e set +e IMAGE=$(docker ps | grep my-dev-image) set -e if [[ -z "$IMAGE" ]]; then echo "It is not there" else echo "It is there" fi
内容的提问来源于stack exchange,提问作者ArthurOnion
相关产品推荐
相关产品推荐

