2016-09-02 2 views
29

Ich schreibe ein Shell-Skript. In diesem Shell-Skript habe ich eine Variable, die entweder einen Standardwert oder den Wert einer Umgebungsvariablen verwendet. Die Umgebungsvariable muss jedoch nicht vorhanden sein.Shell-Skript: Wie überprüft man, ob eine Umgebungsvariable existiert, und ihren Wert erhalten?

Zum Beispiel übernehmen, bevor das Skript ausgeführt wird, führe ich die folgende Operation:

export DEPLOY_ENV=dev 

Wie sage ich dem Skript für diese Umgebungsvariable zu suchen und speichern seinen Wert in einer Variablen im Script . Wie kann ich dem Skript mitteilen, dass, wenn diese Umgebungsvariable nicht existiert, eine Standardvariable gespeichert wird?

+1

'printenv DEPLOY_ENV' sollte es – sjsam

+0

tun habe ich versucht, zu Testzwecken tempV = $ (printenv LANG) es tat nichts drucken, obwohl das System den Wert LANG hat –

+0

Ihre Aussage "druckt" nichts. Es speichert den Wert der Umgebungsvariable 'LANG' in der Shell-Variable' tempV'. Wie bei den anderen Vorschlägen in diesem Thread: Beachten Sie, dass Sie bei keiner von ihnen unterscheiden können, ob Sie eine Umgebungsvariable oder eine Shell-Variable haben. Wenn diese Unterscheidung wirklich wichtig ist, sollte die von @sjsam vorgeschlagene Lösung in Betracht gezogen werden. – user1934428

Antwort

57
if [[ -z "${DEPLOY_ENV}" ]]; then 
    MY_SCRIPT_VARIABLE="Some default value because DEPLOY_ENV is undefined" 
else 
    MY_SCRIPT_VARIABLE="${DEPLOY_ENV}" 
fi 

# or using a short-hand version 

[[ -z "${DEPLOY_ENV}" ]] && MyVar='default' || MyVar="${DEPLOY_ENV}" 

# or even shorter use 

MyVar="${DEPLOY_ENV:-default_value}" 
33

Sie könnten nur parameter expansion verwenden:

$ {parameter: -Wort}

Wenn Parameter nicht gesetzt oder null ist, die Erweiterung des Wort ersetzt wird. Andernfalls wird der Wert Parameter ersetzt.

diese So versuchen:

var=${DEPLOY_ENV:-default_value} 

Es gibt auch die $ {parameter-Wort} Form, die nur den Standardwert ersetzt, wenn Parameter ungesetzt ist (aber nicht, wenn es null).

Um den Unterschied zwischen den beiden zu zeigen:

$ unset DEPLOY_ENV 
$ echo "'${DEPLOY_ENV:-default_value}' '${DEPLOY_ENV-default_value}'" 
'default_value' 'default_value' 
$ DEPLOY_ENV= 
$ echo "'${DEPLOY_ENV:-default_value}' '${DEPLOY_ENV-default_value}'" 
'default_value' '' 
+1

Beat mich dazu :). Dies sollte der beste Weg sein, es zu tun, ich denke, – sjsam

+0

Mein Skript war nicht in der Lage, den Wert von DEPLOY_ENV zu lesen, Um sicher zu sein, dass die Umgebungsvariable im System existiert, schrieb ich printenv DEPLOY_ENV im Terminal und den richtigen Wert wurde zurückgegeben. Das Skript konnte es jedoch nicht abrufen. –

+0

Das ist definitiv der beste Weg, es zu tun. Hat mir auch etwas Neues beigebracht. +! –

2

Es gibt keinen Unterschied zwischen Umgebungsvariablen und Variablen in einem Skript. Umgebungsvariablen werden erst außerhalb des Skripts definiert, bevor das Skript aufgerufen wird. Aus der Sicht des Skripts ist eine Variable eine Variable.

können Sie überprüfen, ob eine Variable definiert ist:

if [ -z "$a" ] 
then 
    echo "not defined" 
else 
    echo "defined" 
fi 

und dann einen Standardwert für nicht definierte Variablen gesetzt oder sonst etwas tun.

Die -z prüft auf eine leere Zeichenfolge (d. H. Leer). Siehe man bash und suchen Sie nach dem Abschnitt CONDITIONAL EXPRESSIONS.

Sie können auch set -u am Anfang Ihres Skripts verwenden, damit es fehlschlägt, wenn es auf eine undefinierte Variable trifft, wenn Sie vermeiden möchten, dass eine undefinierte Variable auf kreative Art und Weise bricht.

8

Wenn Sie nicht über den Unterschied zwischen einem nicht festgelegten Variable oder einer Variable mit einem leeren Wert egal, können Sie die Standard-Parameterwert Erweiterung verwenden:

foo=${DEPLOY_ENV:-default} 

Wenn Sie tun über den Unterschied sorgen, können Sie auch den -v Operator wird auf explizit zu testen, ob ein Parameter verwenden

foo=${DEPLOY_ENV-default} 

den Doppelpunkt fallen.

if [[ ! -v DEPLOY_ENV ]]; then 
    echo "DEPLOY_ENV is not set" 
elif [[ -z "$DEPLOY_ENV" ]]; then 
    echo "DEPLOY_ENV is set to the empty string" 
else 
    echo "DEPLOY_ENV has the value: $DEPLOY_ENV" 
fi 
+0

Beachten Sie, dass die Option "-v" in Bash 4.2 eingeführt wurde und viele Systeme noch ältere Versionen von Bash ausführen. – pjh

+3

Selbst 'bash' 4.2 ist an diesem Punkt über 5 Jahre alt; Ich neige dazu, etwas Älteres als besonderen Fall zu behandeln, der in der Frage besonders erwähnt werden sollte. – chepner

+1

Es ist erstaunlich, wie die Zeit vergeht ... –

1
NEW_VAR="" 
if [[ ${ENV_VAR} && ${ENV_VAR-x} ]]; then 
    NEW_VAR=${ENV_VAR} 
else 
    NEW_VAR="new value" 
fi 
0

Alle arbeiteten Antworten. Allerdings hatte ich die Variablen hinzufügen, die ich brauchte, um die sudoers-Dateien zu erhalten, wie folgt:

sudo visudo 
Defaults env_keep += "<var1>, <var2>, ..., <varn>" 
Verwandte Themen