Wie testet man mit Bash die Gültigkeit einer Umgebungsvariablen, indem man prüft, ob sie existiert und wahr ist?

Wie testet man mit Bash die Gültigkeit einer Umgebungsvariablen, indem man prüft, ob sie existiert und wahr ist?

Ich suche nach einem Test, der etwas zurückgibt, truewenn die Umgebungsvariable definiert ist und einen anderen Wert als 0, falseoder hat NULL.

ENABLE_SOMETHING=1
# or ENABLE_SOMETHING=true

if ... do ...

Hinweis: Unter keinen Umständen sollte die Bash-Software sich darüber beschweren, dass die Variable nicht definiert ist oder einen seltsamen Wert hat. Alles andere als 0, leer, falsch oder nicht definiert wird als wahr betrachtet.

Antwort1

Ein solcher Test existiert zwar nicht wie in einer höheren Programmiersprache wie Java oder C#, ist aber relativ einfach zu konstruieren.

Drei Kommentare zu Ihrer gestellten Frage:

1: Sie arbeiten in Bash nicht mit wörtlichen "true"/"false"-Werten; alle Befehle und Bedingungskonstrukte ergeben eineBeendigungsstatus, oderlogisches Ergebnis, das entweder 0 (wahr) oder ungleich 0 (falsch) ist.
Arbeiten Sie damit, versuchen Sie nicht, das Rad neu zu erfinden.

2: Versuchen Sie, keine Parameternamen in Großbuchstaben zu verwenden, es sei denn, es handelt sich um Umgebungsvariablen. Dies ist eine einfache Konvention, die dabei hilft, Ihren Code sauber zu halten.

3: Was genau meinen Sie mit "NULL"? Die wörtliche ZeichenfolgeNULL, ein leerer Wert oder etwas anderes?
Die letzten beiden Konzepte gibt es in Bash nicht; einNULLDie Variable wäre nicht gesetzt, was Sie bereits prüfen.

Die effektivste Lösung wäre eine Funktion, die eine Variable (oder einen Parameter, wie Bash sie nennt) akzeptiert, diese Bedingungen überprüft und dann den Beendigungsstatus darauf basierend festlegt, wodurch mehrere Wahrheitswerte effektiv zu einer wörtlichen 0 oder 1 zusammengefasst werden.

Zum Beispiel:

is_true() { if [[ "$1" = 0 ]]; then false; elif [[ -z "$1" ]]; then false; elif [[ "$1" =~ [Ff][Aa][Ll][Ss][Ee] ]]; then false; fi; }

  • is_true "1"ergibt 0, was wahr ist
  • is_true "false"ergibt 1, was falsch ist
  • a=10; is_true "$a"ergibt 0
  • grep -q something somefileergibt 0, wenn somethingmindestens einmal in vorkommt somefile.

Beachten Sie, dass das letzte Beispiel deutlich zeigt, dass Sie eine solche Konstruktion NICHT BRAUCHEN; alles, was in Bash geschiehtbereitsarbeitet mit diesen grundlegenden 0/1-Wahrheitswerten.

Aber ich gebe zu, dass Sie möglicherweise die Eingabe von einem komplizierten externen Programm konvertieren müssen :)

Antwort2

Ich finde diese Vergleiche unbrauchbar, da sie den Code undurchsichtig und nicht offensichtlich erscheinen lassen. Ich verwende einfach das nette Feature von Bash, das seit v4.2 verfügbar ist, aus der Manpage:

   -v varname
          True if the shell variable varname is set (has been assigned a value).

Die Verwendung ist sehr einfach

OUTPUT_TO_LOG=1
if [ -v OUTPUT_TO_LOG ]; then
    exec > &>./logfile
fi

Mit anderen Worten: Um als aktiviert zu kennzeichnen, definieren Sie es einfach. Probieren Sie es aus!

$ :() { if [ -v VAR ]; then echo 'existed'; fi }
$ unset VAR && :          # no output
$ unset VAR && VAR= && :  # "existed"
$ unset VAR && VAR=1 && : # "existed"

Antwort3

Sie können alle drei Prüfungen mit regulären Ausdrücken durchführen (undefinierte Parameter werden in eine leere Zeichenfolge aufgelöst):

is_true() (
  shopt -s nocasematch
  [[ ! $1 =~ ^(false|0|)$ ]]
)

verwandte Informationen