Test if a variable is set in bash when using “set -o nounset”

前端 未结 6 1728
北海茫月
北海茫月 2020-12-07 13:28

The following code exits with a unbound variable error. How to fix this, while still using the set -o nounset option?

#!/bin/bash

set -o nounse         


        
6条回答
  •  盖世英雄少女心
    2020-12-07 13:43

    Assumptions:

    $ 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
    

    If you want a non-interactive script to print an error and exit if a variable is null or not set:

    $ [[ "${HOME:?}" ]]
    
    $ [[ "${IAMUNBOUND:?}" ]]
    bash: IAMUNBOUND: parameter null or not set
    
    $ IAMNULL=""
    $ [[ "${IAMNULL:?}" ]]
    bash: IAMNULL: parameter null or not set
    

    If you don't want the script to exit:

    $ [[ "${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.
    

    You can even use [ and ] instead of [[ and ]] above, but the latter is preferable in Bash.

    Note what the colon does above. From the docs:

    Put another way, if the colon is included, the operator tests for both parameter’s existence and that its value is not null; if the colon is omitted, the operator tests only for existence.

    There is apparently no need for -n or -z.

    In summary, I may typically just use [[ "${VAR:?}" ]]. Per the examples, this prints an error and exits if a variable is null or not set.

提交回复
热议问题