开启set -eu选项时如何检查Bash变量是否存在
在开启set -eu的Shell脚本中检查变量是否存在的方法
问题根源
你脚本里的报错是因为开启set -u后,引用未定义的变量会直接触发报错。你写的[ -v $IINTERNAL ]会先尝试展开$IINTERNAL,但这个变量根本没定义,所以脚本直接在这一步退出,根本没执行到-v的检查逻辑。
两种可行的解决方法
方法1:正确使用-v选项(Bash 4.2+适用)
-v选项的正确用法是直接写变量名,不要加$前缀。这样不会触发变量展开,而是直接检查该名称的变量是否存在,完全避开set -u的限制。
修改后的示例代码:
#!/bin/bash set -eu set -o pipefail INTERNAL="sdkhf" if [ -v IINTERNAL ]; then echo "变量存在" else echo "变量不存在" fi
执行后会输出变量不存在,符合预期。
方法2:使用参数扩展(兼容旧版Bash)
如果你的环境里Bash版本低于4.2(不支持-v选项),可以用Bash的参数扩展特性${变量名+标记值}:
- 当变量存在时(不管值是否为空),会返回
标记值 - 当变量不存在时,返回空字符串
利用这个特性,结合-z检查是否为空,就能判断变量是否存在:
#!/bin/bash set -eu set -o pipefail INTERNAL="sdkhf" if [ -z "${IINTERNAL+set}" ]; then echo "变量不存在" else echo "变量存在" fi
这里${IINTERNAL+set}中,因为IINTERNAL未定义,所以扩展结果为空,-z检查为空,输出变量不存在。如果变量存在,哪怕值是空字符串,都会返回set,-z检查不为空,输出变量存在。
内容的提问来源于stack exchange,提问作者LOrD_ARaGOrN
相关产品推荐
相关产品推荐

