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

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

10 ответов


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

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

команда man test - твой друг.


предполагая Баш:

var=""

if [ -n "$var" ]; then
    echo "not empty"
else
    echo "empty"
fi

Я также видел

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

что, очевидно, очень надежно и независимо от оболочки.

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


if [ ${foo:+1} ]
then
    echo "yes"
fi

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


[ "$variable" ] || echo empty
: ${variable="value_to_set_if_unset"}

if [[ "$variable" == "" ]] ...

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

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

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

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

function empty
{
    local var=""

    # 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



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

#!/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, любой, кто использует эту функцию, должен оценить этот риск и, возможно, решить отключить эти проверки, оставив только первый.


вернет 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

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

is_empty() {
    local var_name=""
    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 что вызовет ошибку при чтении unset переменных, это может спасти вас от бедствий, таких как

rm -rf $dir

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


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

if [ "$v" == "" ]; then
   echo "v not set"
fi