testing一个variables是否在bash中使用“set -o nounset”

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

 #!/bin/bash set -o nounset if [ ! -z ${WHATEVER} ]; then echo "yo" fi echo "whatever" 
 #!/bin/bash set -o nounset VALUE=${WHATEVER:-} if [ ! -z ${VALUE} ]; then echo "yo" fi echo "whatever" 

在这种情况下,如果未设置WHATEVER ,则VALUE结束为空string。 我们使用{parameter:-word}扩展,你可以在“参数扩展”下的man bash查找。

如果你想获得你期望的结果,你需要引用这些variables:

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

testing:

 $ unset WHATEVER $ check unset $ WHATEVER= $ check empty but defined $ WHATEVER=' ' $ check not empty 
 $ 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 

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

 $ [[ "${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中是可取的。

注意上面的冒号。 从文档 :

换句话说,如果包含冒号,运算符会testing两个参数的存在,并且它的值不为空; 如果省略冒号,操作员只testing存在。

显然不需要-n-z

总之,我可能通常只使用[[ "${VAR:?}" ]] 根据这些例子,这将打印一个错误,如果一个variables为空或者没有设置,就退出。

怎么样的一个oneliner?

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

-z检查是否为空variables或未设variables

您可以使用

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

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

可能会更可读。

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

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

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

:-运营商可能是你想要的,否则。