Gibt es eine Möglichkeit, so etwas zu tun?
int a = (b == 5) ? c : d;
mit Bash?
((...))
. Siehe Shell-Arithmetik .
$(( ))
und arithmethischer Auswertung (( ))
. Siehe auch https://mywiki.wooledge.org/ArithmeticExpression
.
Gibt es eine Möglichkeit, so etwas zu tun?
int a = (b == 5) ? c : d;
mit Bash?
((...))
. Siehe Shell-Arithmetik .
$(( ))
und arithmethischer Auswertung (( ))
. Siehe auch https://mywiki.wooledge.org/ArithmeticExpression
.
Antworten:
ternärer Operator ? :
ist nur eine Kurzform vonif/else
case "$b" in
5) a=$c ;;
*) a=$d ;;
esac
Oder
[[ $b = 5 ]] && a="$c" || a="$d"
=
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: Wenn op1
der Exit-Status ungleich Null aus irgendeinem Grund vorliegt, wird das Ergebnis stillschweigend angezeigt op2
. if cond; then op1; else op2; fi
ist auch eine Zeile und hat diesen Defekt nicht.
Code:
a=$([ "$b" == 5 ] && echo "$c" || echo "$d")
echo "$c"
Beachten Sie, dass Sie das Teil mit einem Alias mit mehreren Zeilen (wie echo 1; echo 2
) in Klammern setzen sollten.
&&
nicht einen von Null verschiedenen Exit - Status hat. Andernfalls a && b || c
wird "unerwartet" ausgeführt, c
wenn dies a
erfolgreich ist, aber b
fehlschlägt.
Wenn die Bedingung lediglich prüft, ob eine Variable gesetzt ist, gibt es noch eine kürzere Form:
a=${VAR:-20}
wird a
dem Wert von VAR
if VAR
zugewiesen, andernfalls wird ihm der Standardwert zugewiesen 20
- dies kann auch ein Ergebnis eines Ausdrucks sein.
Wie Alex im Kommentar bemerkt, wird dieser Ansatz technisch als "Parametererweiterung" bezeichnet.
a=${1:-'my-hyphenated-text'}
:-
)
${VAR:-yes:-no}
.
if [ "$b" -eq 5 ]; then a="$c"; else a="$d"; fi
Der cond && op1 || op2
in anderen Antworten vorgeschlagene Ausdruck weist einen inhärenten Fehler auf: Wenn op1
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.
[ "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.
(( a = b==5 ? c : d )) # string + numeric
(( ))
behandelt alle / alle Zeichenfolgen als0
a=$(( b==5 ? c : d ))
[ $b == 5 ] && { a=$c; true; } || a=$d
Dadurch wird vermieden, dass das Teil nach || ausgeführt wird aus Versehen, wenn der Code zwischen && und || schlägt fehl.
-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 Programm true
zu speichern exec
.
&&
.. 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 emulieren if
/ then
/ else
Logik mit Flag - Variablen, aber warum die Mühe , wenn es if
/ then
/ else
richtige?
Der Befehl let unterstützt die meisten grundlegenden Operatoren, die benötigt werden:
let a=b==5?c:d;
Dies funktioniert natürlich nur zum Zuweisen von Variablen. Es können keine anderen Befehle ausgeführt werden.
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:
VARIABLE=`[ test ] && echo VALUE_A || echo VALUE_B`
Nur ein Gedanke. :) :)
[ 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:
$ tern 1 YES NO
YES
$ tern 0 YES NO
NO
$ tern 52 YES NO
YES
$ tern 52 YES NO 52
NO
und kann in einem Skript wie folgt verwendet werden:
RESULT=$(tern 1 YES NO)
echo "The result is $RESULT"
function show_help()
{
echo ""
echo "usage: BOOLEAN VALUE_IF_TRUE VALUE_IF_FALSE {FALSE_VALUE}"
echo ""
echo "e.g. "
echo ""
echo "tern 1 YES NO => YES"
echo "tern 0 YES NO => NO"
echo "tern "" YES NO => NO"
echo "tern "ANY STRING THAT ISNT 1" YES NO => NO"
echo "ME=$(tern 0 YES NO) => ME contains NO"
echo ""
exit
}
if [ "$1" == "help" ]
then
show_help
fi
if [ -z "$3" ]
then
show_help
fi
# Set a default value for what is "false" -> 0
FALSE_VALUE=${4:-0}
function main
{
if [ "$1" == "$FALSE_VALUE" ]; then
echo $3
exit;
fi;
echo $2
}
main "$1" "$2" "$3"
tern
Teil von Bash? Mac scheint es nicht zu haben
chmod 700 tern
im selben Ordner aus. Jetzt haben Sie einen tern
Befehl in Ihrem Terminal
In Shell Scripting können wir für ternäre Operatoren die folgenden drei Möglichkeiten verwenden:
[ $numVar == numVal ] && resVar="Yop" || resVar="Nop"
Or
resVar=$([ $numVar == numVal ] && echo "Yop" || echo "Nop")
Or
(( numVar == numVal ? (resVar=1) : (resVar=0) ))
Es gibt auch eine sehr ähnliche Syntax für ternäre Bedingungen in bash:
a=$(( b == 5 ? 123 : 321 ))
Leider funktioniert es nur mit Zahlen - soweit ich weiß.
Sie können dies verwenden, wenn Sie eine ähnliche Syntax wünschen
a=$(( $((b==5)) ? c : d ))
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.
if [[ "$2" == "raiz" ]] || [[ "$2" == '.' ]]; then pasta=''; else pasta="$2"; fi
2- Schreiben Sie eine Funktion wie folgt:
# Once upon a time, there was an 'iif' function in MS VB ...
function iif(){
# Echoes $2 if 1,banana,true,etc and $3 if false,null,0,''
case $1 in ''|false|FALSE|null|NULL|0) echo $3;;*) echo $2;;esac
}
Verwenden Sie ein solches Skript
result=`iif "$expr" 'yes' 'no'`
# or even interpolating:
result=`iif "$expr" "positive" "negative, because $1 is not true"`
3- Inspiriert von der Fallantwort ist eine flexiblere und einzeiligere Verwendung:
case "$expr" in ''|false|FALSE|null|NULL|0) echo "no...$expr";;*) echo "yep $expr";;esac
# Expression can be something like:
expr=`expr "$var1" '>' "$var2"`
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)
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:
$ c="it was five"
$ b=3
$ a="$([[ $b -eq 5 ]] && echo "$c")"
$ echo $a
$ b=5
$ a="$([[ $b -eq 5 ]] && echo "$c")"
$ echo $a
it was five
zu beantworten auf: 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 "Ausdruck" $ ((Ausdruck)) entspricht.
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.