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 .

3voto

codeforester Punkte 33470

Wir können eine schöne Assertion schreiben, um eine Reihe von Variablen auf einmal zu überprüfen:

#
# assert if variables are set (to a non-empty string)
# if any variable is not set, exit 1 (when -f option is set) or return 1 otherwise
#
# Usage: assert_var_not_null [-f] variable ...
#
function assert_var_not_null() {
  local fatal var num_null=0
  [[ "$1" = "-f" ]] && { shift; fatal=1; }
  for var in "$@"; do
    [[ -z "${!var}" ]] &&
      printf '%s\n' "Variable '$var' not set" >&2 &&
      ((num_null++))
  done

  if ((num_null > 0)); then
    [[ "$fatal" ]] && exit 1
    return 1
  fi
  return 0
}

Beispiel-Aufruf:

one=1 two=2
assert_var_not_null one two
echo test 1: return_code=$?
assert_var_not_null one two three
echo test 2: return_code=$?
assert_var_not_null -f one two three
echo test 3: return_code=$? # this code shouldn't execute

Ausgabe:

test 1: return_code=0
Variable 'three' not set
test 2: return_code=1
Variable 'three' not set

Weitere derartige Behauptungen finden Sie hier: https://github.com/codeforester/base/blob/master/lib/assertions.sh

2voto

Gudlaugur Egilsson Punkte 2309

Keine der oben genannten Lösungen funktionierte für meine Zwecke, zum Teil, weil ich die Umgebung auf eine offene Liste von Variablen überprüfte, die vor dem Start eines langwierigen Prozesses gesetzt werden müssen. Ich endete mit dieser Lösung:

mapfile -t arr < variables.txt

EXITCODE=0

for i in "${arr[@]}"
do
   ISSET=$(env | grep ^${i}= | wc -l)
   if [ "${ISSET}" = "0" ];
   then
      EXITCODE=-1
      echo "ENV variable $i is required."
   fi
done

exit ${EXITCODE}

-1voto

nafdef Punkte 1

Anstatt externe Shell-Skripte zu verwenden, lade ich lieber Funktionen in meine Login-Shell. Ich verwende so etwas wie diese Funktion als Hilfsfunktion, um nach Umgebungsvariablen zu suchen und nicht nach einer bestimmten Variablen:

is_this_an_env_variable ()
    local var="$1"
    if env |grep -q "^$var"; then
       return 0
    else
       return 1
    fi
 }

1 Stimmen

Das ist falsch. is_this_an_env_variable P wird erfolgreich sein, weil PATH existiert.

0 Stimmen

Sie existiert, weil sie eine Umgebungsvariable ist. Ob sie auf eine nicht leere Zeichenkette gesetzt wurde, ist eine andere Sache.

-7voto

Graeme Punkte 85

Le site $? Syntax ist ziemlich ordentlich:

if [ $?BLAH == 1 ]; then 
    echo "Exists"; 
else 
    echo "Does not exist"; 
fi

0 Stimmen

Dies funktioniert, aber weiß jemand hier, wo ich Dokumente zu dieser Syntax finden kann? $? ist normalerweise der vorherige Rückgabewert.

0 Stimmen

Mein Fehler - das scheint nicht zu funktionieren. Versuchen Sie es in einem einfachen Skript, mit und ohne diesen Satz.

11 Stimmen

In Bourne, Korn, Bash und POSIX-Shells, $? ist der Exit-Status des vorherigen Befehls; $?BLAH ist die Zeichenkette, die aus dem Exit-Status des vorangegangenen Befehls, verkettet mit 'BLAH', besteht. Dies testet nicht die Variable $BLAH überhaupt nicht. (Es gibt ein Gerücht, dass es mehr oder weniger das tun könnte, was in csh aber Muscheln lässt man am besten an der Küste liegen.)

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