Как узнать, является ли переменная пустой в Bash

Как проверить, является ли переменная пустой в Bash?

вопрос задан 17.06.2010
Tree
3213 репутация

10 ответов


  • 346 рейтинг

    В bash по крайней мере следующая команда проверяет , если $ var пуст :

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

    Команда man test ваш друг.

    ответ дан Jay, с репутацией 10774, 17.06.2010
  • 94 рейтинг

    Предполагаемый bash:

    var=""
    
    if [ -n "$var" ]; then
        echo "not empty"
    else
        echo "empty"
    fi
    
    ответ дан ChristopheD, с репутацией 76129, 17.06.2010
  • 46 рейтинг

    Я также видел

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

    , который, очевидно, очень прочный и не зависит от оболочки.

    Кроме того, существует разница между «пустым» и «неустановленным». См. Как узнать, не определена ли строка в сценарии оболочки bash? .

    ответ дан Daniel Andersson, с репутацией 1256, 1.02.2012
  • 29 рейтинг
    if [ ${foo:+1} ]
    then
        echo "yes"
    fi
    

    печатает yes, если задана переменная. ${foo:+1} вернет 1, когда переменная будет установлена, иначе вернет пустую строку.

    ответ дан alexli, с репутацией 291, 1.08.2012
  • 8 рейтинг
    [ "$variable" ] || echo empty
    : ${variable="value_to_set_if_unset"}
    
    ответ дан pixelbeat, с репутацией 22496, 18.06.2010
  • 7 рейтинг
    if [[ "$variable" == "" ]] ...
    
    ответ дан Amardeep AC9MF, с репутацией 14715, 17.06.2010
  • 6 рейтинг

    вопрос спрашивает , как проверить, является ли переменная пустой строкой , и лучшие ответы уже даны для этого.
    Но я попал сюда после того, как прошел период программирования на php, и то, что я действительно искал, было проверкой, подобной пустой функции в php , работающей в оболочке bash.
    Прочитав ответы, я понял, что не думаю о bash должным образом, но в любом случае такая функция, как empty в php, была бы так удобна в моем bash-коде.
    Поскольку я думаю, что это может случиться с другими, я решил преобразовать пустую функцию php в bash

    В соответствии с PHP руководство :
    переменная считается пустой, если она не существует или имеет одно из следующих значений:

    • "" (пустая строка)
    • 0 (целое число 0)
    • 0. 0 (0 как поплавок)
    • "0" (0 в виде строки)
    • пустой массив
    • объявлена ​​переменная, но без значения

    Конечно, ложные и пустые случаи не могут быть преобразованы в bash, поэтому они опущены.

    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 "" ) ]]
    }
    



    Пример использования:

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



    Демо:
    следующий фрагмент:

    #!/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
    

    выходов:

    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
    

    Сказав, что в логике bash проверки на ноль в этой функции могут вызвать побочные проблемы imho, любой, кто использует эту функцию, должен оценить этот риск и, возможно, решит отключить эти проверки, оставив только первую.

    ответ дан Luca Borrione, с репутацией 10664, 31.08.2012
  • 6 рейтинг

    Это вернет true, если переменная не установлена ​​или установлена ​​в пустую строку ("").

    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
    
    ответ дан 3kstc, с репутацией 616, 4.11.2015
  • 2 рейтинг

    Возможно, вы захотите различить неустановленные переменные и переменные, которые установлены и пустые:

    is_empty() {
        local var_name="$1"
        local var_value="${!var_name}"
        if [[ -v "$var_name" ]]; then
           if [[ -n "$var_value" ]]; then
             echo "set and non-empty"
           else
             echo "set and empty"
           fi
        else
           echo "unset"
        fi
    }
    
    str="foo"
    empty=""
    is_empty str
    is_empty empty
    is_empty none
    

    Результат:

    set and non-empty
    set and empty
    unset
    

    Кстати, я рекомендую использовать set -u, что приведет к ошибке при чтении неустановленных переменных, это может спасти вас от таких катастроф, как

    rm -rf $dir
    

    Вы можете прочитать об этом и других лучших практиках для "строгого режима" здесь .

    ответ дан dimid, с репутацией 3394, 15.06.2016
  • 1 рейтинг

    Чтобы проверить, не установлена ​​ли переменная v

    if [ "$v" == "" ]; then
       echo "v not set"
    fi
    
    ответ дан smishra, с репутацией 891, 6.06.2016