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

jarno Punkte 687

Dies ist ein Geschwindigkeitstest über verschiedene Möglichkeiten, "Boolean" Werte in Bash zu testen:

#!/bin/bash
rounds=100000

b=true # Für true; b=false für false
type -a true
time for i in $(seq $rounds); do command $b; done
time for i in $(seq $rounds); do $b; done
time for i in $(seq $rounds); do [ "$b" == true ]; done
time for i in $(seq $rounds); do test "$b" == true; done
time for i in $(seq $rounds); do [[ $b == true ]]; done

b=x; # Oder einen beliebigen nicht-leeren String für true; b='' für false
time for i in $(seq $rounds); do [ "$b" ]; done
time for i in $(seq $rounds); do [[ $b ]]; done

b=1 # Oder eine beliebige Nicht-Null-Integer für true; b=0 für false
time for i in $(seq $rounds); do ((b)); done

Es würde etwas in der Art ausgeben:

true ist eine integrierte Shell-Funktion
true ist /bin/true

real    0m0,815s
user    0m0,767s
sys     0m0,029s

real    0m0,562s
user    0m0,509s
sys     0m0,022s

real    0m0,829s
user    0m0,782s
sys     0m0,008s

real    0m0,782s
user    0m0,730s
sys     0m0,015s

real    0m0,402s
user    0m0,391s
sys     0m0,006s

real    0m0,668s
user    0m0,633s
sys     0m0,008s

real    0m0,344s
user    0m0,311s
sys     0m0,016s

real    0m0,367s
user    0m0,347s
sys     0m0,017s

1voto

Hier ist ein einfaches Beispiel, das für mich funktioniert:

temp1=true
temp2=false

if [ "$temp1" = true ] || [ "$temp2" = true ]
then
    echo "Mache etwas."
else
    echo "Mache etwas anderes."
fi

1voto

gogasca Punkte 8373

Sie können shFlags verwenden.

Es gibt Ihnen die Möglichkeit, zu definieren: DEFINE_bool

Beispiel:

DEFINE_bool(big_menu, true, "Erweiterte Optionen im Menü auflisten");

Von der Befehlszeile aus können Sie definieren:

sh script.sh --bigmenu
sh script.sh --nobigmenu # False

1voto

llundin Punkte 283

Hier ist eine Implementierung eines verkürzten wenn wahr.

# Funktion zur Überprüfung, ob eine Variable auf "true" gesetzt ist
_if () {
    [ "${1}" == "true" ] && return 0
    [ "${1}" == "True" ] && return 0
    [ "${1}" == "Yes" ] && return 0
    return 1
}

Beispiel 1

my_boolean=true

_if ${my_boolean} && {
    echo "True ist wahr"
} || {
    echo "Falsch ist falsch"
}

Beispiel 2

my_boolean=false
! _if ${my_boolean} && echo "Nicht wahr ist wahr"

1voto

dolmen Punkte 7171

Hier ist eine Verbesserung von Mikus ursprünglicher Antwort, die sich mit den Bedenken von Dennis Williamson befasst, wenn die Variable nicht gesetzt ist:

the_world_is_flat=true

if ${the_world_is_flat:-false} ; then
    echo "Pass auf, dass du nicht runterfällst!"
fi

Und um zu testen, ob die Variable false ist:

if ! ${the_world_is_flat:-false} ; then
    echo "Pass auf, dass du nicht runterfällst!"
fi

Was andere Fälle mit einem bösen Inhalt in der Variablen betrifft, handelt es sich um ein Problem bei jeder externen Eingabe, die einem Programm zugeführt wird.

Alle externen Eingaben müssen überprüft werden, bevor man ihnen vertraut. Diese Validierung muss jedoch nur einmal erfolgen, wenn die Eingabe empfangen wird.

Es muss nicht die Leistung des Programms beeinträchtigen, indem man es bei jeder Verwendung der Variablen macht, wie Dennis Williamson vorschlägt.

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