使用“set -o nounset”测试是否在bash中设置变量

时间:2011-10-20 06:44:24

标签: bash shell unix

以下代码以未绑定的变量错误退出。如何解决这个问题,同时仍然使用set -o nounset选项?

#!/bin/bash

set -o nounset

if [ ! -z ${WHATEVER} ];
 then echo "yo"
fi

echo "whatever"

6 个答案:

答案 0 :(得分:69)

#!/bin/bash

set -o nounset


VALUE=${WHATEVER:-}

if [ ! -z ${VALUE} ];
 then echo "yo"
fi

echo "whatever"

在这种情况下,如果未设置VALUEWHATEVER最终会成为空字符串。我们正在使用{parameter:-word}扩展,您可以在“参数扩展”下的man bash中查找。{/ p>

答案 1 :(得分:26)

如果您想获得预期的结果,您需要引用变量:

check() {
    if [ -n "${WHATEVER-}" ]
    then
        echo 'not empty'
    elif [ "${WHATEVER+defined}" = defined ]
    then
        echo 'empty but defined'
    else
        echo 'unset'
    fi
}

测试:

$ unset WHATEVER
$ check
unset
$ WHATEVER=
$ check
empty but defined
$ WHATEVER='   '
$ check
not empty

答案 2 :(得分:6)

假设:

$ echo $SHELL
/bin/bash
$ /bin/bash --version | head -1
GNU bash, version 4.1.2(1)-release (x86_64-redhat-linux-gnu)
$ set -o nounset

如果您希望非交互式脚本打印错误,并在变量为null或未设置时退出:

$ [[ "${HOME:?}" ]]

$ [[ "${IAMUNBOUND:?}" ]]
bash: IAMUNBOUND: parameter null or not set

$ IAMNULL=""
$ [[ "${IAMNULL:?}" ]]
bash: IAMNULL: parameter null or not set

如果您不希望脚本退出:

$ [[ "${HOME:-}" ]] || echo "Parameter null or not set."

$ [[ "${IAMUNBOUND:-}" ]] || echo "Parameter null or not set."
Parameter null or not set.

$ IAMNULL=""
$ [[ "${IAMUNNULL:-}" ]] || echo "Parameter null or not set."
Parameter null or not set.

您甚至可以使用[]代替上面的[[]],但后者在Bash中更受欢迎。

注意上面冒号的内容。来自docs

  

换句话说,如果包含冒号,运算符将测试两个参数是否存在以及它的值是否为空;如果省略冒号,则运算符仅测试是否存在。

显然不需要-n-z

总之,我通常只使用[[ "${VAR:?}" ]]根据示例,如果变量为null或未设置,则会输出错误并退出。

答案 3 :(得分:4)

oneliner怎么样?

[ -z "${VAR:-}" ] && echo "VAR is not set or is empty" || echo "VAR is set to $VAR"

-z检查空变量或未设置变量

答案 4 :(得分:3)

您可以使用

if [[ ${WHATEVER:+$WHATEVER} ]]; then

if [[ "${WHATEVER:+isset}" == "isset" ]]; then

可能更具可读性。

答案 5 :(得分:0)

虽然这不是完全上面要求的用例,但我发现如果你想使用nounset(或-u),默认行为是你想要的那个:用描述性的消息退出非零。

我花了很长时间才意识到这一点,我认为值得发布作为解决方案。

如果您只想在退出时回复其他内容,或进行一些清理,则可以使用陷阱。

:-运算符可能就是你想要的了。