Ich möchte sicherstellen, dass an einem bestimmten Punkt eines Skripts nach dem source
Einrichten einer Konfigurationsdatei mehrere Variablen festgelegt werden und, falls dies nicht der Fall ist, die Ausführung abgebrochen wird, um dem Benutzer die fehlende Variable mitzuteilen. Ich habe versucht
for var in $one $two $three ; do
...
wenn aber zum Beispiel $two
nicht gesetzt ist, wird die Schleife nie ausgeführt $two
. Das nächste, was ich versuchte, war
for var in one two three ; do
if [ -n ${!var} ] ; then
echo "$var is set to ${!var}"
else
echo "$var is not set"
fi
done
Aber wenn zwei nicht gesetzt ist, bekomme ich immer noch "zwei ist gesetzt" anstelle von "zwei ist nicht gesetzt".
Wie kann ich sicherstellen, dass alle erforderlichen Variablen gesetzt sind?
Update / Lösung: Ich weiß, dass es einen Unterschied zwischen "gesetzt" und "gesetzt, aber leer" gibt. Ich verwende jetzt (danke an /programming//a/16753536/3456281 und die Antworten auf diese Frage) das Folgende:
if [ -n "${!var:-}" ] ; then
Wenn var
also gesetzt, aber leer ist, wird es immer noch als ungültig betrachtet.
quelle
set -u
das Skript auch am Anfang anfügen , um es sofort zu beenden, wenn eine nicht festgelegte Variable verwendet wird.Antworten:
Zitierfehler.
Für die Zukunft: Setting
vor dem Ausführen des Codes hätte Ihnen das Problem gezeigt. Anstatt dies dem Code hinzuzufügen, können Sie Ihr Skript mit aufrufen
quelle
set -- $(IFS=, ; echo $cs)
? Die Art von Leuten, die hier fragen müssen, warumif [ -n ${!var} ] ; then
nicht funktioniert? Wahrscheinlich nicht.Das Einzige, was Sie brauchen, sind Zitate in Ihrem Test:
Funktioniert bei mir.
quelle
Wenn Sie möchten, dass das Programm gestoppt wird:
Das wird den Trick machen. Jede Nachricht, die auf das Fragezeichen folgt, wird gedruckt
stderr
und die übergeordnete Shell stirbt ab. OK, also nicht jede Nachricht - nur eine - nur die erste, die fehlschlägt, gibt eine Nachricht aus, da die Shell abstirbt. Ich benutze diese Tests gerne so:Ich hatte viel mehr dazu sagen hier .
quelle
Du kannst hinzufügen
an den Anfang Ihres Skripts, um es zu beenden, wenn es versucht, eine nicht festgelegte Variable zu verwenden.
Ein Skript wie
wird darin enden, dass
Wenn Sie
bash
stattdessen verwenden, sieht der Fehler folgendermaßen aus:quelle
set -u
verhindert genau die Art von Fehler, die das OP zu vermeiden versucht, und ist (im Gegensatz zu allen anderen Lösungen) nicht auf einen bestimmten Satz von Variablen beschränkt. Es ist in der Tat eine nützliche Vorsichtsmaßnahme, dass fast alle Shell-Skripte sicher versagen, anstatt unerwartete Dinge zu tun, wenn eine Variable nicht gesetzt ist. Dieser Artikel ist eine praktische Referenz zum Thema.set -u
Ich denke, es könnte auch verwendet werden, aber es ist nicht so flexibel wie die richtige Parametererweiterung (siehe meine aktualisierte Frage). Und mitset -u
müsste ich einen Dummy-Zugriff auf alle Zielvariablen machen, wenn ich ihr Vorhandensein an einem Ort überprüfen möchte.Eine maximal benutzerfreundliche Lösung testet alle Anforderungen und meldet sie zusammen, anstatt bei der ersten fehlzuschlagen und ein Hin und Her zu erfordern, um die Dinge richtig zu machen:
Ich verwende eine Array-Variable, um zu verfolgen, welche Variablen nicht festgelegt wurden, und benutze das Ergebnis, um eine benutzerbezogene Nachricht zu verfassen.
Anmerkungen:
${required_vars[@]}
in derfor
Schleife hauptsächlich aus Gewohnheit - ich würde nicht raten, irgendwelche Shell-Metazeichen in Ihre Variablennamen aufzunehmen!${#missing_vars[@]}
, weil das immer eine ganze Zahl ist, auch wenn Sie pervers genug sind, um den vorhergehenden Rat zu ignorieren.%q
beim Drucken verwendet;%s
würde normalerweise ausreichen.>&2
, sodass sie nicht an nachfolgende Befehle weitergeleitet wirdquelle
bash
Mit 4.2 können Sie testen, ob eine Variable mit dem-v
Operator festgelegt wurde. Eine nicht festgelegte Variable und eine auf die leere Zeichenfolge festgelegte Variable sind zwei verschiedene Bedingungen:quelle
-v
ist der Name einer Variablen, sofor var in one two three; [[ -v $var ]] && ...; done
würde , wenn jeder überprüfen vonone
,two
undthree
werden in der Reihenfolge festgelegt.Ich denke, wenn Sie meinen
not set
, so darf die Variable niemals initialisiert werden. Wenn Sie verwenden[ -n "${!var}" ]
, so wird die leere Variable wietwo=""
fehlgeschlagen, während es gesetzt ist . Sie können dies versuchen:quelle
Eine prägnante (wenn auch etwas hackige) Lösung für den Fall, dass das
source
d-Skript die Variablen auf einen Nullwert setzen kann, besteht darin, die Variablen vor dem Aufrufen des Skripts auf einen bestimmten Wert zu initialisieren und anschließend nach diesem Wert zu suchen , z.Bquelle
Ich habe die Antwort von @ mikeserv erweitert .
Diese Version verwendet eine Liste von Variablen, um das Vorhandensein zu überprüfen, den Namen der fehlenden Variablen auszudrucken und im Fehlerfall einen Aufruf von usage () auszulösen.
Beispielausgabe bei fehlendem Wert:
Beachten Sie, dass Sie die Variable VALUE in einen alternativen Namen ändern können, der besser zu Ihrer gewünschten Ausgabe passt.
quelle