以下代码以未绑定的变量错误退出。如何解决这个问题,同时仍然使用set -o
nounset选项?
#!/bin/bash
set -o nounset
if [ ! -z ${WHATEVER} ];
then echo "yo"
fi
echo "whatever"
答案 0 :(得分:69)
#!/bin/bash
set -o nounset
VALUE=${WHATEVER:-}
if [ ! -z ${VALUE} ];
then echo "yo"
fi
echo "whatever"
在这种情况下,如果未设置VALUE
,WHATEVER
最终会成为空字符串。我们正在使用{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
),默认行为是你想要的那个:用描述性的消息退出非零。
我花了很长时间才意识到这一点,我认为值得发布作为解决方案。
如果您只想在退出时回复其他内容,或进行一些清理,则可以使用陷阱。
:-
运算符可能就是你想要的了。