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)
@ 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.
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.
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}
@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
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.
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 passedif test -z "$var"then[[ $( echo "1")]]return# Return true if var is zero (0 as an integer or "0" as a string)elif["$var"==02>/dev/null ]then[[ $( echo "1")]]return# Return true if var is 0.0 (0 as a float)elif["$var"==0.02>/dev/null ]then[[ $( echo "1")]]returnfi[[ $( echo "")]]}
Anwendungsbeispiel:
if empty "${var}"then
echo "empty"else
echo "not empty"fi
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.
Antworten:
In Bash testet mindestens der folgende Befehl, ob $ var leer ist :
Der Befehl
man test
ist dein Freund.quelle
./test.ksh[8]: test: argument expected
den Grund erfahren, aber einzelne eckige Klammern haben nicht funktioniert, aber die doppelte hatte es.if test -z "$var"
, richtig?set -u
Option aktiviert wurde, schlägt dieser Test mit fehlunbound variable
. In diesem Fall bevorzugen Sie möglicherweise die Lösung von @ alexli.Voraussichtlicher Bash:
quelle
-z
:[[ -z "$an_unset_or_empty_var" ]] && echo empty
-z
nä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.Ich habe auch gesehen
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 .
quelle
$variable
leer ist, wird nur die Zeichenfolge links vom Vergleichsoperatorx
, die dann der Zeichenfolge rechts vom Operator entspricht.[ x = x ]
ist "wahr", daher wird in der Praxis geprüft, ob$variable
es leer ist oder nicht. Als Ergänzung (3½ Jahre nach der Tatsache :-)) würde ich dies niemals selbst verwenden, da ich-z
das, 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.wird gedruckt,
yes
wenn die Variable gesetzt ist.${foo:+1}
gibt 1 zurück, wenn die Variable gesetzt ist, andernfalls wird eine leere Zeichenfolge zurückgegeben.quelle
set -u
Option (nounset
) aktiviert ist. Fast alle anderen Antworten auf diese Frage schlagenunbound variable
in diesem Fall fehl .:+
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}
quelle
quelle
${variable:-default_value}
[ "$variable" ] || exit
Dies wird zurückgegeben,
true
wenn eine Variable nicht gesetzt oder auf die leere Zeichenfolge ("") gesetzt ist.quelle
elif !
anstelle von verwendenelse
?! [ -z "$MyVar" ]
würde bedeuten , dass der Variable würde hat etwas drin. Aber im Idealfall würde man verwendenelse
.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:
Natürlich können die Null- und Falschfälle nicht in Bash konvertiert werden, daher werden sie weggelassen.
Anwendungsbeispiel:
Demo:
Das folgende Snippet:
Ausgänge:
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.
quelle
Möglicherweise möchten Sie zwischen nicht gesetzten und festgelegten und leeren Variablen unterscheiden:
Ergebnis:
Übrigens empfehle ich die Verwendung,
set -u
die beim Lesen nicht festgelegter Variablen einen Fehler verursacht. Dies kann Sie vor Katastrophen wie zÜber diese und andere Best Practices für einen "strengen Modus" können Sie hier lesen .
quelle
Um zu überprüfen, ob die Variable v nicht gesetzt ist
quelle