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

Nei*_*aft 3 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
Run Code Online (Sandbox Code Playgroud)

这是写的输出:

ignored-deps function returns: 1
variable is unset
Run Code Online (Sandbox Code Playgroud)

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

ignored-deps function returns: 0
variable is unset
Run Code Online (Sandbox Code Playgroud)

无论怎样,它都说这个变量没有设置.我错过了什么?

Jon*_*ler 5

这一行:

if [ ignored-deps-are-not-set ]
Run Code Online (Sandbox Code Playgroud)

测试字符串'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
Run Code Online (Sandbox Code Playgroud)

${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
Run Code Online (Sandbox Code Playgroud)

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

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

  • 是的,并且不是.主要是,不.你会写:`if [$(执行命令)]`或类似的东西,但命令是因为`$(...)`执行而不是因为`[...]`.我刚刚修改了一些shell脚本(在工作中),其中包含:`if($([ - z"$ variable"]))然后`符号(除了`$(...)`部分只是后退,但在Markdown评论中他们很难处理.你能明白为什么那么可怕吗? (2认同)