Wie überprüft man, ob eine Variable in Bash gesetzt ist?
Woher weiß ich, ob eine variable in der Bash?
Zum Beispiel, wie kann ich überprüfen, ob der Benutzer gab den ersten parameter an eine Funktion?
function a {
# if $1 is set ?
}
InformationsquelleAutor der Frage prosseek | 2010-08-30
Du musst angemeldet sein, um einen Kommentar abzugeben.
(In der Regel) nicht Der richtige Weg
wo
${var+x}
ist ein parameter expansion die Auswertung nichts, wennvar
nicht gesetzt ist, und ersetzt die Zeichenfolgex
sonst.Zitate Exkurs
Anführungszeichen weggelassen werden können (so können wir sagen
${var+x}
statt"${var+x}"
), da diese syntax & Nutzung garantiert wird dies nur erweitern auf etwas, das nicht erfordern Anführungszeichen (da es entweder erweitert, umx
(enthält kein Wort bricht, so braucht es keine Anführungszeichen) oder nichts (die Ergebnisse in[ -z ]
die günstig bewertet, um den gleichen Wert (true), dass[ -z "" ]
als auch nicht)).Jedoch, während Zitate sicher sein kann, weggelassen, und es war nicht sofort offensichtlich ist (es war nicht einmal ersichtlich, um der erste Autor, der diese zitiert Erklärungder auch in einer großen Bash-coder), wäre es manchmal besser sein, schreiben die Lösung mit den Anführungszeichen als
[ -z "${var+x}" ]
bei den ganz kleinen möglich, Kosten von O(1) speed-Strafe. Der erste Autor hat auch Hinzugefügt, diese als Kommentar neben dem code, die diese Lösung verwenden, die die URL für diese Antwort, die nun auch die Erklärung dafür, warum die Angebote können sicher weggelassen.(Oft) Der falsche Weg
Dies ist oft falsch, weil Sie nicht unterscheiden zwischen einer variable nicht gesetzt ist und eine variable, die auf die leere Zeichenfolge gesetzt. Das heißt, wenn
var=''
dann die obige Lösung wird mit der Ausgabe "var leer ist".Die Unterscheidung zwischen "unset" und "auf eine leere Zeichenfolge festgelegt" ist wichtig in Situationen, in denen der Benutzer angeben, eine Erweiterung oder eine zusätzliche Liste von Eigenschaften, und nicht Angabe wird standardmäßig ein nicht-leerer Wert, in der Erwägung, dass die Angabe der leeren Zeichenkette soll das script eine leere Erweiterung oder eine Liste von zusätzlichen Eigenschaften.
Die Unterscheidung kann nicht entscheidend sein, in jedem Szenario obwohl. In diesen Fällen
[ -z "$var" ]
wird gut.InformationsquelleAutor der Antwort Lionel
Zu überprüfen, für nicht-null/nicht-null string-variable, d.h. wenn festgelegt, benutzen Sie
Es ist das Gegenteil von
-z
. Ich finde mich mit-n
mehr als-z
.InformationsquelleAutor der Antwort mbrannig
Hier ist, wie um zu testen, ob ein parameter unsetoder leer ("Null") oder set mit einem Wert:
Quelle: POSIX: Parameter Expansion:
InformationsquelleAutor der Antwort Jens
Gibt es viele Möglichkeiten, dies zu tun mit die folgende ist eine davon:
Dies gelingt, wenn $1 ist null oder nicht gesetzt
InformationsquelleAutor der Antwort ennuikiller
Während die meisten der Techniken, die hier angegeben sind, zu korrigieren, bash 4.2 unterstützt einen eigentlichen test für das Vorhandensein einer variable (man bash), anstatt die Prüfung der Wert der Variablen.
InformationsquelleAutor der Antwort Russell Harmon
Um zu sehen, ob eine variable nicht leer, ich benutze
Das gegenüber testet, ob eine variable ist entweder nicht gesetzt oder leer:
Um zu sehen, ob eine variable gesetzt ist (leer oder nicht leer), ich benutze
Das gegenüber testet, ob eine variable nicht gesetzt ist:
InformationsquelleAutor der Antwort phkoester
Finde ich immer die POSIX-Tabelle in der andere Antwort langsam zu verstehen, also hier ist mein nehmen auf Sie:
Beachten Sie, dass jede Gruppe (mit und ohne vorangehenden Doppelpunkt) hat die gleiche set und unset Fällen, so die einzige Sache, die unterscheidet, ist, wie die leer Fälle behandelt werden.
Mit der vorausgehenden Doppelpunkt, der leer und unset Fällen identisch sind, so würde ich die nutzen, wo möglich (D. H. mit
:=
nicht nur=
weil der leere Koffer ist inkonsistent).Überschriften:
VARIABLE
ist nicht-leer (VARIABLE="something"
)VARIABLE
ist leer/null (VARIABLE=""
)VARIABLE
existiert nicht (unset VARIABLE
)Werte:
$VARIABLE
bedeutet, das Ergebnis ist der ursprüngliche Wert der Variablen."default"
bedeutet das Ergebnis war die Ersatz-Zeichenfolge bereitgestellt.""
bedeutet, das Ergebnis ist null (eine leere Zeichenfolge).exit 127
bedeutet, dass die script-Ausführung beendet mit exit-code 127.$(VARIABLE="default")
bedeutet, das Ergebnis ist der ursprüngliche Wert der Variablen und die Ersatz-Zeichenfolge bereitgestellt wird der Variablen zugewiesen, die für die zukünftige Verwendung.InformationsquelleAutor der Antwort deizel
Auf eine moderne version von Bash (4.2 oder später, denke ich; ich weiß es nicht sicher), ich würde versuchen, diese:
InformationsquelleAutor der Antwort Seamus Connor
Obwohl für Argumente, die es ist normalerweise am besten, um zu testen,$#, das ist die Anzahl der Argumente, meiner Meinung nach.
InformationsquelleAutor der Antwort Paul Creasey
Lesen Sie die "Parameter Expansion" - Abschnitt der
bash
man-Seite. Parameter-Erweiterung nicht als allgemeiner test für eine variable gesetzt wird, aber es gibt mehrere Dinge, die Sie tun können, um einen parameter, wenn es nicht gesetzt.Beispiel:
wird festgelegt
first_arg
gleich$1
wenn es zugewiesen ist, ansonsten verwendet Sie den Wert "foo". Wenna
unbedingt einen einzigen parameter, und kein guter Standard vorhanden ist, können Sie beenden mit einer Fehlermeldung, wenn kein parameter angegeben:(Beachten Sie die Verwendung von
:
als ein null-Befehl, der nur erweitert sich die Werte Ihrer Argumente. Wir wollen nicht, etwas zu tun mit$1
in diesem Beispiel, nur beenden, wenn es nicht gesetzt)InformationsquelleAutor der Antwort chepner
Sie verlassen wollen, wenn es unset
Dieser arbeitete für mich. Ich wollte mein Skript zu beenden mit einer Fehlermeldung, wenn ein parameter nicht gesetzt.
Dieser gibt einen Fehler zurück, wenn es ausgeführt
Nur prüfen, keine exit - Empty und Unset UNGÜLTIG sind
Versuchen Sie diese option, wenn Sie nur wollen, um zu überprüfen, ob der eingestellte Wert=GÜLTIGE oder nicht gesetzt/leer=UNGÜLTIG.
Oder Sogar kurze tests 😉
Nur prüfen, keine exit - Nur leere ist UNGÜLTIG
- Und dies ist die Antwort auf die Frage.
Verwenden Sie dies, wenn Sie nur wollen, um zu überprüfen, ob der eingestellte Wert/leer=GÜLTIG oder unset=UNGÜLTIG.
BEACHTEN Sie, dass die "1" in "..-1}" ist unbedeutend,
es kann alles sein (wie x)
Kurze tests
Widme ich diese Antwort an @mklement0 (Kommentare), die mich herausgefordert die Frage zu beantworten, genau.
Referenz http://pubs.opengroup.org/onlinepubs/9699919799/utilities/V3_chap02.html#tag_18_06_02
InformationsquelleAutor der Antwort Jarrod Chesney
Um zu überprüfen, ob eine variable gesetzt ist, mit einem nicht-leeren Wert aus, verwenden Sie
[ -n "$x" ]
wie andere schon angedeutet.Meisten der Zeit, ist es eine gute Idee, um zu behandeln eine variable, die hat einen leeren Wert in der gleichen Weise wie eine variable nicht gesetzt ist. Aber Sie können unterscheiden, die zwei, wenn Sie müssen:
[ -n "${x+set}" ]
("${x+set}"
erweitert, umset
wennx
festgelegt ist und auf die leere Zeichenkette, fallsx
nicht gesetzt ist).Zu prüfen, ob ein parameter übergeben wurde, test
$#
die der Anzahl der an die Funktion übergebenen Parameter (oder das Skript, wenn Sie nicht in einer Funktion) (siehe Paul ' s Antwort).InformationsquelleAutor der Antwort Gilles
In der bash können Sie
-v
innerhalb der[[ ]]
builtin:InformationsquelleAutor der Antwort AlejandroVD
Für diejenigen, die suchen, zu prüfen, unset oder leerwenn in einem Skript mit
set-u
:Den regulären
[ -z "$var" ]
check schlägt fehl mitvar; unbound variable
wennset -u
aber[ -z "${var- }" ]
erweitert auf eine leere Zeichenfolge, wennvar
nicht gesetzt ist, ohne zu Versagen.InformationsquelleAutor der Antwort ecerulm
Können Sie tun:
InformationsquelleAutor der Antwort codaddict
Den Antworten funktionieren nicht, wenn der Bash-option
set -u
aktiviert ist. Auch, Sie sind nicht dynamisch, z.B., wie zu testen ist die variable mit dem Namen "dummy" definiert ist? Versuchen Sie dies:Verwandte: In "Bash", wie kann ich testen, ob eine variable definiert ist in "u" - Modus
InformationsquelleAutor der Antwort kevinarpe
Mit
[[ -z "$var" ]]
ist der einfachste Weg, zu wissen, ob eine variable gesetzt wurde oder nicht, aber diese option-z
unterscheidet nicht zwischen einem unset variable und eine variable auf einen leeren string gesetzt:Es ist am besten, um zu überprüfen, Sie nach der Art der variable: env-Variablen, - parameter oder normale Variablen.
Für eine env-variable:
Für einen parameter (zum Beispiel, um zu überprüfen, die Existenz der parameter
$5
):Für eine regelmäßige variable (die Verwendung einer aux-Funktion, um es in einer eleganten Art und Weise):
Hinweise:
InformationsquelleAutor der Antwort Peregring-lk
In einer shell können Sie die
-z
Betreiber, das ist Wahr, wenn die Länge der Zeichenkette gleich null ist.Einer einfachen one-liner, legen Sie Standard -
MY_VAR
wenn es nicht gesetzt wird, sonst Optional können Sie die Nachricht anzeigen:InformationsquelleAutor der Antwort kenorb
Meine bevorzugte Art ist diese:
Also im Grunde, wenn eine variable gesetzt ist, wird es "eine negation der daraus resultierenden
false
" (wastrue
= "set").Und, wenn es nicht gesetzt ist, wird es "eine negation der daraus resultierenden
true
" (als leeres Ergebnis ergibttrue
) (so wird am Ende alsfalse
= "NICHT gesetzt").InformationsquelleAutor der Antwort Aquarius Power
InformationsquelleAutor der Antwort solidsnack
Fand ich einen (viel) besseren code zu tun, wenn Sie prüfen möchten, für alles, was in
$@
.Warum das alles? Alles in
$@
besteht in der Bash, aber standardmäßig ist es leer, sotest -z
undtest -n
konnte Sie nicht helfen.Update: Sie können auch zählen die Anzahl der Zeichen in einem Parameter.
InformationsquelleAutor der Antwort Zlatan
Oder
Oder
Oder
InformationsquelleAutor der Antwort Steven Penny
InformationsquelleAutor der Antwort Graham
Verwende ich immer diesen einen, basierend auf der Tatsache, dass es scheint einfach zu sein, verstanden von niemand, der sieht den code für das erste mal:
Und, wenn Sie wollen, um zu prüfen, ob nicht leer;
Das ist es.
InformationsquelleAutor der Antwort mijnnaam
Dies ist, was ich jeden Tag benutzen:
Funktioniert dies auch unter Linux und Solaris down-bash 3.0.
InformationsquelleAutor der Antwort fr00tyl00p
Wenn
var
kann ein array sein, dann[ -z "${var+x}" ]
parameter-substitution ist falsch. Um wirklich sicher in Bash, die Sie verwenden müssen array-syntax wie[ "${#var[@]}" = 0 ]
wie unten gezeigt.In fast allen Fällen, Sie Stimmen zu. Die einzige situation, die ich gefunden habe, wo der array-Methode ist genauer ist, wenn die variable ist ein nicht-leeres array mit position
0
unset (z.B. in tests7
undA
unten). Dieser Widerspruch kommt aus$var
als Kurzform für${var[0]}
so[ -z "${var+x}" ]
ist nicht die Prüfung, die das gesamte array.Hier sind meine test-Fällen.
Hier ist die Ausgabe.
In Summe:
${var+x}
parameter-expansion-syntax funktioniert genauso gut wie${#var[@]}
array-syntax in den meisten Fällen, wie etwa die überprüfung von Parametern an Funktionen. Der einzige Weg, in diesem Fall brechen könnte, wenn eine zukünftige version von Bash fügt eine Methode zum übergeben von arrays an Funktionen, ohne Sie zu konvertieren Inhalte zu einzelnen Argumenten.0
unset.declare -a var
verwendet wurde, ohne ihm auch einen null-Wert irgendwo in dem array. Bash noch unterscheidet den Fall irgendwo (wie im test gesehenB
oben), also diese Antwort ist nicht narrensicher. Zum Glück wandelt Bash exportiert Umgebungsvariablen in Zeichenfolgen, wenn ein Programm/script, damit alle Probleme, die mit deklariert-aber-unset Variablen enthalten sind, zu einem einzigen Skript, zumindest wenn es nicht sourcing anderen scripts.InformationsquelleAutor der Antwort Mark Haferkamp
Wenn Sie möchten, um zu testen, ob eine variable gebunden oder ungebunden, das funktioniert gut, sogar nachdem Sie eingeschaltet haben, die die nounset option:
InformationsquelleAutor der Antwort user1857592
Ich mag Hilfs-Funktionen zu verstecken, die feuchten details der bash. In diesem Fall, so fügt sogar noch mehr (versteckt), Grobheit:
Da hatte ich zuerst Fehler in dieser Implementierung (inspiriert durch die Antworten von Jens und Lionel), kam ich auf eine andere Lösung:
Ich finde, es ist mehr straight-forward, mehr bashy und leichter zu verstehen/zu erinnern. Test-Fall zeigt, ist es äquivalent:
Den test-Fall zeigt auch, dass
local var
hat NICHT deklarieren var (es sei denn, gefolgt von '='). Seit geraumer Zeit dachte ich, ich deklarierte Variablen diese Weise, so entdecken nun, dass ich lediglich äußerte meine Absicht... Es ist ein no-op, denke ich.BONUS: Anwendungsfall
Ich benutze meistens diesen test zu geben (und zurück) Parameter zu Funktionen, die in einem etwas "elegant" und sichere Art und Weise (fast ähnelt ein interface...):
Wenn der Aufruf mit allen verlangt Variablen deklariert:
anderes:
InformationsquelleAutor der Antwort Daniel S
Funktionen zu überprüfen, wenn die variable deklariert ist,/unset
einschließlich der leeren
$array=()
Die folgenden Funktionen testen, ob der angegebene name existiert als variable
$1
enthält den Namen einer leeren$array=()
den Anruf zu erklären, würde sicherstellen, dass wir das richtige ErgebnisDiese Funktionen testen möchten, wie gezeigt in den folgenden Bedingungen:
.
InformationsquelleAutor der Antwort Martin Rüegg
InformationsquelleAutor der Antwort ghostdog74