unix 测试使用“set -o nounset”时是否在Bash中设置了变量

70gysomp  于 2022-11-04  发布在  Unix
关注(0)|答案(6)|浏览(152)

下面的代码退出时出现了一个未绑定变量错误。如何在仍然使用set -o nounset选项的情况下修复此错误?


# !/bin/bash

set -o nounset

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

echo "whatever"
vzgqcmou

vzgqcmou1#


# !/bin/bash

set -o nounset

VALUE=${WHATEVER:-}

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

echo "whatever"

在这种情况下,如果没有设置WHATEVERVALUE最终会成为一个空字符串。我们使用的是{parameter:-word}扩展,你可以在man bash的“参数扩展”下找到它。

dwbf0jvd

dwbf0jvd2#

如果要获得预期的结果,则需要执行quote the variables

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
5jdjgkvh

5jdjgkvh3#

使用一行:

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

-z检查是否存在空变量或未设置变量

yws3nbqq

yws3nbqq4#

假设条件:

$ 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

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

$ [[ "${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中更可取。
请注意上面冒号的作用。

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

显然不需要-n-z

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

7xllpg7q

7xllpg7q5#

您可以使用

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

但是,

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

可能更容易理解。

nhjlsmyf

nhjlsmyf6#

虽然这并不是所要求的用例,但我发现如果您想使用nounset(或-u),默认行为就是您想要的:表示以非零值结束并显示描述性消息。
如果您只想在退出时回显其他内容,或者做一些清理工作,则可以使用陷阱。
:-运算符可能就是您想要的。

相关问题