751 Stimmen

Ternärer Operator (?:) in Bash

Gibt es eine Möglichkeit, so etwas zu tun

int a = (b == 5) ? c : d;

mit Bash?

1 Stimmen

@dutCh's Antwort zeigt, dass bash tatsächlich etwas Ähnliches wie den "ternären Operator" hat, jedoch wird dies in bash als "konditionaler Operator" expr?expr:expr bezeichnet (siehe man bash Abschnitt "Arithmetische Auswertung"). Beachten Sie, dass der bash "konditionale Operator" knifflig ist und einige Fallstricke hat.

0 Stimmen

Bash verfügt über einen ternären Operator für ganze Zahlen und er funktioniert innerhalb des arithmetischen Ausdrucks ((...)). Siehe Shell-Arithmetik.

2 Stimmen

Genau wie @codeforester erwähnt hat, funktioniert der ternäre Operator mit arithmetischer Expansion $(( )) und arithmetischer Auswertung (( )). Siehe auch https://mywiki.wooledge.org/ArithmeticExpression.

42voto

Sir Athos Punkte 8351
[ $b == 5 ] && { a=$c; true; } || a=$d

Dies wird verhindern, dass der Teil nach || versehentlich ausgeführt wird, wenn der Code zwischen && und || fehlschlägt.

0 Stimmen

Dies wird den Fehler im -e-Modus trotzdem nicht erkennen: (set -o errexit; [ 5 == 5 ] && { false; true; echo "Erfolg"; } || echo "Fehler"; echo $?; echo "weiterhin";) -> Erfolg 0 weiterhin

3 Stimmen

Verwenden Sie das eingebaute : anstelle von true, um das Ausführen eines externen Programms mit exec zu vermeiden.

0 Stimmen

@ivan_pozdeev Gibt es einen Weg, && und || zu verwenden und trotzdem einen fehlgeschlagenen Befehl dazwischen zu erkennen?

33voto

Sujay U N Punkte 4456

Wir können im Shell-Skripting für den ternären Operator folgende drei Methoden verwenden:

[ $numVar == numVal ] && resVar="Yop" || resVar="Nop"

Oder

resVar=$([ $numVar == numVal ] && echo "Yop" || echo "Nop")

Oder

(( numVar == numVal ? (resVar=1) : (resVar=0) ))

Aktualisierung: Die Antwort wird für Zeichenkettenberechnungen mit dem unten stehenden Beispiel erweitert. Dies macht Gebrauch von dem zweiten oben genannten Format.

$ strVar='abc';resVar=$([[ $strVar == 'abc' ]] && echo "Yop" || echo "Nop");echo $resVar
Yop
$ strVar='aaa';resVar=$([[ $strVar == 'abc' ]] && echo "Yop" || echo "Nop");echo $resVar
Nop

2 Stimmen

Das ist meiner Meinung nach tatsächlich (die ersten und zweiten speziell, von diesen drei Beispielen) die passendste Antwort auf diese Frage.

1 Stimmen

Jede der vorgeschlagenen Methoden hat Einschränkungen/Fallstricke, die nicht erklärt werden. Daher ist die Verwendung dieser Antwort gefährlich.

14voto

emu Punkte 1389

Der let Befehl unterstützt die meisten grundlegenden Operatoren, die man brauchen würde:

let a=b==5?c:d;

Natürlich funktioniert dies nur für die Zuweisung von Variablen; es kann keine anderen Befehle ausführen.

29 Stimmen

Es ist genau äquivalent zu (( ... )), daher ist es nur für arithmetische Ausdrücke gültig

14voto

Jasonovich Punkte 587

Hier ist eine weitere Option, bei der Sie nur einmal die Variable angeben müssen, die Sie zuweisen, und es spielt keine Rolle, ob es sich um einen String oder eine Zahl handelt:

VARIABLE=`[ test ] && echo VALUE_A || echo VALUE_B`

Nur ein Gedanke. :)

2 Stimmen

Ein großer Nachteil: Es wird auch die stdout von [ test ] erfassen. Daher ist die Konstruktion nur sicher zu verwenden, wenn Sie "wissen", dass der Befehl nichts auf stdout ausgibt.

1 Stimmen

Auch das gleiche wie stackoverflow.com/questions/3953645/ternary-operator-in-bash‌​/… plus die Notwendigkeit, Anführungszeichen zu setzen und Anführungszeichen innerhalb zu escapen. Die version mit tolerantem Leerzeichen sieht so aus VARIABLE="`[ test ] && echo \"VALUE_A\" || echo \"VALUE_B\"`".

12voto

Andre Dias Punkte 137

Es gibt auch eine sehr ähnliche, aber einfachere Syntax für bedingte Operatoren in bash:

a=$(( b == 5 ? 123 : 321  ))

9 Stimmen

Nur gültig für "Arithmetische Ausdehnung", d.h. nicht für Zeichenketten oder jegliche Test Ergebnisse.

0 Stimmen

Das ist richtig, diese Syntax kann keine nicht-arithmetischen Werte vergleichen.

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