Answers:
#!/bin/bash
set -o nounset
VALUE=${WHATEVER:-}
if [ ! -z ${VALUE} ];
then echo "yo"
fi
echo "whatever"
在这种情况下,VALUE
如果WHATEVER
未设置,则最终为空字符串。我们正在使用{parameter:-word}
扩展,您可以man bash
在“参数扩展”下查找。
:-
检查变量是未设置还是为空。如果要检查仅无论是取消设置,使用-
:VALUE=${WHATEVER-}
。另外,一种更易读的方法来检查变量是否为空:if [ "${WHATEVER+defined}" = defined ]; then echo defined; else echo undefined; fi
$WHATEVER
仅包含空格,则无法使用-请参阅我的答案。
! -z
”而不是“ -n
”?
如果要获得期望的结果,则需要引用变量:
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
"info bash"
,"${WHATEVER-}"
应该":"
在"-"
(破折号)之前加一个冒号"${WHATEVER:-}"
,例如:,"${WHATEVER+defined}"
在"+"
(加号)之前加一个冒号,例如:"${WHATEVER:+defined}"
。对我来说,无论有无结肠,它都可以起作用。在某些版本的'nix中,如果不包含冒号,它可能无法工作,因此应该添加它。
-
,+
,:+
,和:-
都支持。前者检测变量是否已设置,后者检测变量是否已设置或为空。摘自man bash
:“省略冒号只会对未设置的参数进行测试。”
那一个班轮怎么样?
[ -z "${VAR:-}" ] && echo "VAR is not set or is empty" || echo "VAR is set to $VAR"
-z
检查是否为空或未设置变量
-z
仅检查下一个参数是否为空。-z
is只是[
命令的一个参数。变量扩展发生在[ -z
无能为力之前。
假设:
$ 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.
你甚至可以使用[
和]
,而不是[[
与]]
以上,但后者是优选的猛砸。
注意上面的冒号。从文档:
换句话说,如果包含冒号,则运算符会测试参数是否存在以及其值是否不为null;如果省略了冒号,则运算符仅测试是否存在。
目前显然没有需要-n
或-z
。
总之,我通常可能只使用[[ "${VAR:?}" ]]
。根据示例,这将打印错误并在变量为null或未设置的情况下退出。
您可以使用
if [[ ${WHATEVER:+$WHATEVER} ]]; then
但
if [[ "${WHATEVER:+isset}" == "isset" ]]; then
可能更具可读性。
=
运算符,而不是==
为了提高可移植性,并且[
应[[
尽可能使用它。
set -o nounset
特定于bash的问题。如果将a #!/bin/bash
放在脚本的顶部,则实际上最好使用bash的增强功能。
虽然这不是正是用例要求上面,我发现,如果你想使用nounset
(或-u
)的默认行为是你想要的:退出非零一个描述性的消息。
我花了很长时间才意识到这一点,我认为值得将其发布为解决方案。
如果只想在退出时回显其他内容或进行一些清理,则可以使用陷阱。
:-
否则,运算符可能就是您想要的。