测试以查看是否在bash中设置了env变量

时间:2011-09-22 19:32:08

标签: bash shell environment-variables

在bash脚本中,我试图测试变量的存在。但无论我做什么,我的“if”测试都会返回true。这是代码:

ignored-deps-are-not-set () {
    if [ -z "${ignored_deps+x}" ]
    then
        return 0
    fi
    return 1
}

ignored_deps=1
ignored-deps-are-not-set
echo "ignored-deps function returns: $?"
if [ ignored-deps-are-not-set ]
then
    echo "variable is unset"
else
    echo "variable exists"
fi

以下是输出:

ignored-deps function returns: 1
variable is unset

当我注释掉设置了ignored_deps的行时的输出。

ignored-deps function returns: 0
variable is unset

无论如何,它表示变量未设置。我错过了什么?

5 个答案:

答案 0 :(得分:5)

这一行:

if [ ignored-deps-are-not-set ]

测试字符串'ignored-deps-not-set-set'是否为空。它返回true,因为该字符串不为空。它不执行命令(因此也不执行函数)。

如果要测试是否设置了变量,请使用${variable:xxxx}符号之一。

if [ ${ignored_deps+x} ]
then echo "ignored_deps is set ($ignored_deps)"
else echo "ignored_deps is not set"
fi

如果${ignored_deps+x}设置为x$ignored_deps表示法的计算结果为if [ ${ignored_deps:+x} ] then echo "ignored_deps is set ($ignored_deps)" else echo "ignored_deps is not set or is empty" fi ,即使它设置为空字符串也是如此。如果您只想将它​​设置为非空值,那么也使用冒号:

if ignored-deps-are-not-set
then echo "Function returned a zero (success) status"
else echo "Function returned a non-zero (failure) status"
fi

如果要执行该功能(假设破折号在函数名称中起作用),则:

{{1}}

答案 1 :(得分:2)

你实际上并没有执行这个功能:

if ignored-deps-are-not-set; then ...

[]括号内,文字字符串“ignore-deps-are-not-set”被视为true。

答案 2 :(得分:0)

if [ ${myvar:-notset} -eq "notset" ] then
   ...

答案 3 :(得分:0)

- edit-- 只是意识到它是一个试图调用的函数,惯例是错误的。

请参阅:

Z000DGQD@CND131D5W6 ~
$ function a-b-c() {
> return 1
> }

Z000DGQD@CND131D5W6 ~
$ a-b-c

Z000DGQD@CND131D5W6 ~
$ echo $?
1

Z000DGQD@CND131D5W6 ~
$ if a-b-c; then echo hi; else echo ho; fi
ho

Z000DGQD@CND131D5W6 ~
$ if [ a-b-c ]; then echo hi; else echo ho; fi
hi

Z000DGQD@CND131D5W6 ~

- 编辑结束 -

修复变量名称(请参阅我对您帖子的评论)

然后

请参阅man bash中的参数扩展部分。

${parameter:?word}:
  

如果为空或未设置则显示错误。如果参数为null或未设置,则单词的扩展(或者如果单词不存在则为该效果的消息)将写入标准错误,并且如果shell不是交互式,则退出。否则,参数的值将被替换。

答案 4 :(得分:0)

另一种测试变量存在的方法:

if compgen -A variable test_existence_of_var; then 
   echo yes
else 
   echo no
fi