ternärer Operator auch in der bash?

Vom einfachen Programm zum fertigen Debian-Paket, Fragen rund um Programmiersprachen, Scripting und Lizenzierung.
Antworten
Benutzeravatar
Duff
Beiträge: 6321
Registriert: 22.03.2005 14:36:03
Wohnort: /home/duff

ternärer Operator auch in der bash?

Beitrag von Duff » 20.11.2009 15:33:18

Hallo,

kann ich den ternären Operator auch in der bash anwenden?
Wenn ja, wie muss der gesamte Ausdruck aussehen?

Bei mir werden immer über die Klammern gemeckert ([[ ... ]], [ ...], etc.)

Danke.
Oh, yeah!

Benutzeravatar
SubOptimal
Beiträge: 1709
Registriert: 10.01.2005 23:25:46
Lizenz eigener Beiträge: GNU Free Documentation License
Wohnort: bei Frankfurt

Re: ternärer Operator auch in der bash?

Beitrag von SubOptimal » 20.11.2009 16:35:24

Hi,

hier ein kleines Beispiel (laut man bash, Abschnitt "ARITHMETIC EVALUATION" und "conditional operator")

Code: Alles auswählen

#!/bin/bash 

wert1=23
wert2=42

max=$(( wert2 > wert1 ? wert2 : wert1 ))

echo "wert1=${wert1} wert2=${wert2} max=${max}"
SubOptimal

Benutzeravatar
Duff
Beiträge: 6321
Registriert: 22.03.2005 14:36:03
Wohnort: /home/duff

Re: ternärer Operator auch in der bash?

Beitrag von Duff » 20.11.2009 18:27:37

Ok, danke.

Ich möchte gerne sowas realisieren:

1. Funktionsaufruf oder ein Kommando
2. Rückgabewert von $?
3. $? ? "eine Ausgabe mit WAHR" : "FEHLER"
Oh, yeah!

Benutzeravatar
SubOptimal
Beiträge: 1709
Registriert: 10.01.2005 23:25:46
Lizenz eigener Beiträge: GNU Free Documentation License
Wohnort: bei Frankfurt

Re: ternärer Operator auch in der bash?

Beitrag von SubOptimal » 21.11.2009 12:50:36

Hi,

in dem Fall würde eher eine der folgenden Varianten passen.

Code: Alles auswählen

#!/bin/bash

# variante 1
if [ $? -eq 0 ]
then.
  echo "True"
else.
  echo "False"
fi

# variante 2
case $? in
  0) echo "True";;
  *) echo "False";;
esac

# variante 3
[ $? -eq 0 ] && echo "True" || echo "False"
Wenn es nur darum geht Dir Tipparbeit zu ersparen, dann kannst Du auch eine Funktion schreiben. Dieser den Returncode und die beiden Ausgabetexte übergeben und die Entscheidung in der Funktion vornehmen. Wobei das der Lesbarkeit durch andere, eventuell nicht unbedingt zuträglich ist.
Letztlich hängt es aber davon ab, was Du genau erreichen willst.

SubOptimal

Benutzeravatar
Duff
Beiträge: 6321
Registriert: 22.03.2005 14:36:03
Wohnort: /home/duff

Re: ternärer Operator auch in der bash?

Beitrag von Duff » 22.11.2009 11:12:07

Kann man die Variante 3 aus deinem Beispiel denn auch mit dem ternären Operator realisieren?

Ich persönlich finde es nicht so schön, wenn man für den Rückgabewert des Status immer eine if-else Anweisung über ca. 10 Zeilen schreibt. Würde sowas lieber in einer Zeile realisieren. Oder wie du schon beschrieben hast, sowas in eine Funktion verpacken und diese aufrufen.


Aber eigentlich möchte ich den ternären Operator dafür verwenden bzw. gerne wissen, wie ich ihn anwenden muss ;-)
Oh, yeah!

Benutzeravatar
SubOptimal
Beiträge: 1709
Registriert: 10.01.2005 23:25:46
Lizenz eigener Beiträge: GNU Free Documentation License
Wohnort: bei Frankfurt

Re: ternärer Operator auch in der bash?

Beitrag von SubOptimal » 22.11.2009 12:47:40

Duff hat geschrieben:Kann man die Variante 3 aus deinem Beispiel denn auch mit dem ternären Operator realisieren?
Siehe meine Antwort:
SubOptimal hat geschrieben:hier ein kleines Beispiel (laut man bash, Abschnitt "ARITHMETIC EVALUATION" und "conditional operator")
Nein, es geht nicht.
Ich persönlich finde es nicht so schön, wenn man für den Rückgabewert des Status immer eine if-else Anweisung über ca. 10 Zeilen schreibt.
Wenn es wiederkehrende Texte sind, dann definiere sie doch global.
Würde sowas lieber in einer Zeile realisieren. Oder wie du schon beschrieben hast, sowas in eine Funktion verpacken und diese aufrufen.
Also mit Zeichenketten und ternärem Operator wird es in der Bash nichts werden.

Und um eine Funktion dafür einzusetzen muss es schon einen wichtigen Grund geben. Es hängt letztlich aber von Deinem Zweck ab. Bring doch mal ein Beispiel, welches Deinem Zweck entspricht, vielleicht gibt es dafür auch eine ganz andere Lösung.

Code: Alles auswählen

#!/bin/bash 

# eine globale Variable für den Rückgabewert wird benötigt 
set RC

ternary() {
  case $1 in
    0) RC=$2;;
    *) RC=$3;;
  esac
}

# Beispiel für einen Prozess der einen Returncode von 0 hat 
test 42 -gt 23

ternary $? "True" "False"
echo "process1 status: $RC"

# Beispiel für einen Prozess der einen Returncode von >0 hat 
test 23 -gt 42

ternary $? "True" "False"
echo "process2 status: $RC"
Aber eigentlich möchte ich den ternären Operator dafür verwenden bzw. gerne wissen, wie ich ihn anwenden muss ;-)
Notfalls die Skriptsprache wechseln. ;-)

SubOptimal

Benutzeravatar
Duff
Beiträge: 6321
Registriert: 22.03.2005 14:36:03
Wohnort: /home/duff

Re: ternärer Operator auch in der bash?

Beitrag von Duff » 22.11.2009 17:33:40

SubOptimal hat geschrieben: Also mit Zeichenketten und ternärem Operator wird es in der Bash nichts werden.
Schade ;-(


Aber danke für das Beispiel.
Oh, yeah!

Antworten