Czy istnieje sposób na zrobienie czegoś takiego?
int a = (b == 5) ? c : d;
używasz Bash?
bash
syntax
conditional-operator
En_t8
źródło
źródło
bash
ma coś podobnego do „operatora trójskładnikowego”, jednak wbash
tym przypadku nazywa się go „operatorem warunkowym”expr?expr:expr
(patrzman bash
sekcja goto „Ocena arytmetyczna”). Należy pamiętać, żebash
„operator warunkowy” jest trudny i ma pewne problemy.((...))
. Zobacz Shell Arithmetic .$(( ))
arytmetycznym i oceną arytmetyczną(( ))
. Zobacz takżehttps://mywiki.wooledge.org/ArithmeticExpression
.Odpowiedzi:
operator trójskładnikowy
? :
jest po prostu krótką formąif/else
Lub
źródło
=
operator sprawdza równość ciągów, a nie równość liczbową (tzn.[[ 05 = 5 ]]
Jest fałszem). Jeśli chcesz porównać numerycznie, użyj-eq
zamiast tego.if/then/else
cond && op1 || op2
Konstrukt ma wrodzoną błąd: jeśliop1
ma niezerowy kod zakończenia bez względu na przyczynę, wynik będzie cicho staćop2
.if cond; then op1; else op2; fi
jest również jedną linią i nie ma tej wady.Kod:
źródło
echo "$c"
jest aliasowanym, wielowierszowym poleceniem (jakecho 1; echo 2
), powinieneś umieścić go w nawiasach.&&
nie będzie miało niezerowego statusu wyjścia. W przeciwnym raziea && b || c
„niespodziewanie” zadziała ,c
jeśli sięa
powiedzie, ale sięb
nie powiedzie.Jeśli warunkiem jest jedynie sprawdzenie, czy zmienna jest ustawiona, istnieje jeszcze krótsza forma:
przypisze
a
wartośćVAR
ifVAR
ustawioną, w przeciwnym razie przypisze jej wartość domyślną20
- może to być również wynikiem wyrażenia.Jak zauważa Alex w komentarzu, takie podejście jest technicznie nazywane „rozszerzaniem parametrów”.
źródło
a=${1:-'my-hyphenated-text'}
:-
)${VAR:-yes:-no}
.cond && op1 || op2
Wyrażenie sugerowane w innych odpowiedzi ma wrodzoną błąd: jeśliop1
ma status wyjścia niezerowe,op2
cicho staje się wynikiem; błąd również nie zostanie wykryty w-e
trybie. Tak, że ekspresja jest bezpieczny w użyciu, jeśli tylkoop1
może nigdy nie uda (na przykład:
,true
jeśli wbudowanym poleceniem lub przypisania zmiennej bez żadnych operacji, które może zakończyć się niepowodzeniem (np podziałów i połączeń OS)).Zwróć uwagę na
""
cytaty. Pierwsza para zapobiegnie błędowi składni, jeśli$b
jest pusta lub ma spacje. Inne zapobiegną tłumaczeniu całej białej spacji na pojedyncze spacje.źródło
[ "x$b" -eq "x" ]
służył do testowania konkretnego pustego łańcucha. Lubię używać składni używanych przez zsh („PARAMETER EXPANSION” na stronie zshexpn), ale niewiele wiem o ich przenośności.źródło
(( ))
traktuje wszystkie / wszystkie ciągi jako0
a=$(( b==5 ? c : d ))
Pozwoli to uniknąć wykonywania części po || przez przypadek, gdy kod między && a || zawodzi.
źródło
-e
(set -o errexit; [ 5 == 5 ] && { false; true; echo "success"; } || echo "failure"; echo $?; echo "further on";)
success 0 further on
:
wbudowanego zamiast,true
aby zapisaćexec
-zewnętrzny program.&&
..||
i nadal złapać między nimi nieudane polecenie?&&
i||
z definicji mają zastosowanie do całego polecenia przed nimi. Tak więc, jeśli masz przed sobą dwa polecenia (niezależnie od ich połączenia), nie możesz zastosować go tylko do jednego z nich, a nie do drugiego. Państwo może emulowaćif
/then
/else
logiki ze zmiennymi flagi, ale po co, jeśli istniejeif
/then
/else
właściwa?Komenda let obsługuje większość podstawowych operatorów, których potrzeba:
Oczywiście działa to tylko w przypadku przypisywania zmiennych; nie może wykonywać innych poleceń.
źródło
Oto kolejna opcja, w której musisz określić zmienną, którą przypisujesz tylko raz, i nie ma znaczenia, czy przypisujesz ciąg, czy liczbę:
Tylko myśl. :)
źródło
[ test ]
. Tak więc konstrukcja jest bezpieczna w użyciu tylko wtedy, gdy „wiesz”, że polecenie nie wypisuje niczego na standardowe wyjście.VARIABLE="`[ test ] && echo \"VALUE_A\" || echo \"VALUE_B\"`"
.Wydaje się, że w moich przypadkach użycia działają:
Przykłady
i może być używany w skrypcie takim jak:
terno
źródło
tern
częścią Bash? Wydaje się, że Mac go nie machmod 700 tern
w tym samym folderze. Teraz będziesz miećtern
polecenie w swoim terminaluW skrypcie powłoki możemy zastosować następujące trzy sposoby dla operatora trójskładnikowego:
źródło
Istnieje również bardzo podobna składnia dla trójkowych warunków warunkowych w bash:
Niestety, działa tylko z liczbami - o ile wiem.
źródło
źródło
Możesz użyć tego, jeśli chcesz podobną składnię
źródło
a=$(((b==5) ? : c : d))
-$((...))
jest potrzebne tylko wtedy, gdy chcemy przypisać wynik arytmetyki do innej zmiennej.Oto kilka opcji:
1- Użyj, jeśli jeszcze w jednym wierszu, jest to możliwe.
2- Napisz taką funkcję:
użyj wewnętrznego skryptu w ten sposób
3- Zainspirowany w odpowiedzi na przypadek, bardziej elastyczne i jedno-liniowe użycie to:
źródło
Oto ogólne rozwiązanie
Test z porównaniem numerycznym
a = $(if [ "$b" -eq 5 ]; then echo "$c"; else echo "$d"; fi)
Przetestuj za pomocą porównania ciągów
a = $(if [ "$b" = "5" ]; then echo "$c"; else echo "$d"; fi)
źródło
To bardzo przypomina dobrą odpowiedź Vladimira . Jeśli twoje „trójskładnikowe” to „jeśli prawda, ciąg, jeśli fałsz, puste”, możesz po prostu zrobić:
źródło
odpowiedzieć na:
int a = (b == 5) ? c : d;
tylko napisz:
pamiętaj, że „wyrażenie” jest równoważne $ ((wyrażenie))
źródło
Alternatywa zorientowana na łańcuch, która wykorzystuje tablicę:
które wyjścia:
źródło