我如何知道是否在Bash中设置了变量?

例如,如何检查用户是否向函数提供了第一个参数?

function a {
    # if $1 is set ?
}

当前回答

if [[ ${!xx[@]} ]] ; then echo xx is defined; fi

其他回答

要检查非空/非零字符串变量,即如果已设置,请使用

if [ -n "$1" ]

它与-z相反。我发现自己使用-n多于-z。

您可以像这样使用它:

if [ -n "$1" ]; then
  echo "You supplied the first parameter!"
else
  echo "First parameter not supplied."
fi

有许多方法可以做到这一点,以下是其中之一:

if [ -z "$1" ]

如果$1为空或未设置,则此操作成功。

如果你和我一样,你所寻找的其实是

“如果设置了变量,bash仅运行命令”

你希望这是一行,所以下面这行是你想要的

仅适用于Bash 4.2或更高版本

仅在设置时运行

if [[ -v mytest ]]; then echo "this runs only if variable is set"; fi

仅在未设置时运行

if [[ ! -v mytest2 ]]; then echo "this runs only if variable is not set"; fi

总结

使用test-n“${var-}”检查变量是否为空(因此也必须定义/设置)。用法:如果测试-n“${var-}”;然后echo“var设置为<$var>”其他的echo“var未设置或为空”传真使用test-n“${var+x}”检查变量是否已定义/设置(即使它是空的)。用法:如果测试-n“${var+x}”;然后echo“var设置为<$var>”其他的echo“var未设置”传真

注意,第一个用例在shell脚本中更常见,这是您通常想要使用的。

笔记

此解决方案应适用于所有POSIX shell(sh、bash、zsh、ksh、dash)这个问题的其他一些答案是正确的,但对于没有shell脚本经验的人来说可能会感到困惑,所以我想提供一个TLDR答案,这对这些人来说是最不困惑的。

解释

要了解此解决方案的工作原理,您需要了解POSIX测试命令和POSIX外壳参数扩展(spec),因此让我们介绍了解答案所需的绝对基础知识。

测试命令计算表达式并返回true或false(通过其退出状态)。如果操作数是非空字符串,则运算符-n返回true。例如,test-n“a”返回true,而test-n“”返回false。现在,要检查变量是否为空(这意味着必须定义它),可以使用test-n“$var”。然而,一些shell脚本有一个选项集(set-u),它会导致对未定义变量的任何引用都会发出错误,因此如果未定义变量var,表达式$var将导致错误。要正确处理这种情况,必须使用变量扩展,如果未定义变量,它将告诉shell用替换字符串替换变量,从而避免上述错误。

变量扩展${var-}表示:如果变量var未定义(也称为“unset”),请用空字符串替换它。因此,如果$var不为空,test-n“${var-}”将返回true,这几乎总是您想要在shell脚本中检查的。如果$var未定义或不为空,则反向检查将是test-z“${var-}”。

现在进入第二个用例:检查变量var是否已定义,无论是否为空。这是一个不太常见的用例,稍微复杂一点,我建议您阅读莱昂内尔的伟大答案,以更好地理解它。

我总是使用这个,因为任何第一次看到代码的人都很容易理解:

if [ "$variable" = "" ]
    then
    echo "Variable X is empty"
fi

如果要检查是否为空;

if [ ! "$variable" = "" ]
    then
    echo "Variable X is not empty"
fi

就是这样。