
Ich suche nach einem Test, der etwas zurückgibt, true
wenn die Umgebungsvariable definiert ist und einen anderen Wert als 0
, false
oder 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 istis_true "false"
ergibt 1, was falsch ista=10; is_true "$a"
ergibt 0grep -q something somefile
ergibt 0, wennsomething
mindestens einmal in vorkommtsomefile
.
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|)$ ]]
)