Ich habe versucht, eine boolesche Variable in einem Shell-Skript mit der folgenden Syntax zu deklarieren:
variable=$false
variable=$true
Ist das richtig? Wenn ich diese Variable aktualisieren wollte, würde ich dieselbe Syntax verwenden? Ist die folgende Syntax für die Verwendung von Booleschen Variablen als Ausdrücke korrekt?
if [ $variable ]
if [ !$variable ]
true
undfalse
im Zusammenhang mit den meisten Schnipsel unten sind nur einfache Zeichenfolgen, nicht diebash built-ins
!!! Bitte lesen Sie die Antwort von Mike Holt unten. (Dies ist ein Beispiel, wo eine hoch gewählte und akzeptierte Antworttrue
. Es stellte sich heraus, dass Mikus ursprüngliche Antwort dietrue
eingebaute Antwort wirklich anrief , die überarbeitete Antwort jedoch nicht. Dies führte dazu, dass diese Kommentare hinsichtlich der Funktionsweise von Mikus Code falsch zu sein schienen. Mikus Antwort wurde inzwischen bearbeitet, um sowohl den ursprünglichen als auch den überarbeiteten Code explizit anzuzeigen. Hoffentlich lässt dies die Verwirrung ein für alle Mal ruhen.[ true ] && echo yes, true is true
und (upppsss)[ false ] && echo yes, false is also true
. / bin / true und / bin / false geben einen Rückkehrcode $? für Funktionen nicht zum Vergleich.variable=something
ist, ist es wahr, wenn nicht gesetztvariable=
, wäre das falsch[[ $variable ]] && echo true || echo false
und umgekehrt[[ ! $variable ]] && echo false || echo true
Antworten:
Überarbeitete Antwort (12. Februar 2014)
Ursprüngliche Antwort
Vorsichtsmaßnahmen: https://stackoverflow.com/a/21210966/89391
Von: Verwenden von booleschen Variablen in Bash
Der Grund, warum die ursprüngliche Antwort hier enthalten ist, liegt darin, dass sich die Kommentare vor der Überarbeitung am 12. Februar 2014 nur auf die ursprüngliche Antwort beziehen und viele der Kommentare falsch sind, wenn sie mit der überarbeiteten Antwort verknüpft sind. Zum Beispiel gilt Dennis Williamsons Kommentar zu Bash, der
true
am 2. Juni 2010 eingebaut wurde , nur für die ursprüngliche Antwort, nicht für die überarbeitete.quelle
if
Anweisung führt den Inhalt der Variablen aus, die der integrierte Bash isttrue
. Jeder Befehl könnte als Wert der Variablen festgelegt und ihr Exit-Wert ausgewertet werden.&&
und||
:# t1=true; t2=true; f1=false;
#if $t1 || $f1; then echo is_true ; else echo is_false; fi;
(gibt "true" zurück, da t1 = true) #if $t1 && $f1 || $t2; then echo is_true ; else echo is_false; fi
(gibt "true" zurück, da t2 = true) . Auch dies funktioniert NUR, weil "true" / "false" Bash-Builtins sind (Rückgabe von true / false). Sie können "if $ var ..." nur verwenden, wenn var ein cmd ist (dh wahr oder falsch)TL; DR
Probleme mit Mikus ( Original- ) Antwort
Ich nicht empfehlen , die akzeptierte Antwort 1 . Die Syntax ist hübsch, weist jedoch einige Mängel auf.
Angenommen, wir haben die folgende Bedingung.
In den folgenden Fällen 2 wird diese Bedingung als wahr ausgewertet und der verschachtelte Befehl ausgeführt.
Normalerweise möchten Sie, dass Ihre Bedingung nur dann als wahr ausgewertet wird, wenn Ihre "Boolesche" Variable
var
in diesem Beispiel explizit auf "wahr" gesetzt ist. Alle anderen Fälle sind gefährlich irreführend!Der letzte Fall (# 5) ist besonders ungezogen, da er den in der Variablen enthaltenen Befehl ausführt (weshalb die Bedingung für gültige Befehle 3, 4 als wahr ausgewertet wird ).
Hier ist ein harmloses Beispiel:
Das Zitieren Ihrer Variablen ist sicherer, z
if "$var"; then
. In den oben genannten Fällen sollten Sie eine Warnung erhalten, dass der Befehl nicht gefunden wird. Aber wir können es immer noch besser machen (siehe meine Empfehlungen unten).Siehe auch Mike Holts Erklärung von Mikus ursprünglicher Antwort.
Probleme mit der Antwort von Hbar
Dieser Ansatz hat auch unerwartetes Verhalten.
Sie würden erwarten, dass die obige Bedingung als falsch ausgewertet wird, sodass die verschachtelte Anweisung niemals ausgeführt wird. Überraschung!
Das Zitieren des Werts (
"false"
), das Zitieren der Variablen ("$var"
) oder das Verwenden vontest
oder[[
anstelle von[
macht keinen Unterschied.Was ich tun empfehlen:
Hier sind Möglichkeiten, wie ich Ihnen empfehlen kann, Ihre "Booleschen Werte" zu überprüfen. Sie arbeiten wie erwartet.
Sie sind alle ziemlich gleichwertig. Sie müssen ein paar Tastenanschläge mehr eingeben als in den anderen Antworten 5 , aber Ihr Code ist defensiver.
Fußnoten
man woman
würde immer noch als gültiger Befehl angesehen, selbst wenn keine solche Manpage existiert.quelle
==
mit[
odertest
nicht tragbar. In Anbetracht der Portabilität ist der einzige Vorteil[
/test
hat gegenüber[[
, bleiben Sie dabei=
.Hier scheint es ein Missverständnis über das eingebaute Bash zu geben
true
, und insbesondere darüber, wie Bash Ausdrücke in Klammern erweitert und interpretiert.Der Code in Mikus Antwort hat absolut nichts mit dem eingebauten Bash zu tun
true
, noch/bin/true
mit irgendeiner anderen Variante destrue
Befehls. In diesem Falltrue
handelt es sichtrue
lediglich um eine einfache Zeichenfolge, und es wird niemals ein Aufruf des Befehls / der eingebauten Datei vorgenommen, weder durch die Variablenzuweisung noch durch die Auswertung des bedingten Ausdrucks.Der folgende Code ist funktional identisch mit dem Code in der Antwort des Mikus:
Der einzige Unterschied besteht darin, dass die vier verglichenen Zeichen 'y', 'e', 'a' und 'h' anstelle von 't', 'r', 'u' und 'e' sind. Das ist es. Es wird weder versucht, einen Befehl oder ein eingebautes Objekt mit dem Namen aufzurufen
yeah
, noch wird (in Mikus Beispiel) irgendeine spezielle Behandlung ausgeführt, wenn Bash das Token analysierttrue
. Es ist nur eine Saite und eine völlig willkürliche.Update (2014-02-19): Nachdem ich dem Link in Mikus Antwort gefolgt bin, sehe ich jetzt, woher ein Teil der Verwirrung kommt. Mikus Antwort verwendet einzelne Klammern, aber das Code-Snippet, mit dem er verknüpft ist, verwendet keine Klammern. Es ist nur:
Beide Codefragmente verhalten sich gleich, aber die Klammern ändern vollständig, was unter der Haube vor sich geht.
Hier ist, was Bash in jedem Fall tut:
Keine Klammern:
$the_world_is_flat
auf die Zeichenfolge"true"
."true"
als Befehl zu analysieren .true
Befehl und führen Sie ihn aus (entweder integriert oder/bin/true
abhängig von der Bash-Version).true
Befehls (der immer 0 ist) mit 0. Denken Sie daran, dass in den meisten Shells ein Exit-Code von 0 Erfolg anzeigt und alles andere einen Fehler anzeigt.if
Anweisung austhen
Klammern:
$the_world_is_flat
auf die Zeichenfolge"true"
.string1 = string2
. Der=
Operator ist der String-Vergleichsoperator von bash . Damit..."true"
und durch"true"
.if
Anweisung austhen
.Der Code ohne Klammern funktioniert, da der
true
Befehl einen Exit-Code von 0 zurückgibt, der den Erfolg anzeigt. Der Code in Klammern funktioniert, da der Wert von$the_world_is_flat
mit dem Zeichenfolgenliteraltrue
auf der rechten Seite von identisch ist=
.Betrachten Sie die folgenden zwei Codeausschnitte, um den Punkt nach Hause zu bringen:
Dieser Code (wenn er mit Root-Rechten ausgeführt wird) startet Ihren Computer neu:
Dieser Code gibt nur "Netter Versuch" aus. Der Neustartbefehl wird nicht aufgerufen.
Update (14.04.2014) Um die Frage in den Kommentaren zum Unterschied zwischen
=
und==
: AFAIK zu beantworten , gibt es keinen Unterschied. Der==
Operator ist ein Bash-spezifisches Synonym für=
und soweit ich gesehen habe, funktionieren sie in allen Kontexten genau gleich.Beachten Sie jedoch, dass ich speziell über die Vergleichs-
=
und==
Zeichenfolgenvergleichsoperatoren spreche, die entweder in[ ]
oder in[[ ]]
Tests verwendet werden. Ich schlage das nicht vor=
und bin überall in Bash==
austauschbar .Zum Beispiel können Sie offensichtlich keine Variablenzuweisung durchführen
==
, wie zum Beispielvar=="foo"
(technisch gesehen können Sie dies tun, aber der Wert vonvar
wird sein"=foo"
, da Bash hier keinen==
Operator sieht , sondern einen=
(Zuweisungs-) Operator, gefolgt von der wörtliche Wert="foo"
, der gerade wird"=foo"
).Auch, obwohl
=
und==
untereinander austauschbar sind, sollten Sie bedenken , dass , wie diese Tests Arbeit nicht davon ab , ob Sie es innen mit sind[ ]
oder[[ ]]
, und auch davon , ob oder nicht die Operanden angegeben. Weitere Informationen hierzu finden Sie im Advanced Bash Scripting Guide: 7.3 Andere Vergleichsoperatoren (scrollen Sie nach unten zur Diskussion von=
und==
).quelle
$the_world_is_flat && echo "you are in flatland!"
true
wurden in Bezug auf die ursprüngliche Antwort gemacht. (Die überarbeitete Antwort am 12. Februar 2014 wurde nicht von miku eingereicht.) Ich habe die Antwort so bearbeitet, dass sie sowohl das Original als auch die überarbeitete enthält. Dann machen die Kommentare der Leute Sinn.true
. Gibt es einen Weg? Ich vermute, dass viele Programmierer, die es gewohnt sind, diese Antworten strenger zu betrachten, um ihnen dabei zu helfen, etwasbash
Kleber zu mischen , um ihr Leben ein bisschen einfacher zu machen, einen===
Operator wünschen würden , damit Zeichenfolgen und "Boolesche Werte" nicht wirklich austauschbar sind. Sollten sie haften nur auf 0 und 1 und die Verwendung(( $maybeIAmTrue ))
wie in vorgeschlagen Quolonel Frage ‚s Antwort ?true
, aber im Allgemeinen nicht als Vergleichsvariable, da das Realtrue
per se keinen Wert hat. Es wird lediglich der Exit-Status auf gesetzt0
, um den Erfolg anzuzeigen. Es ist erwähnenswert, dass es im Wesentlichen dem sogenannten "Null-Befehl" entspricht, oder:
. Was die Verwendung von0
und1
angeht, mache ich das heutzutage in all meinen Skripten, in denen ich Boolesche Werte benötige. Und ich benutze den(( ))
Operator anstatt[[ ]]
zu bewerten. Also, wenn ich zum Beispiel habeflag=0
, kann ich es dann tunif (( flag )); then ...
Verwenden Sie arithmetische Ausdrücke.
Ausgabe:
quelle
!
wird der Verlauf erweitert.((! foo))
funktioniert, so auch! ((foo))
. Ich liebe diese Lösung, übrigens. Endlich eine kurze Möglichkeit, boolesche Variablen zu erstellen.((foo || bar))
funktioniert wie erwartet.(())
erweitert Variablen rekursiv, was ich nicht erwartet hatte.foo=bar; bar=baz; ((foo)) && echo echo
druckt nichts, aber es ist wahr mitbaz=1
. So können Siefoo=true
undfoo=false
sowie 0 oder 1 unterstützen, indem Sie dies tuntrue=1
.Um es kurz zu machen:
Es gibt keine Booleschen Werte in Bash
Bash hat boolesche Ausdrücke in Bezug auf Vergleich und Bedingungen. Was Sie in Bash deklarieren und vergleichen können, sind Zeichenfolgen und Zahlen. Das ist es.
Wo immer Sie es sehen
true
oderfalse
in Bash, es ist entweder eine Zeichenfolge oder ein Befehl / eingebauter Befehl, der nur für den Exit-Code verwendet wird.Diese Syntax ...
Ist im Wesentlichen...
Die Bedingung ist wahr , wenn der Befehl Exit - Code 0
true
undfalse
Bash builtins sind und manchmal auch eigenständige Programme , die nichts tun , aber den entsprechenden Exit - Code zurück.Die obige Bedingung entspricht:
Wenn Sie eckige Klammern oder den
test
Befehl verwenden, verlassen Sie sich auf den Exit-Code dieses Konstrukts. Denken Sie daran[ ]
und[[ ]]
sind auch nur Befehle / eingebaute wie alle anderen. Damit ...entspricht
und das
COMMAND
hier ist[[ 1 == 1 ]]
Das
if..then..fi
Konstrukt ist nur syntaktischer Zucker. Sie können die Befehle immer nur durch ein doppeltes kaufmännisches Und getrennt ausführen, um den gleichen Effekt zu erzielen:Wenn Sie
true
undfalse
in diesen Testkonstrukten verwenden, übergeben Sie tatsächlich nur die Zeichenfolge"true"
oder"false"
den Testbefehl. Hier ist ein Beispiel:Ob Sie es glauben oder nicht, aber diese Bedingungen führen alle zum gleichen Ergebnis :
TL; DR; Vergleiche immer mit Strings oder Zahlen
Um dies zukünftigen Lesern klar zu machen, würde ich empfehlen, immer Anführungszeichen zu verwenden
true
undfalse
:TUN
NICHT
Könnte sein
quelle
T
undF
klar zu machen, dass dies keine echten booleschen Werte sind.[
(dhtest
) und dem verstehen, der[[
für seine Bedürfnisse geeignet ist.if ....; then mytest='-gt'; else mytest='-eq'; fi; #several lines of code; if [ "$var1" "$mytest" "$var2" ]; then ...; fi
Vor langer Zeit, als alles, was wir hatten
sh
, wurden Boolesche Werte verarbeitet, indem auf eine Konvention destest
Programms zurückgegriffen wurde, beitest
der ein falscher Exit-Status zurückgegeben wird, wenn sie ohne Argumente ausgeführt werden.Dies ermöglicht es einem, sich eine Variable vorzustellen, die nicht als falsch gesetzt ist, und eine Variable, die auf einen beliebigen Wert als wahr gesetzt ist. Heute
test
ist es ein integrierter Bestandteil von Bash und allgemein bekannt unter seinem Alias aus einem Zeichen[
(oder einer ausführbaren Datei, die in Shells verwendet werden kann, in denen es fehlt, wie Dolmen bemerkt):Aufgrund von Zitierkonventionen bevorzugen Skriptautoren den zusammengesetzten Befehl
[[
, der nachahmttest
, aber eine schönere Syntax hat: Variablen mit Leerzeichen müssen nicht in Anführungszeichen gesetzt werden. Man kann&&
und||
als logische Operatoren mit seltsamer Priorität verwenden, und es gibt keine POSIX-Einschränkungen für die Anzahl der Begriffe.Um beispielsweise festzustellen, ob FLAG gesetzt ist und COUNT eine Zahl größer als 1 ist:
Dieses Zeug kann verwirrend werden, wenn Leerzeichen, Zeichenfolgen mit der Länge Null und Variablen mit dem Wert Null benötigt werden und auch wenn Ihr Skript mit mehreren Shells arbeiten muss.
quelle
[
ist nicht nur ein Alias im Innerenbash
. Dieser Alias existiert auch als Binärdatei (oder als Link, auf den verwiesen wird) und kann mit dem Bare verwendet werdensh
. Überprüfen Siels -l /usr/bin/\[
. Mitbash
/zsh
sollten Sie stattdessen verwenden[[
, das ist ein echtes reines Inneres und ist viel mächtiger.[
undtest
ist auch ein Bash SHELL BUILTIN COMMAND gemäß der Bash-Handbuchseite, daher sollte es kein Problem mit der Leistung geben. Gleiches gilt zB mit Dash. (/ bin / sh kann nur ein Symlink zu / bin / dash sein). Um die ausführbare Datei zu verwenden, müssen Sie den vollständigen Pfad verwenden, d/usr/bin/\[
. H.Im Gegensatz zu vielen anderen Programmiersprachen trennt Bash seine Variablen nicht nach "Typ". [1]
Die Antwort ist also ziemlich klar. Es gibt keine boolesche Variable in Bash.
Jedoch:
Mit einer Deklarationsanweisung können wir die Wertzuweisung auf Variablen beschränken. [2]
Die
r
Option indeclare
undreadonly
wird verwendet, um explizit anzugeben, dass die Variablen schreibgeschützt sind . Ich hoffe, der Zweck ist klar.quelle
declare -ir false=0 true=1
? Was ist der Vorteil der Verwendung eines Arrays?r
Option und denreadonly
Befehl erwähnen . Ich würde es so machen, wie Sie es in meinen Skripten vorgeschlagen habendeclare and use boolean variables
Wir könnten nur auf mehr als eine Weise nachahmen / annehmen, dass eine Variable einen Typ hat . Ich habe das nirgends in Ihrer Antwort erwähnt.Warum nicht einfach einen besseren Wert als wahr und falsch verwenden, anstatt einen Booleschen Wert vorzutäuschen und zukünftigen Lesern eine Falle zu hinterlassen?
Zum Beispiel:
quelle
0
zwingt zufalse
und1
zutrue
. In Bezug auf Programm-Exit-Codes (die Bash historisch verwendet) ist es0
für ein positives Ergebnis odertrue
und alles andere ist negativ / fehlerhaft oderfalse
.POSIX (Portable Operating System Interface)
Ich vermisse hier den entscheidenden Punkt, nämlich die Portabilität. Deshalb hat mein Header POSIX an sich.
Im Wesentlichen sind alle abgestimmten Antworten korrekt, mit der Ausnahme, dass sie zu viel Bash- spezifisch sind.
Grundsätzlich möchte ich nur weitere Informationen zur Portabilität hinzufügen.
[
und]
Klammern wie in[ "$var" = true ]
sind nicht erforderlich, und Sie können sie weglassen und dentest
Befehl direkt verwenden:Wichtiger Hinweis: Ich empfehle dies nicht mehr, da es langsam veraltet ist und es schwieriger ist, mehrere Anweisungen zu kombinieren.
Stellen Sie sich vor , was diese Worte
true
undfalse
bedeuten mit der Schale, testen Sie es selbst:Aber mit Anführungszeichen:
Das gleiche gilt für:
Die Shell kann es nur als Zeichenfolge interpretieren. Ich hoffe, Sie bekommen eine Vorstellung davon, wie gut es ist, das richtige Schlüsselwort ohne Anführungszeichen zu verwenden .
Aber niemand hat es in früheren Antworten gesagt.
Was bedeutet das? Nun, mehrere Dinge.
Sie sollten sich daran gewöhnen, dass boolesche Schlüsselwörter tatsächlich wie Zahlen behandelt werden, dh
true
=0
undfalse
=1
. Denken Sie daran, dass alle Werte ungleich Null wie behandelt werdenfalse
.Da sie als Zahlen behandelt werden, sollten Sie sie auch so behandeln, dh wenn Sie eine Variable definieren, sagen Sie:
Sie können einen entgegengesetzten Wert davon erstellen mit:
Wie Sie selbst sehen können, druckt die Shell
true
zum ersten Mal eine Zeichenfolge, aber seitdem funktioniert alles über eine Zahl, die0
darstellttrue
bzw.1
darstelltfalse
.Schließlich, was Sie mit all diesen Informationen tun sollten
Erstens wäre eine gute Angewohnheit,
0
statt zuzuweisentrue
;1
stattfalse
.Die zweite gute Angewohnheit wäre zu testen, ob die Variable gleich Null ist / nicht:
quelle
In Bezug auf die Syntax ist dies eine einfache Methode, die ich (anhand eines Beispiels) verwende, um die Boolesche Logik konsistent und vernünftig zu verwalten:
Wenn die Variable niemals deklariert wird, lautet die Antwort:
# false
So ist eine einfache Möglichkeit , eine Variable auf true (unter Verwendung dieser Syntax Methodik) zu setzen wäre,
var=1
; umgekehrtvar=''
.Referenz:
-n
= True, wenn die Länge der var-Zeichenfolge ungleich Null ist.-z
= True, wenn die Länge der var-Zeichenfolge Null ist.quelle
In vielen Programmiersprachen ist oder wird der Boolesche Typ als Subtyp einer Ganzzahl implementiert, wobei
true
sich Folgendes verhält1
undfalse
wie folgt verhält0
:Boolescher Wert in C.
Boolescher Wert in Python
Boolescher Wert in Java
Mathematisch ähnelt die Boolesche Algebra dem ganzzahligen arithmetischen Modulo 2. Wenn eine Sprache keinen nativen Booleschen Typ bietet, ist die natürlichste und effizienteste Lösung die Verwendung von Ganzzahlen. Dies funktioniert mit fast jeder Sprache. In Bash können Sie beispielsweise Folgendes tun:
Mann Bash :
quelle
Bill Parker wird abgewählt , weil seine Definitionen von der normalen Code-Konvention umgekehrt sind. Normalerweise ist true als 0 und false als ungleich Null definiert. 1 funktioniert für false, ebenso wie 9999 und -1. Das Gleiche gilt für Funktionsrückgabewerte - 0 ist erfolgreich und alles, was nicht Null ist, ist ein Fehler. Entschuldigung, ich habe noch nicht die Glaubwürdigkeit, auf der Straße abzustimmen oder ihm direkt zu antworten.
Bash empfiehlt, Doppelklammern jetzt als Gewohnheit anstelle von Einzelklammern zu verwenden, und der Link, den Mike Holt gab, erklärt die Unterschiede in ihrer Funktionsweise. 7.3. Andere Vergleichsoperatoren
Zum einen
-eq
ist ein numerischer Operator also der Codegibt eine Fehleranweisung aus und erwartet einen ganzzahligen Ausdruck. Dies gilt für beide Parameter, da keiner ein ganzzahliger Wert ist. Wenn wir jedoch doppelte Klammern setzen, wird keine Fehleranweisung ausgegeben, aber es wird ein falscher Wert ausgegeben (also in 50% der möglichen Permutationen). Es wird zu [[0 -eq true]] = Erfolg ausgewertet, aber auch zu [[0 -eq false]] = Erfolg, was falsch ist (hmmm .... was ist mit diesem eingebauten Wert?).
Es gibt andere Permutationen der Bedingung, die ebenfalls eine falsche Ausgabe ergeben. Grundsätzlich alles (außer der oben aufgeführten Fehlerbedingung), das eine Variable auf einen numerischen Wert setzt und sie mit einem True / False-Builtin vergleicht oder eine Variable auf ein True / False-Builtin setzt und sie mit einem numerischen Wert vergleicht. Auch alles, was eine Variable auf ein True / False-Builtin setzt und einen Vergleich mit
-eq
. Vermeiden Sie daher-eq
boolesche Vergleiche und vermeiden Sie die Verwendung numerischer Werte für boolesche Vergleiche. Hier ist eine Zusammenfassung der Permutationen, die zu ungültigen Ergebnissen führen:Also nun zu dem, was funktioniert. Verwenden Sie True / False-Buildins sowohl für Ihren Vergleich als auch für Ihre Bewertungen (wie Mike Hunt feststellte, schließen Sie sie nicht in Anführungszeichen ein). Verwenden Sie dann entweder ein oder doppeltes Gleichheitszeichen (= oder ==) und entweder einfache oder doppelte Klammern ([] oder [[]]). Persönlich mag ich das doppelte Gleichheitszeichen, weil es mich an logische Vergleiche in anderen Programmiersprachen erinnert, und doppelte Anführungszeichen, nur weil ich gerne tippe. Also diese Arbeit:
Hier hast du es.
quelle
true
/false
integrierten Funktionen werden hier nicht verwendet (ignorieren Sie, was die Syntaxhervorhebung einiger Editoren möglicherweise impliziert), insbesondere in den[…]
Fällen , in denen Sie sie hier als einfache Zeichenfolge betrachten können (eine, die als Parameter für den[
Befehl angegeben wird).Meine Ergebnisse und Vorschläge unterscheiden sich ein wenig von den anderen Beiträgen. Ich fand heraus, dass ich "Boolesche Werte" grundsätzlich wie in jeder "normalen" Sprache verwenden könnte, ohne dass das "Reifenspringen" vorgeschlagen würde ...
Es sind keine
[]
expliziten Zeichenfolgenvergleiche erforderlich oder explizit ... Ich habe mehrere Linux-Distributionen ausprobiert. Ich habe Bash, Dash und BusyBox getestet . Die Ergebnisse waren immer gleich. Ich bin mir nicht sicher, worüber die ursprünglichen Beiträge mit den höchsten Stimmen sprechen. Vielleicht haben sich die Zeiten geändert und das ist alles, was dazu gehört?Wenn Sie eine Variable auf setzen
true
, wird diese anschließend innerhalb einer Bedingung als "positiv" ausgewertet. Setzen Sie es auffalse
und es wird als "negativ" ausgewertet. Sehr einfach! Die einzige Einschränkung ist, dass eine undefinierte Variable ebenfalls als wahr ausgewertet wird ! Es wäre schön, wenn es das Gegenteil tun würde (wie es in den meisten Sprachen der Fall wäre), aber das ist der Trick - Sie müssen nur Ihre Booleschen Werte explizit auf wahr oder falsch initialisieren .Warum funktioniert das so? Diese Antwort ist zweifach. A) wahr / falsch in einer Shell bedeutet wirklich "kein Fehler" gegen "Fehler" (dh 0 gegen alles andere). B) wahr / falsch sind keine Werte - sondern Aussagen im Shell-Scripting! In Bezug auf den zweiten Punkt setzt das Ausführen
true
oderfalse
in einer Zeile für sich den Rückgabewert für den Block, in dem Sie sich befinden, auf diesen Wert, dhfalse
eine Deklaration von "Fehler aufgetreten", wobei true dies "löscht". Wenn Sie es mit einer Zuordnung zu einer Variablen verwenden, wird dies in die Variable "zurückgegeben". Eine undefinierte Variable wird wietrue
in einer Bedingung ausgewertet , da dies gleichermaßen 0 oder "kein Fehler aufgetreten" darstellt.Siehe das Beispiel Bash-Linien und Ergebnisse unten. Testen Sie es selbst, wenn Sie bestätigen möchten ...
Erträge
quelle
Hier ist ein einfaches Beispiel, das für mich funktioniert:
quelle
Hier ist eine Implementierung eines Shorthanded
if true
.Beispiel 1
Beispiel 2
quelle
Ich fand die vorhandenen Antworten verwirrend.
Persönlich möchte ich nur etwas haben, das aussieht und funktioniert wie C.
Dieses Snippet funktioniert mehrmals täglich in der Produktion:
und um alle glücklich zu machen, habe ich getestet:
Was auch gut funktioniert hat.
Das
$snapshotEvents
wertet den Wertinhalt der Variablen aus. Also brauchst du das$
.Sie brauchen die Klammern nicht wirklich, ich finde sie nur hilfreich.
Getestet am: GNU Bash, Version 4.1.11 (2) -Veröffentlichung
Bash Guide für Anfänger , Machtelt Garrels, v1.11, 2008
quelle
()
- sie werden nicht benötigt. Meine einzige Antwort ist, es auszuprobieren, es scheint von der Bash-Version, dem tatsächlichen Ausdruck oder Kontext und so weiter abzuhängen .Hier ist eine Verbesserung gegenüber Mikus ursprünglicher Antwort , die Dennis Williamsons Bedenken in Bezug auf den Fall anspricht, in dem die Variable nicht festgelegt ist:
Und um zu testen, ob die Variable ist
false
:In anderen Fällen mit einem unangenehmen Inhalt in der Variablen ist dies ein Problem mit externen Eingaben, die einem Programm zugeführt werden.
Alle externen Eingaben müssen vor dem Vertrauen validiert werden. Diese Validierung muss jedoch nur einmal durchgeführt werden, wenn diese Eingabe empfangen wird.
Es muss sich nicht auf die Leistung des Programms auswirken, indem es bei jeder Verwendung der Variablen ausgeführt wird, wie Dennis Williamson vorschlägt.
quelle
Sie können shFlags verwenden .
Sie haben die Möglichkeit zu definieren:
DEFINE_bool
Beispiel:
Über die Befehlszeile können Sie Folgendes definieren:
quelle
Dies ist ein Geschwindigkeitstest über verschiedene Möglichkeiten zum Testen von "Booleschen" Werten in Bash:
Es würde so etwas wie drucken
quelle
Alternative - benutze eine Funktion
Das Definieren der Funktion ist weniger intuitiv, aber das Überprüfen des Rückgabewerts ist sehr einfach.
quelle
Bash verwirrt wirklich das Problem mit Größen wie
[
,[[
,((
,$((
etc.Alle treten auf die Codebereiche der anderen. Ich denke, das ist größtenteils historisch, wo Bash vorgeben musste,
sh
gelegentlich zu sein.Meistens kann ich einfach eine Methode auswählen und dabei bleiben. In diesem Fall neige ich dazu, zu deklarieren (vorzugsweise in einer allgemeinen Bibliotheksdatei, die ich
.
in meine eigentlichen Skripte aufnehmen kann).Ich kann dann den
((
...))
arithmetischen Operator verwenden, um auf diese Weise zu testen.Du musst diszipliniert sein. Sie
testvar
müssen entweder auf$TRUE
oder$FALSE
jederzeit eingestellt sein.In
((
...))
Komparatoren benötigen Sie das Vorhergehende nicht$
, wodurch es besser lesbar ist.Ich kann
((
... verwenden,))
weil$TRUE=1
und$FALSE=0
, dh numerische Werte.Der Nachteil ist, dass Sie
$
gelegentlich Folgendes verwenden müssen :das ist nicht so hübsch.
Es ist keine perfekte Lösung, aber es deckt jeden Fall ab, den ich für einen solchen Test benötige.
quelle