Bash中未初始化变量在-ne条件判断未触发预期退出的原因咨询
为什么未设置Bash变量时
[[ ${VAR} -ne "0" ]]的判断不成立? 我编写了如下Bash脚本:
#!/bin/bash if [[ ${DISABLE_WORK} -ne "0" ]]; then echo "exiting" exit 0 fi echo "doing something"
测试结果如下:
case 1: $ DISABLE_WORK=1 ./if.sh exiting case 2: $ DISABLE_WORK=2 ./if.sh exiting case 3: $ DISABLE_WORK=0 ./if.sh doing something case 4: $ ./if.sh doing something
我无法理解为何未设置DISABLE_WORK变量的case4中,脚本输出doing something而非exiting,恳请解释。
原因解释
在Bash的[[ ... ]]条件判断中,未定义的变量${DISABLE_WORK}会被展开为空字符串。当使用数值比较运算符-ne(不等于)时,Bash会把空字符串自动转换为数值0处理。
所以case4中的判断实际等价于:
[[ 0 -ne "0" ]]
这个判断结果为假,因此不会进入if分支执行exiting,而是走到脚本末尾输出doing something。
调整方案(按需选择)
如果你希望未设置DISABLE_WORK时也执行exiting,可以修改条件逻辑:
- 方案1:判断“变量未设置 或 变量值不等于0”
if [[ -z ${DISABLE_WORK} || ${DISABLE_WORK} -ne 0 ]]; then echo "exiting" exit 0 fi - 方案2:给未定义变量设置默认值
这里if [[ ${DISABLE_WORK:-1} -ne 0 ]]; then echo "exiting" exit 0 fi${DISABLE_WORK:-1}表示:如果DISABLE_WORK未定义或为空,就用1作为默认值,此时未设置变量时判断会成立。
内容的提问来源于stack exchange,提问作者Kamil_H
相关产品推荐
相关产品推荐

