Wie kann ich überprüfen, ob eine Variable in Bash leer ist?
Wie kann ich überprüfen, ob eine Variable in Bash leer ist?
Antworten:
In Bash testet mindestens der folgende Befehl, ob $ var leer ist :
if [[ -z "$var" ]]; then
# Do what you want
fi
Der Befehl man test
ist dein Freund.
./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 fehl unbound variable
. In diesem Fall bevorzugen Sie möglicherweise die Lösung von @ alexli.
Voraussichtlicher Bash:
var=""
if [ -n "$var" ]; then
echo "not empty"
else
echo "empty"
fi
-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
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 .
$variable
leer 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 $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.
if [ ${foo:+1} ]
then
echo "yes"
fi
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.
set -u
Option ( nounset
) aktiviert ist. Fast alle anderen Antworten auf diese Frage schlagen unbound 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}
if [[ "$variable" == "" ]] ...
[ "$variable" ] || echo empty
: ${variable="value_to_set_if_unset"}
${variable:-default_value}
[ "$variable" ] || exit
Dies wird zurückgegeben, true
wenn 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
elif !
anstelle von verwenden else
?
! [ -z "$MyVar" ]
würde bedeuten , dass der Variable würde hat etwas drin. Aber im Idealfall würde man verwenden else
.
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.
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.
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 -u
die 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 .