Gibt es eine Möglichkeit, so etwas zu tun?
int a = (b == 5) ? c : d;
mit Bash?
bash
syntax
conditional-operator
En_t8
quelle
quelle
bash
es etwas Ähnliches wie den "ternären Operator" gibt,bash
dies wird jedoch als "bedingter Operator" bezeichnetexpr?expr:expr
(sieheman bash
Abschnitt "Arithmetische Auswertung"). Denken Sie daran, dass derbash
"bedingte Operator" schwierig ist und einige Fallstricke hat.((...))
. Siehe Shell-Arithmetik .$(( ))
und arithmethischer Auswertung(( ))
. Siehe auchhttps://mywiki.wooledge.org/ArithmeticExpression
.Antworten:
ternärer Operator
? :
ist nur eine Kurzform vonif/else
Oder
quelle
=
Operator auf Zeichenfolgengleichheit und nicht auf numerische Gleichheit prüft (dh[[ 05 = 5 ]]
falsch ist). Wenn Sie einen numerischen Vergleich wünschen, verwenden Sie-eq
stattdessen.if/then/else
cond && op1 || op2
Konstrukt hat einen inhärenten Fehler: Wennop1
der Exit-Status ungleich Null aus irgendeinem Grund vorliegt, wird das Ergebnis stillschweigend angezeigtop2
.if cond; then op1; else op2; fi
ist auch eine Zeile und hat diesen Defekt nicht.Code:
quelle
echo "$c"
Beachten Sie, dass Sie das Teil mit einem Alias mit mehreren Zeilen (wieecho 1; echo 2
) in Klammern setzen sollten.&&
nicht einen von Null verschiedenen Exit - Status hat. Andernfallsa && b || c
wird "unerwartet" ausgeführt,c
wenn diesa
erfolgreich ist, aberb
fehlschlägt.Wenn die Bedingung lediglich prüft, ob eine Variable gesetzt ist, gibt es noch eine kürzere Form:
wird
a
dem Wert vonVAR
ifVAR
zugewiesen, andernfalls wird ihm der Standardwert zugewiesen20
- dies kann auch ein Ergebnis eines Ausdrucks sein.Wie Alex im Kommentar bemerkt, wird dieser Ansatz technisch als "Parametererweiterung" bezeichnet.
quelle
a=${1:-'my-hyphenated-text'}
:-
)${VAR:-yes:-no}
.Der
cond && op1 || op2
in anderen Antworten vorgeschlagene Ausdruck weist einen inhärenten Fehler auf: Wennop1
der Exit-Status ungleich Null ist,op2
stillschweigend zum Ergebnis. Der Fehler wird auch nicht im-e
Modus abgefangen . So ist dieser Ausdruck nur dann sicher , wenn zu verwenden ,op1
kann nie versagen (zB:
,true
wenn eine eingebaute oder variable Zuordnung ohne Operationen , die (wie Teilung und OS Anrufe ausfallen können)).Beachten Sie die
""
Anführungszeichen. Das erste Paar verhindert einen Syntaxfehler, wenn$b
es leer ist oder Leerzeichen enthält. Andere verhindern die Übersetzung aller Leerzeichen in einzelne Leerzeichen.quelle
[ "x$b" -eq "x" ]
sie speziell für die leere Zeichenfolge getestet wurden. Ich verwende gerne die von zsh verwendeten Syntaxen ('PARAMETER EXPANSION' in der zshexpn-Manpage), aber ich weiß nicht viel über ihre Portabilität.quelle
(( ))
behandelt alle / alle Zeichenfolgen als0
a=$(( b==5 ? c : d ))
Dadurch wird vermieden, dass das Teil nach || ausgeführt wird aus Versehen, wenn der Code zwischen && und || schlägt fehl.
quelle
-e
Modus immer noch nicht abfangen :(set -o errexit; [ 5 == 5 ] && { false; true; echo "success"; } || echo "failure"; echo $?; echo "further on";)
->success 0 further on
:
Bulit-In, anstatt ein externes Programmtrue
zu speichernexec
.&&
.. zu verwenden||
und trotzdem einen fehlgeschlagenen Befehl zwischen ihnen abzufangen ?&&
Und||
gelten per Definition für den gesamten Befehl vor ihnen. Wenn Sie also zwei Befehle vor sich haben (unabhängig davon, wie sie kombiniert werden), können Sie sie nicht nur auf einen von ihnen und nicht auf den anderen anwenden. Sie können emulierenif
/then
/else
Logik mit Flag - Variablen, aber warum die Mühe , wenn esif
/then
/else
richtige?Der Befehl let unterstützt die meisten grundlegenden Operatoren, die benötigt werden:
Dies funktioniert natürlich nur zum Zuweisen von Variablen. Es können keine anderen Befehle ausgeführt werden.
quelle
Hier ist eine weitere Option, bei der Sie die Variable, die Sie zuweisen, nur einmal angeben müssen. Dabei spielt es keine Rolle, ob es sich bei Ihrer Zuweisung um eine Zeichenfolge oder eine Zahl handelt:
Nur ein Gedanke. :) :)
quelle
[ test ]
. Daher ist die Verwendung des Konstrukts nur dann sicher, wenn Sie "wissen", dass der Befehl nichts an stdout ausgibt.VARIABLE="`[ test ] && echo \"VALUE_A\" || echo \"VALUE_B\"`"
.Folgendes scheint für meine Anwendungsfälle zu funktionieren:
Beispiele
und kann in einem Skript wie folgt verwendet werden:
Seeschwalbe
quelle
tern
Teil von Bash? Mac scheint es nicht zu habenchmod 700 tern
im selben Ordner aus. Jetzt haben Sie einentern
Befehl in Ihrem TerminalIn Shell Scripting können wir für ternäre Operatoren die folgenden drei Möglichkeiten verwenden:
quelle
Es gibt auch eine sehr ähnliche Syntax für ternäre Bedingungen in bash:
Leider funktioniert es nur mit Zahlen - soweit ich weiß.
quelle
quelle
Sie können dies verwenden, wenn Sie eine ähnliche Syntax wünschen
quelle
a=$(((b==5) ? : c : d))
-$((...))
wird nur benötigt, wenn wir das Ergebnis der Arithmetik einer anderen Variablen zuweisen möchten.Hier sind einige Optionen:
1- Verwenden Sie, wenn dann sonst in einer Zeile, ist es möglich.
2- Schreiben Sie eine Funktion wie folgt:
Verwenden Sie ein solches Skript
3- Inspiriert von der Fallantwort ist eine flexiblere und einzeiligere Verwendung:
quelle
Hier ist eine allgemeine Lösung
Test mit numerischem Vergleich
a = $(if [ "$b" -eq 5 ]; then echo "$c"; else echo "$d"; fi)
Test mit String-Vergleich
a = $(if [ "$b" = "5" ]; then echo "$c"; else echo "$d"; fi)
quelle
Dies ähnelt Wladimir's guter Antwort . Wenn Ihr "ternäres" ein Fall von "wenn wahr, Zeichenfolge, wenn falsch, leer" ist, können Sie einfach Folgendes tun:
quelle
zu beantworten auf:
int a = (b == 5) ? c : d;
einfach schreiben:
Denken Sie daran, dass "Ausdruck" $ ((Ausdruck)) entspricht.
quelle
Eine stringorientierte Alternative, die ein Array verwendet:
welche Ausgänge:
quelle