Ich weiß, dass es boolesche Werte gibt bash
, aber ich sehe sie nirgendwo verwendet.
Ich möchte einen Wrapper für einige häufig nachgeschlagene Informationen auf meinem Computer schreiben, zum Beispiel ist dieses spezielle USB-Laufwerk eingesteckt / montiert.
Was wäre die beste Vorgehensweise, um dies zu erreichen?
Ein Faden?
drive_xyz_available=true
Eine Zahl (0 für wahr, 0 für falsch)?
drive_xyz_available=0 # evaluates to true
Eine Funktion?
drive_xyz_available() { if available_magic; then return 0 else return 1 fi }
Ich frage mich meistens, was andere Leute von dem Wrapper erwarten würden. Würden sie einen booleschen Wert, einen Befehl wie eine Variable oder eine Funktion zum Aufrufen erwarten?
Unter Sicherheitsaspekten würde ich die zweite Option für die sicherste halten, aber ich würde gerne Ihre Erfahrungen hören.
shell
shell-script
Minix
quelle
quelle
help true ; help false ; help exit
Antworten:
Setzen Sie einfach eine Variable auf einen Wert, der nicht null ist, damit das oben Genannte funktioniert. Dies
[ -n "$var" ]
wäre jedoch kürzer, wenn nicht sogar so offensichtlich.Wenn ein Skript eine Umgebungsvariable als wahr oder falsch interpretiert, interpretiert es einen Wert im Allgemeinen als wahr (und verwendet diesen Wert manchmal, um eine Option zu konfigurieren) oder einen Nullwert als falsch.
Der obige
!not
Wert gibt den Booleschen Wert der Länge des ersten Arguments zurück. Wenn das Argument eine beliebige Anzahl von Zeichen außer 0 enthält, gibt es 0 zurück. Wenn überhaupt keine Zeichen vorhanden sind, wird 1 zurückgegeben. Dies ist im[ -n "$var" ]
Grunde derselbe Test, den Sie durchführen können , aber es hüllt es einfach in eine kleine Funktion namensbool()
.So funktioniert normalerweise eine Flag- Variable. Beispielsweise:
Wo andere Teile eines Skripts nur nach einem Wert suchen müssen, um
$dir
seine Nützlichkeit zu beurteilen. Dies ist auch praktisch, wenn es um die Ersetzung von Parametern geht - da Parameter auf Standardwerte erweitert werden können, um leere oder nicht gesetzte Werte einzufügen, aber ansonsten auf einen voreingestellten Wert wie ...... was würde drucken ...
Natürlich ist es auch möglich, das Gegenteil zu tun,
:+
aber das kann Ihnen immer nur einen voreingestellten Standardwert oder gar nichts geben, wohingegen das obige Formular Ihnen einen Wert oder einen Standardwert geben kann.In Bezug auf die drei Optionen kann jede davon funktionieren, je nachdem, wie Sie sie implementieren. Die Rückgabe der Funktion ist ein Selbsttest, aber wenn diese Rückgabe aus irgendeinem Grund gespeichert werden muss, muss sie in eine Variable eingefügt werden. Es kommt auf den Anwendungsfall an - ist der Boolesche Wert, den Sie einmal auswerten möchten, und geben Sie ihn ein? Wenn ja, machen Sie die Funktion, sonst ist wahrscheinlich eine der beiden anderen notwendig.
quelle
true
oderfalse
einer Variablen zu, die Sie dann tun könnenif $variable; then ...
$IFS
und wenn der var-Wert Benutzereingaben jeglicher Art enthalten könnte, dann auch viel Glück. Wenn der Wert zunächst nicht unbekannt ist, muss er kaum getestet werden. Sicherer können Sieif ${var:+":"} false; then
bei der Arbeit mit booleschen Null- / Nicht-Null-Werten vorgehen. Aber das ist selten nützlicher als[ -n "$var" ] &&
variable=false
und es dann je nach den Bedingungen auf true setze (genau wie bei Verwendung einer Variablen in C), gibt es überhaupt kein Problem. Was ist Ihre Besessenheit, wenn Sie IFS-Werte, Zufallsvariablen usw. variieren? .In
bash
jeder Variablen ist im Wesentlichen eine Zeichenfolge (oder ein Array oder eine Funktion, aber lassen Sie uns hier über reguläre Variablen sprechen).Die Bedingungen werden basierend auf den Rückgabewerten der Testbefehle analysiert - der Rückgabewert ist keine Variable, sondern ein Exit-Status. Wenn Sie
if [ ... ]
oderif [[ ]]
oderif grep something
oder so etwas auswerten , bedeutet der Rückgabewert 0 (nicht Zeichenfolge 0, sondern Beendigungsstatus 0 = Erfolg) wahr und der Rest falsch (also genau das Gegenteil von dem, was Sie in kompilierten Programmiersprachen gewohnt sind). Da es jedoch eine Möglichkeit zum Erfolg und viele Möglichkeiten zum Fehlschlagen gibt und das erwartete Ergebnis der Ausführung in der Regel ein Erfolg ist, wird 0 als häufigstes Standardergebnis verwendet, wenn nichts schief geht. Dies ist sehr nützlich, da jede Binärdatei als Test verwendet werden kann. Wenn sie fehlschlägt, ist sie falsch, andernfalls ist sie wahr.true
undfalse
Programme (in der Regel von eingebauten Programmen überschrieben) sind nur nützliche kleine Programme, die nichtstrue
tun. Sie können nichtsfalse
tun und beenden mit 0, während sie versuchen, nichts zu tun und mit 1 "fehlschlagen".Es liegt an Ihnen, wie Sie Wahrhaftigkeit weitergeben. Es ist durchaus üblich, nur "y" oder "yes" für Wahrheit und Verwendung zu verwenden
if [ x"$variable" = x"yes" ]
(fügte die Dummy-Zeichenfolge hinzu,x
da$variable
dies vor der Erstellung eines falschen Befehlsif [ = "yes" ]
schützt, der nicht analysiert wird, wenn die Länge Null ist ). Es kann auch nützlich sein, einfach eine leere Zeichenfolge für false zu verwenden und[ -z "$variable ]
zu testen, ob sie eine Länge von Null hat (oder-n
nicht Null ist).Wie auch immer, es ist ziemlich selten, dass tatsächlich boolesche Werte übergeben werden müssen
bash
- es ist viel häufiger, einfach einenexit
Fehler zu melden oder ein nützliches Ergebnis zurückzugeben (oder Null, wenn etwas schief geht und auf leere Zeichenfolgen zu testen), und die meisten Fälle können dies Direkt vom Ausgangsstatus auf Fehler prüfen.In Ihrem Fall möchten Sie eine Funktion, die wie jeder andere Befehl funktioniert (daher bei Erfolg 0 zurückgeben), sodass Ihre letzte Option die richtige Wahl zu sein scheint.
Außerdem brauchen Sie möglicherweise nicht einmal eine
return
Erklärung. Wenn die Funktion einfach genug ist, können Sie die Tatsache verwenden, dass sie einfach den Status des zuletzt ausgeführten Befehls in der Funktion zurückgibt. So kann Ihre Funktion einfach seinWenn Sie auf das Vorhandensein eines Geräteknotens
/proc/mounts
prüfen (oder nachfragen , ob dieser eingehängt ist?).quelle
drive_xyz_available()
als die häufigste betrachten würden?y = true
Fall nennen? Nach meiner Erfahrung prüfen die meisten Wrapper-Skripte, ob ein Wert ungleich Null vorliegt, um ihn als wahr zu betrachten - zumindest, wenn es um interpretierte Umgebungsvariablen geht. Ansonsten ignorieren sie Muschelautos.if
Test ist nicht erforderlich, wenn die Variable in Anführungszeichen gesetzt ist.if [ "$variable" = "yes" ]
funktioniert einwandfrei, auch wenn $ variable nicht gesetzt ist.Grundsätzlich ist jede Zahl, die nicht 0 ist, wahr und 0 ist falsch. Grund für die Rückgabe von 0 für ein erfolgreiches Ende eines Skripts oder einer anderen Zahl, um verschiedene Arten von Fehlern zu identifizieren.
$?
Gibt den Exit-Code des vorherigen Befehls / der vorherigen ausführbaren Datei zurück, wobei 0 Erfolg hat, und jede andere Zahl den zurückgegebenen Fehler.Also würde ich diese Methode für wahr / falsch verwenden.
if (( ! $? ));then OK;else NOOK;fi
quelle
true; echo $?
und anfalse; echo $?
.!
das Ergebnis zu negieren , damit es WAHR ist. Das Ergebnis eines Befehls ist 0, wenn es korrekt beendet wurde, was nicht bedeutet, dass 0 wahr ist. Das Worttrue
kann 0 sein, aber 0 ist niemals wahr, wie dieif
Bedingung zeigt.0
isttrue
daif(!x){True();}else{False();}
rufen ,True()
wennx==0
. Die richtige Prüfung wäre aber nicht!x
, sondern!!x
.if
ich nur die Tatsache angegeben habe, dass hier (in bash oder ksh oder tsh oder ....) wie in C / C ++ eine 0 FALSCH ist Die andere Zahl ist WAHR, wie Sie im folgenden Link nachlesen können. Erste Implementierungen von C lieferten keinen Booleschen Typ. Sie wurden als ints definiert, wobei 0 FALSCH und 1 WAHR war. en.wikipedia.org/wiki/Boolean_data_type .