523 Stimmen

Wie kann man kurz und bündig überprüfen, ob Umgebungsvariablen in einem Unix-Shell-Skript gesetzt sind?

Ich habe ein paar Unix-Shell-Skripte, bei denen ich überprüfen muss, ob bestimmte Umgebungsvariablen gesetzt sind, bevor ich mit der Arbeit beginne, also mache ich so etwas:

if [ -z "$STATE" ]; then
    echo "Need to set STATE"
    exit 1
fi  

if [ -z "$DEST" ]; then
    echo "Need to set DEST"
    exit 1
fi

was eine Menge Tipparbeit ist. Gibt es ein eleganteres Idiom, um zu überprüfen, ob ein Satz von Umgebungsvariablen gesetzt ist?

EDIT: Ich sollte erwähnen, dass diese Variablen keinen sinnvollen Standardwert haben - das Skript sollte fehlschlagen, wenn eine davon nicht gesetzt ist.

2 Stimmen

Viele der Antworten auf diese Frage wirken wie etwas, das man auf Code Golf Stack Exchange .

23voto

Adriano Punkte 467

Meiner Meinung nach ist die einfachste und kompatibelste Prüfung für #!/bin/sh ist:

if [ "$MYVAR" = "" ]
then
   echo "Does not exist"
else
   echo "Exists"
fi

Auch dies ist für /bin/sh und ist auch auf alten Solaris-Systemen kompatibel.

0 Stimmen

Dies "funktioniert", aber selbst alte Solaris-Systeme haben eine /bin/sh die die ${var:?} Notation, etc.

0 Stimmen

Die bisher beste Antwort.

4 Stimmen

Eine leere Zeichenkette ist etwas anderes als gar nicht gesetzt zu sein. Dieser Test würde "Does not exist" ausgeben, nachdem beide unset MYVAR y MYVAR= .

17voto

chepner Punkte 440093

bash 4.2 führte die -v Operator, der prüft, ob ein Name auf cualquier Wert, auch die leere Zeichenkette.

$ unset a
$ b=
$ c=
$ [[ -v a ]] && echo "a is set"
$ [[ -v b ]] && echo "b is set"
b is set
$ [[ -v c ]] && echo "c is set"
c is set

16voto

Mr.Ree Punkte 8112

Ich habe immer benutzt:

if [ "x$STATE" == "x" ]; then echo "Need to set State"; exit 1; fi

Ich fürchte, das ist nicht sehr viel präziser.

Unter CSH haben Sie $?STATE.

2 Stimmen

Damit wird geprüft, ob STATE leer oder ungültig ist, nicht nur ungültig.

10voto

ichigolas Punkte 7296

Für zukünftige Benutzer wie mich wollte ich einen Schritt weitergehen und den Variablennamen parametrisieren, damit ich eine Schleife über eine Liste von Variablennamen in variabler Größe ausführen kann:

#!/bin/bash
declare -a vars=(NAME GITLAB_URL GITLAB_TOKEN)

for var_name in "${vars[@]}"
do
  if [ -z "$(eval "echo \$$var_name")" ]; then
    echo "Missing environment variable $var_name"
    exit 1
  fi
done

3voto

Auch das kann ein Weg sein:

if (set -u; : $HOME) 2> /dev/null
...
...

http://unstableme.blogspot.com/2007/02/checks-whether-envvar-is-set-or-not.html

0 Stimmen

Hinweis: Die Ausgabe redir. dient dazu, eine Fehlermeldung zu unterdrücken, wenn die Variable nicht gesetzt ist.

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X