it-swarm.com.de

So finden Sie heraus, ob eine Variable in Bash leer ist

Wie kann ich überprüfen, ob eine Variable in Bash leer ist?

251
Tree

In bash testet mindestens der folgende Befehl wenn $ var leer ist:

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

Der Befehl man test ist dein Freund.

366
Jay

Vorausgesetzte Bash:

var=""

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

Habe ich auch gesehen

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

das ist offensichtlich sehr robust und Shell-unabhängig.

Es gibt auch einen Unterschied zwischen "leer" und "nicht gesetzt". Siehe Wie erkenne ich, ob ein String in einem Bash-Shell-Skript nicht definiert ist? .

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

gibt yes aus, wenn die Variable gesetzt ist. ${foo:+1} gibt 1 zurück, wenn die Variable gesetzt ist, andernfalls wird eine leere Zeichenfolge zurückgegeben.

30
alexli
[ "$variable" ] || echo empty
: ${variable="value_to_set_if_unset"}
9
pixelbeat
if [[ "$variable" == "" ]] ...
8
Amardeep AC9MF

Dies gibt true zurück, wenn eine Variable nicht gesetzt oder auf den leeren String ("") gesetzt ist.

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
7
3kstc

Die Frage fragt , wie zu überprüfen ist, ob eine Variable eine leere Zeichenfolge und Die besten Antworten sind bereits gegeben.
Aber ich bin hier gelandet, nachdem eine Zeit lang die Programmierung in PHP abgelaufen war, und was ich tatsächlich suchte, war eine Überprüfung wie die Funktion empty in PHP, die in einer Bash-Shell arbeitet.
Nachdem ich die Antworten gelesen hatte, stellte ich fest, dass ich nicht richtig in Bash dachte, aber in diesem Moment wäre eine Funktion wie leer in PHP in meinem Bash-Code soooo praktisch gewesen.
Da ich denke, dass dies auch anderen passieren kann, habe ich beschlossen, die PHP-Leer-Funktion in Bash umzuwandeln

Nach dem PHP-Handbuch :
Eine Variable wird als leer betrachtet, wenn sie nicht existiert oder wenn ihr Wert einer der folgenden Werte ist:

  • "" (eine leere Zeichenfolge)
  • 0 (0 as an integer)
  • 0,0 (0 als Float)
  • "0" (0 als Zeichenfolge)
  • ein leeres Array
  • eine deklarierte Variable, aber ohne Wert

Natürlich können die Fälle null und false nicht in bash konvertiert werden, daher werden sie weggelassen.

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



Anwendungsbeispiel:

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



Demo:
das folgende 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

ausgänge:

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

Obwohl in einer Bash-Logik die Überprüfung auf Null in dieser Funktion imho Nebenprobleme verursachen kann, sollte jeder, der diese Funktion verwendet, dieses Risiko bewerten und möglicherweise beschließen, diese Überprüfungen abzuschneiden und nur die erste zu belassen .

6
Luca Borrione

Möglicherweise möchten Sie zwischen nicht gesetzten und leeren Variablen unterscheiden:

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

Ergebnis:

set and non-empty
set and empty
unset

Übrigens empfehle ich die Verwendung von set -u was beim Lesen von nicht gesetzten Variablen zu einem Fehler führt, kann Sie vor Katastrophen wie z

rm -rf $dir

Sie können darüber und über andere bewährte Methoden für einen "strengen Modus" lesen hier .

2
dimid

Prüfen, ob die Variable v nicht gesetzt ist

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