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。
如果您只想在退出时回显其他内容,或者执行一些清理操作,则可以使用陷阱。
:-
运营商可能是你想要的,否则。