1291 Stimmen

Wie kann ich boolesche Variablen in einem Shell-Skript deklarieren und verwenden?

Ich habe versucht, eine Boolesche Variable in einem Shellskript unter Verwendung der folgenden Syntax zu deklarieren:

variable=$false

variable=$true

Ist das richtig? Außerdem, wenn ich diese Variable aktualisieren wollte, würde ich die gleiche Syntax verwenden? Ist schließlich die folgende Syntax zur Verwendung von Booleschen Variablen als Ausdrücke korrekt?

if [ $variable ]

if [ !$variable ]

1voto

will Punkte 4398

Ich fand die vorhandenen Antworten verwirrend.

Persönlich möchte ich einfach etwas haben, das aussieht und funktioniert wie C.

Dieser Ausschnitt funktioniert viele Male am Tag in der Produktion:

snapshotEvents=true

if ($snapshotEvents)
then
    # Mach etwas, wenn wahr
fi

Und um alle zufrieden zu stellen, habe ich getestet:

snapshotEvents=false

if !($snapshotEvents)
then
    # Mach etwas, wenn falsch
fi

Was auch gut funktionierte.

Der $snapshotEvents bewertet den Inhalt des Werts der Variablen. Also brauchst du das $.

Die Klammern brauchst du eigentlich nicht, ich finde sie nur hilfreich.

0voto

Andry Punkte 1591
[[ "$x" == 'true' || "$x" -ne 0 ]] && ...

Es ist einfach genug und hat keine Abhängigkeiten.

-2voto

johnraff Punkte 197

Alternative - Verwendung einer Funktion

is_ok(){ :;}
is_ok(){ return 1;}
is_ok && echo "Es ist in Ordnung" || echo "Etwas ist falsch"

Die Definition der Funktion ist weniger intuitiv, aber das Überprüfen ihres Rückgabewerts ist sehr einfach.

-2voto

Bill Parker Punkte 675

Bash verwirrt wirklich mit Dingen wie [, [[, ((, $((, usw.

Alles drängt sich in den Codebereichen der anderen. Ich denke, das ist größtenteils historisch bedingt, wo Bash gelegentlich vorgeben musste, sh zu sein.

Die meiste Zeit kann ich einfach eine Methode auswählen und dabei bleiben. In diesem Fall neige ich dazu, zu deklarieren (am besten in einer gemeinsamen Bibliotheksdatei, die ich mit . in meinem tatsächlichen Skript(en) einbeziehen kann).

TRUE=1; FALSE=0

Dann kann ich den (( ... ))-Arithmetikoperator verwenden, um auf diese Weise zu testen.

testvar=$FALSE

if [[ -d ${does_directory_exist} ]]
then
    testvar=$TRUE;
fi

if (( testvar == TRUE )); then
    # Dinge machen, denn das Verzeichnis existiert
fi
  1. Sie müssen diszipliniert sein. Ihr testvar muss zu jeder Zeit entweder auf $TRUE oder $FALSE gesetzt sein.

  2. In (( ... ))-Vergleichsoperatoren benötigen Sie nicht das vorangestellte $, was es lesbarer macht.

  3. Ich kann (( ... )) verwenden, weil $TRUE=1 und $FALSE=0, d.h. numerische Werte sind.

  4. Der Nachteil ist, dass man gelegentlich ein $ verwenden muss:

    testvar=$TRUE

    was nicht so schön ist.

Es ist keine perfekte Lösung, aber sie deckt jeden Fall ab, den ich bei einem solchen Test benötige.

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