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

262

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

Baum
quelle
2
Welche Art von Shell-Skript? * nix?
TJ Crowder
8
Bash Shell Skript
Baum
serverfault.com/questions/7503/…
Ciro Santilli 法轮功 冠状 冠状 病. 事件 28.
Mögliches Duplikat von Wie prüfe ich, ob eine Variable in Bash gesetzt ist?
Codeforester
In Verbindung stehender Beitrag: Test für Zeichenfolge ungleich Null in Bash: -n "$ var" vs "$ var" .
Codeforester

Antworten:

383

In Bash testet mindestens der folgende Befehl, ob $ var leer ist :

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

Der Befehl man testist dein Freund.

Jay
quelle
62
doppelte eckige Klammern sind hier unbrauchbar. es kann einfach sein [-z "$ var"] oder noch einfacher imho wenn test -z "var" .. sowieso +1 :)
Luca Borrione
2
doppelte eckige Klammern sind nicht nutzlos, wenn ich nicht einschließe, kann ich nicht ./test.ksh[8]: test: argument expectedden Grund erfahren, aber einzelne eckige Klammern haben nicht funktioniert, aber die doppelte hatte es.
gahlot.jaggs
8
@ LucaBorrione Ich denke du meinst if test -z "$var", richtig?
Neu242
1
Nur ein zusätzlicher Kommentar für eine bestimmte Situation, die in der Frage nicht direkt erwähnt wird: Wenn die Variable nicht gesetzt ist und die set -uOption aktiviert wurde, schlägt dieser Test mit fehl unbound variable. In diesem Fall bevorzugen Sie möglicherweise die Lösung von @ alexli.
Anol
3
@LucaBorrione Nur als späte Randnotiz: "[[" kann als "nie nutzlos" angesehen werden; die Verwendung von „[[“ einige Vorteile gegenüber „[“ (siehe hat stackoverflow.com/questions/669452/... zum Beispiel)
GhostCat
107

Voraussichtlicher Bash:

var=""

if [ -n "$var" ]; then
    echo "not empty"
else
    echo "empty"
fi
ChristopheD
quelle
9
Die direktere Antwort lautet -z:[[ -z "$an_unset_or_empty_var" ]] && echo empty
Glenn Jackman
4
@ Glenn Jackman: guter Kommentar; Es ist wahr, dass -znäher an dem, was gefragt wurde. Jay hat dies in seine Antwort aufgenommen, daher werde ich meine nicht aktualisieren und dies so lassen, wie es ist.
ChristopheD
48

Ich habe auch gesehen

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

Das ist offensichtlich sehr robust und schalenunabhängig.

Es gibt auch einen Unterschied zwischen "leer" und "nicht gesetzt". Siehe Ermitteln, ob in einem Bash-Shell-Skript keine Zeichenfolge definiert ist .

Daniel Andersson
quelle
Sieht für mich seltsam aus. Könnten Sie bitte diese Lösung erklären. Danke dir.
Guettli
2
@guettli: Wenn $variableleer ist, wird nur die Zeichenfolge links vom Vergleichsoperator x, die dann der Zeichenfolge rechts vom Operator entspricht. [ x = x ]ist "wahr", daher wird in der Praxis geprüft, ob $variablees leer ist oder nicht. Als Ergänzung (3½ Jahre nach der Tatsache :-)) würde ich dies niemals selbst verwenden, da ich -zdas, was ich wahrscheinlich möchte, klarer machen würde, aber ich wollte diese Antwort hinzufügen, da diese Methode häufig "in freier Wildbahn" gesehen wird; Vielleicht absichtlich so geschrieben von Leuten, die andere Erfahrungen gemacht haben als ich.
Daniel Andersson
30
if [ ${foo:+1} ]
then
    echo "yes"
fi

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

alexli
quelle
2
Ein wichtiger Vorteil dieser Antwort ist, dass sie auch dann funktioniert, wenn die Variable undefiniert und die set -uOption ( nounset) aktiviert ist. Fast alle anderen Antworten auf diese Frage schlagen unbound variablein diesem Fall fehl .
Anol
Diese :+Notation ist auch nützlich für Situationen, in denen Sie optionale Befehlszeilenparameter haben, die Sie mit optionalen Variablen angegeben haben. myprogram ${INFILE:+--in=$INFILE} ${OUTFILE:+--out=$OUTFILE}
Alan Porter
10
if [[ "$variable" == "" ]] ...
Amardeep AC9MF
quelle
10
[ "$variable" ] || echo empty
: ${variable="value_to_set_if_unset"}
Pixelbeat
quelle
Tolle Möglichkeit, eine Var auszuschalten, plus 1
ehime
@ehime, um einen Standardwert zu machen, den Sie verwenden würden${variable:-default_value}
warvariuc
Dies ist eine schnelle Möglichkeit, die Gültigkeit eines Eintrags einer Variablen zu überprüfen und zu beenden, wenn nicht festgelegt: [ "$variable" ] || exit
Marcel Sonderegger
8

Dies wird zurückgegeben, truewenn eine Variable nicht gesetzt oder auf die leere Zeichenfolge ("") 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
3kstc
quelle
3
Warum würden Sie elif !anstelle von verwenden else?
ZiggyTheHamster
1
Nur um eine Unterscheidung zwischen den beiden Aussagen zu machen, das heißt unter Verwendung ! [ -z "$MyVar" ]würde bedeuten , dass der Variable würde hat etwas drin. Aber im Idealfall würde man verwenden else.
3kstc
6

In der Frage wird gefragt, wie überprüft werden soll, ob eine Variable eine leere Zeichenfolge ist und die besten Antworten dafür werden bereits gegeben.

Aber ich bin hier gelandet, nachdem eine Zeitspanne in PHP vergangen war, und ich habe tatsächlich nach einem Scheck wie der leeren Funktion in PHP gesucht die in einer Bash-Shell arbeitet.

Nachdem ich die Antworten gelesen hatte, stellte ich fest, dass ich in Bash nicht richtig dachte, aber in diesem Moment sowieso eine Funktion wie leer in PHP in meinem Bash-Code soooo praktisch gewesen.

Da ich denke, dass dies anderen passieren kann, habe ich beschlossen, die PHP-Leerfunktion in Bash zu konvertieren.

Laut PHP-Handbuch :

Eine Variable wird als leer betrachtet, wenn sie nicht vorhanden ist oder wenn ihr Wert einer der folgenden Werte ist:

  • "" (eine leere Zeichenfolge)
  • 0 (0 als Ganzzahl)
  • 0,0 (0 als Schwimmer)
  • "0" (0 als Zeichenfolge)
  • ein leeres Array
  • eine deklarierte Variable, jedoch ohne Wert

Natürlich können die Null- und Falschfälle 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 entscheiden, diese Überprüfungen abzuschneiden und nur die erste zu belassen.

Luca Borrione
quelle
2

Möglicherweise möchten Sie zwischen nicht gesetzten und festgelegten 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, set -udie beim Lesen nicht festgelegter Variablen einen Fehler verursacht. Dies kann Sie vor Katastrophen wie z

rm -rf $dir

Über diese und andere Best Practices für einen "strengen Modus" können Sie hier lesen .

dimid
quelle
Vielen Dank für die strenge Modusreferenz!
Paulcm
1

Um zu überprüfen, ob die Variable v nicht gesetzt ist

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