2012-07-27 24 views
29

Ich schreibe ein Shell-Skript, wo ich prüfen muss, ob Umgebungsvariable gesetzt ist, wenn nicht gesetzt, dann muss ich es einstellen. Gibt es eine Möglichkeit, im Shell-Skript nachzusehen, ob eine Umgebungsvariable bereits gesetzt ist oder nicht?überprüfen, ob Umgebungsvariable bereits gesetzt ist

+0

, ist dies kein echtes Duplikat dieser Frage: Die OP hier möchte wissen, ob eine Variable gesetzt wurde, und wenn nicht etwas dagegen tun, statt ein Skripts des Beenden. $ {V :?} ist in diesem Fall keine gültige Antwort. 'setzen | grep -q '^ V =' 'ist. Dies testet auf das Vorhandensein der Variablen und funktioniert auch, wenn die Variable festgelegt wurde, aber auf die leere Zeichenfolge. – Coroos

Antwort

27
[ -z "$VARIABLE" ] && VARIABLE="abc" 

if env | grep -q ^VARIABLE= 
then 
    echo env variable is already exported 
else 
    echo env variable was not exported, but now it is 
    export VARIABLE 
fi 

Ich möchte betonen, dass [ -z $VARIABLE ] nicht genug ist, weil Sie VARIABLE haben können, aber es wurde nicht exportiert. Das bedeutet, dass es sich überhaupt nicht um eine Umgebungsvariable handelt.

+0

Funktioniert das in allen Shell-Umgebungen? – Mojoy

+0

@Senthilnathan: Ja, natürlich, das einzige Ding, das neu geschrieben werden könnte, um diesen peacof Code portabler zu machen, ist 'grep -q'. Man könnte "env" schreiben grep^VARIABLE =>/dev/null' stattdessen. –

+0

Wenn ich eine Variable exportiere, dann setze ich die Variable auf etwas anderes, ohne sie zu exportieren, kommt es zu einer Nichtübereinstimmung zwischen meiner nicht exportierten Variablen und meiner exportierten Variablen, oder wird sie automatisch auch die exportierte Variable aktualisieren? – ArtOfWarfare

7
if [ -z "$VARIABLE" ]; then 
    VARIABLE=... 
fi 

Dies überprüft, ob die Länge von $ VARIABLE gleich Null ist.

13

Was Sie tun möchten, ist heimisch in bash, sie genannt wird Parameter Substitution:

VARIABLE="${VARIABLE:=abc}" 

Wenn die Variable nicht gesetzt ist, der rechten Seite wird auf abc gleich sein. Beachten Sie, dass der interne Operator: = ersetzt werden kann durch: - was testet, wenn VARIABLE nicht gesetzt oder leer ist.

+0

Genau das, was ich gesucht habe. Die Zeile 'export TEST_DATABASE_NAME =" $ {TEST_DATABASE_NAME: = prodlike} "' wird prodlike nur dann als Standard verwenden, wenn TEST_DATABASE_NAME nicht bereits definiert wurde. Keine unordentlichen bedingten Blöcke. Alles in einer Codezeile. –

46

Die Standardlösung bedingt eine Variable (ob in der Umwelt oder nicht) zuzuordnen ist:

: ${VAR=foo} 

Das VAR auf den Wert „foo“ gesetzt wird nur, wenn es nicht gesetzt ist.
So zu legen VAR "foo", wenn VAR nicht gesetzt oder die leere Zeichenkette, die Verwendung ist:

: ${VAR:=foo} 

Um VAR in der Umwelt zu setzen, Follow-up mit:

export VAR 

Sie auch tun können export VAR=${VAR-foo} oder export VAR=${VAR:=foo}, aber einige ältere Shells unterstützen die Syntax von Zuweisung und Export in derselben Zeile nicht. Auch DRY; die Verwendung des Namens auf beiden Seiten des = Operators ist unnötige Wiederholung. (Eine zweite Linie der Variable exportieren verletzt das gleiche Prinzip, aber fühlt sich besser.)

Beachten Sie, dass es sehr schwierig, im Allgemeinen ist, um zu bestimmen, ob eine Variable in der Umgebung ist. Das Analysieren der Ausgabe von env wird nicht funktionieren. Bedenken Sie:

export foo=' 
VAR=var-value' 
env | grep VAR 

Auch funktioniert es einen Sub-Shell und Test zum Laichen:

sh -c 'echo $VAR' 

dass der VAR zeigen würde, wird in dem Sub-Shell gesetzt, was ein Indikator dafür sein würde, dass VAR ist in der Umgebung von der aktuelle Prozess, aber es kann einfach sein, dass VAR in der Initialisierung der Subshell festgelegt ist. Funktionell ist das Ergebnis jedoch dasselbe wie wenn VAR in der Umgebung ist. Zum Glück kümmert es Sie normalerweise nicht, ob VAR in der Umgebung ist oder nicht. Wenn Sie es dort brauchen, legen Sie es dort hin. Wenn Sie es brauchen, nehmen Sie es heraus. Eigentlich

+0

Könnten Sie eine Erklärung hinzufügen, wie die Notation ': $ {VAR: = foo}' intern funktioniert? Ich finde es immer als die Lösung, aber nie, wie es tatsächlich funktioniert. –

+1

Ich habe eine Erklärung zu [StackOverflow] (http://stackoverflow.com/questions/4437573/bash-assign-default-value) gefunden! –

Verwandte Themen