How to find whether or not a variable is empty in Bash

后端 未结 10 1094
深忆病人
深忆病人 2020-12-02 04:17

How can I check if a variable is empty in Bash?

相关标签:
10条回答
  • 2020-12-02 04:55

    I have also seen

    if [ "x$variable" = "x" ]; then ...
    

    which is obviously very robust and shell independent.

    Also, there is a difference between "empty" and "unset". See How to tell if a string is not defined in a Bash shell script.

    0 讨论(0)
  • 2020-12-02 04:57

    Presuming Bash:

    var=""
    
    if [ -n "$var" ]; then
        echo "not empty"
    else
        echo "empty"
    fi
    
    0 讨论(0)
  • 2020-12-02 04:57
    if [ ${foo:+1} ]
    then
        echo "yes"
    fi
    

    prints yes if the variable is set. ${foo:+1} will return 1 when the variable is set, otherwise it will return empty string.

    0 讨论(0)
  • 2020-12-02 05:02

    The question asks how to check if a variable is an empty string and the best answers are already given for that.

    But I landed here after a period passed programming in PHP, and I was actually searching for a check like the empty function in PHP working in a Bash shell.

    After reading the answers I realized I was not thinking properly in Bash, but anyhow in that moment a function like empty in PHP would have been soooo handy in my Bash code.

    As I think this can happen to others, I decided to convert the PHP empty function in Bash.

    According to the PHP manual:

    a variable is considered empty if it doesn't exist or if its value is one of the following:

    • "" (an empty string)
    • 0 (0 as an integer)
    • 0.0 (0 as a float)
    • "0" (0 as a string)
    • an empty array
    • a variable declared, but without a value

    Of course the null and false cases cannot be converted in bash, so they are omitted.

    function empty
    {
        local var="$1"
    
        # Return true if:
        # 1.    var is a null string ("" as empty string)
        # 2.    a non set variable is passed
        # 3.    a declared variable or array but without a value is passed
        # 4.    an empty array is passed
        if test -z "$var"
        then
            [[ $( echo "1" ) ]]
            return
    
        # Return true if var is zero (0 as an integer or "0" as a string)
        elif [ "$var" == 0 2> /dev/null ]
        then
            [[ $( echo "1" ) ]]
            return
    
        # Return true if var is 0.0 (0 as a float)
        elif [ "$var" == 0.0 2> /dev/null ]
        then
            [[ $( echo "1" ) ]]
            return
        fi
    
        [[ $( echo "" ) ]]
    }
    



    Example of usage:

    if empty "${var}"
        then
            echo "empty"
        else
            echo "not empty"
    fi
    



    Demo:
    The following snippet:

    #!/bin/bash
    
    vars=(
        ""
        0
        0.0
        "0"
        1
        "string"
        " "
    )
    
    for (( i=0; i<${#vars[@]}; i++ ))
    do
        var="${vars[$i]}"
    
        if empty "${var}"
            then
                what="empty"
            else
                what="not empty"
        fi
        echo "VAR \"$var\" is $what"
    done
    
    exit
    

    outputs:

    VAR "" is empty
    VAR "0" is empty
    VAR "0.0" is empty
    VAR "0" is empty
    VAR "1" is not empty
    VAR "string" is not empty
    VAR " " is not empty
    

    Having said that in a Bash logic the checks on zero in this function can cause side problems imho, anyone using this function should evaluate this risk and maybe decide to cut those checks off leaving only the first one.

    0 讨论(0)
  • 2020-12-02 05:05

    In Bash at least the following command tests if $var is empty:

    if [[ -z "$var" ]]; then
       # Do what you want
    fi
    

    The command man test is your friend.

    0 讨论(0)
  • 2020-12-02 05:07

    This will return true if a variable is unset or set to the empty string ("").

    if [ -z "$MyVar" ]
    then
       echo "The variable MyVar has nothing in it."
    elif ! [ -z "$MyVar" ]
    then
       echo "The variable MyVar has something in it."
    fi
    
    0 讨论(0)
提交回复
热议问题