Ich muss die Existenz einer Variablen in einer if
Anweisung überprüfen . Etwas zur Wirkung von:
if [ -v $somevar ]
then
echo "Variable somevar exists!"
else
echo "Variable somevar does not exist!"
Und die naheliegendste Frage war diese , die meine Frage nicht wirklich beantwortet.
$somevar
auf einen Wert / string , wenn die Variable existiert nicht:${somevar:=42}
.[ -n "$var" ]
oder[ ! -z "$var" ]
) zu prüfen . Ich finde die Existenz- / Nichtexistenzprüfungen zu subtil und bevorzuge meinen Code grob und einfach.[ -n "$var" ]
? Related: stackoverflow.com/questions/3601515/…Antworten:
In der modernen Bash (Version 4.2 und höher):
Von
help test
:quelle
[ -v name_of_var ]
.$1
,$-
,$#
...test
oder eingebaut[
. Es ist nicht verfügbar in/usr/bin/test
. Vergleichen Sieman test
mithelp test
.Hängt davon , was Sie mit existiert .
Hat eine Variable, die deklariert wurde , aber nicht zugewiesen existieren ?
Enthält ein Array (oder hash) Variable, die eine leere Liste zugeordnet wurde , existieren ?
Gibt es eine nameref Variable zeigt auf eine Variable, die derzeit nicht zugeordnet existieren ?
Sind Sie der Meinung
$-
,$#
,$1
Variablen? (POSIX nicht).In Bourne-ähnlichen Muscheln lautet der kanonische Weg:
Das funktioniert für skalare Variablen und andere Parameter zu sagen , ob eine Variable einen Wert zugewiesen wurde (leer oder nicht, automatisch aus der Umgebung, assigments,
read
,for
oder andere).Bei Shells mit einem
typeset
oderdeclare
-Befehl werden die deklarierten, aber nicht zugewiesenen Variablen mit Ausnahme von in nicht als gesetzt gemeldet .zsh
Für Shells, die Arrays unterstützen, mit Ausnahme von
yash
undzsh
, die nur dann als Set- Array-Variablen gemeldet werden, wenn das Element von Index 0 festgelegt wurde.Für
bash
(aber nichtksh93
nochzsh
), für Variablen vom Typ assoziatives Array , die sie nicht als gesetzt melden würden, es sei denn, ihr Element des Schlüssels "0" wurde gesetzt.Für
ksh93
undbash
für Variablen vom Typ nameref wird nur true zurückgegeben, wenn die vom nameref referenzierte Variable selbst als gesetzt betrachtet wird .Für
ksh
,zsh
undbash
ein potenziell besseren Ansatz könnte sein:Für
ksh93
,zsh
undbash
4.4 oder höher, gibt es auch:Welche Variablen melden, die gesetzt oder deklariert wurden.
quelle
declare -p
Ichtypeset -p
arbeitebash
jetzt auch mit.bash -c 'typeset -i a; typeset -p a'
und vergleichen Sie mitksh93
oderzsh
.Wie in der Antwort zu SO erwähnt , können Sie Folgendes überprüfen:
Dabei ist $ {somevar + x} eine Parametererweiterung, die den Wert null annimmt, wenn var nicht gesetzt ist, und andernfalls die Zeichenfolge "x" ersetzt.
Bei Verwendung von wird
-n
, wie in der anderen Antwort vorgeschlagen, nur geprüft, ob die Variable eine leere Zeichenfolge enthält. Es wird seine Existenz nicht überprüfen.quelle
$somevar
um damit umzugehenIFS=x
. Entweder das oder Zitatx
.if [ -z "${somevar+x}" ]
? Wäre das Zitat innen[[
und außen noch erforderlich]]
?[ test
Routinen akzeptieren Befehlszeilenparameter, und daher sollte man sich darauf verlassen, dass die üblichen Erweiterungen und Interpretationen, wie sie in üblicher Weise angeordnet sind, beim Aufruf des angewendeten Tests das wiedergeben, was Sie veranlassen sollten, von einer beliebigen Programmbefehlszeile gelesen zu werden. test {! + "!"}set -u
in Kraft ist und die Bash-Version vor 4.2 vorliegt.POSIXly:
oder Sie können Ihre Shell die Nachricht für Sie anzeigen lassen:
quelle
trap
EXIT nur funktionieren. Das ist alles, was ich sage - es gilt einfach nicht als bestanden / nicht bestanden sehr gut. Und das rede ich auch nicht - genau das habe ich schon gemacht und es hat einen kleinen Kommentar-Chat gekostet, um mich zu überzeugen. Also dachte ich nur, ich würde es vorwärts bezahlen.quelle
sh
kompatibel, genau das, was ich brauche.... druckt überhaupt nichts, wenn dies nicht der Fall ist. Oder...
... wird dir so oder so sagen.
Sie können den Rückgabewert eines Tests verwenden, um dynamisch die entsprechende Formatzeichenfolge für Ihre Bedingung zu erweitern:
Sie können einen
printf
Fehler auch aufgrund einer Substitution machen ...... der
$var does not exist!
nach stderr druckt und einen anderen Wert als 0 zurückgibt, wenn er nicht gesetzt$var
ist, aber$var does exist!
nach stdout druckt und 0 zurückgibt, wenn er$var
gesetzt ist.quelle
Diese einfache Linie funktioniert (und funktioniert auf den meisten POSIX-Shells):
Oder in einer längeren Form geschrieben:
Die Erweiterung ist:
Die
${var+"false"}
Erweiterung wird entweder auf "null" oder auf "false" erweitert.Dann wird "nichts" oder "falsch" ausgeführt und der Beendigungscode gesetzt.
Es ist nicht erforderlich, den Befehl
test
([
oder[[
) aufzurufen, da der Exit-Wert durch die (Ausführung) der Erweiterung selbst festgelegt wird.quelle
$IFS
f, a, l, s oder e enthalten sind. Wie bei anderen Antworten gibt es den Fall von Arrays, Hashes oder anderen Variablentypen, die Sie vielleicht erwähnen möchten.most POSIX shells
.most
bedeutetIn the greatest number of instances
, nicht alle. ... ... Also ja, in einem obskuren Zustandwhen $IFS contains f, a, l, s or e
und für eine obskure Muschelsome old versions of zsh
schlägt dies fehl: Was für ein Schock! Ich sollte davon ausgehen, dass ein solcher Fehler längst behoben ist. ... ... Schlagen Sie vor, dass wir Code für vor langer Zeit zerbrochene Muscheln schreiben müssen?Die reine Muschelweise:
Testskript:
Ergebnisse:
quelle
Mit der Bash 4.4.19 funktionierte folgendes für mich. Hier ist ein vollständiges Beispiel
quelle
Sie können den
if
Befehl nicht verwenden , um die Existenz deklarierter Variablen in bash zu überprüfen. Die-v
Option ist jedoch in neueren bash-bash
Versionen vorhanden, ist jedoch nicht portierbar und kann in älteren Versionen nicht verwendet werden . Denn wenn Sie eine Variable verwenden, die es nicht gibt, wird sie gleichzeitig geboren.Stellen Sie sich zum Beispiel vor, ich hätte der
MYTEST
Variablen keinen Wert zugewiesen , aber wenn Sie den Befehl echo verwenden, wird nichts angezeigt! Oder wenn Sie es verwendenif [ -z $MYTEST ]
, wurde der Wert Null zurückgegeben! Es wurde kein weiterer Exit-Status zurückgegeben, der besagt, dass diese Variable nicht existiert!Jetzt haben Sie zwei Lösungen (ohne
-v
Option):declare
Befehl.set
Befehl.Zum Beispiel:
Leider zeigt Ihnen dieser Befehl auch die geladenen Funktionen im Speicher! Sie können den
declare -p | grep -q MYTEST ; echo $?
Befehl für ein saubereres Ergebnis verwenden.quelle
Funktion zum Prüfen, ob die Variable deklariert / nicht gesetzt ist
einschließlich leer
$array=()
Neben @ Gilles Antwort
- was ich nicht einen Weg zu kapseln sie innerhalb einer Funktion gefunden haben - ich möchte eine einfache Version hinzuzufügen, die auf zum Teil basiert Richard Hansen ‚s Antwort , aber tut Adresse auch die Gefahr , die mit einem leeren auftritt
array=()
:$1
der Name eines Leerzeichens enthalten ist$array=()
, stellt der Aufruf zur Deklaration sicher, dass wir das richtige Ergebnis erhaltenMit folgendem Code können die Funktionen getestet werden:
Das Skript sollte zurückkehren
quelle
Bash- Funktion, die sowohl für skalare als auch für Array- Typen funktioniert :
Definition
Aufruf
quelle