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.

3voto

jasonleonhard Punkte 8428

Einfachstes Ternär

brew list | grep -q bat && echo 'yes' || echo 'no'

Dieses Beispiel wird bestimmen, ob Sie Homebrew verwendet haben, um bat zu installieren oder noch nicht.

Wenn es wahr ist, sehen Sie "ja"

Wenn es falsch ist, sehen Sie "nein"

Ich habe das -q hinzugefügt, um die ausgegebene Zeichenfolge von grep zu unterdrücken, sodass Sie nur "ja" oder "nein" sehen können

Das Muster, nach dem Sie suchen, ist eigentlich dies

doSomethingAndCheckTruth && echo 'yes' || echo 'no'

Getestet mit bash und zsh

0 Stimmen

Sieh dir diesen Kommentar an. Wenn das && fehlschlägt, wird das || ausgeführt, was nicht ganz das gewünschte Verhalten ist.

0 Stimmen

Meine Antwort hier enthält auch einige ternäre Beispiele: stackoverflow.com/a/62527825/1783588

2voto

André Hillaire Punkte 19

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

einfach schreiben:

b=5
c=1
d=2
let a="(b==5)?c:d"

echo $a # 1

b=6;
c=1;
d=2;
let a="(b==5)?c:d"

echo $a # 2

denken Sie daran, dass " expression " äquivalent zu $(( expression )) ist

2voto

Sergio Abreu Punkte 2326

Hier sind einige Optionen:

1- Verwenden Sie if-then-else in einer Zeile, das ist möglich.

if [[ "$2" == "raiz" ]] || [[ "$2" == '.' ]]; then pasta=''; else pasta="$2"; fi

2- Schreiben Sie eine Funktion so wie diese:

 # Es war einmal eine 'iif' Funktion in MS VB ...

function iif(){
  # Gibt $2 aus, wenn 1, Banane, wahr, usw. und $3 aus, wenn false, null, 0, ''
  case $1 in ''|false|FALSE|null|NULL|0) echo $3;;*) echo $2;;esac
}

Verwenden Sie sie im Skript so:

result=`iif "$expr" 'ja' 'nein'`

# oder sogar interpolieren:
result=`iif "$expr" "positiv" "negativ, weil $1 nicht wahr ist"` 

3- Inspiriert von der Fallantwort, ist eine flexiblere und einzeilige Verwendung:

 case "$expr" in ''|false|FALSE|null|NULL|0) echo "nein...$expr";;*) echo "ja $expr";;esac

 # Der Ausdruck kann etwas sein wie:     
   expr=`expr "$var1" '>' "$var2"`

1voto

Bruno Bronosky Punkte 60135

Dies ähnelt sehr Vladimirs guter Antwort. Wenn Ihr "ternär" ein Fall von "wenn wahr, String, wenn falsch, leer" ist, dann können Sie einfach tun:

$ c="es waren fünf"
$ b=3
$ a="$([[ $b -eq 5 ]] && echo "$c")"
$ echo $a

$ b=5
$ a="$([[ $b -eq 5 ]] && echo "$c")"
$ echo $a
es waren fünf

1voto

druid62 Punkte 87

Ein stringorientatives Alternativ, das ein Array verwendet:

spec=(IGNORIEREN ERSETZEN)
for p in {13..15}; do
  echo "$p: ${spec[p==14]}";
done

das Ausgaben:

13: IGNORIEREN
14: ERSETZEN
15: IGNORIEREN

0 Stimmen

Ich habe deine Antwort in meiner zitiert.

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