Můžeme použít podmíněný operátor bash s operátory přiřazení za dvojtečkou?
Bash referenční příručka vysvětluje aritmetické operátory následovně.
- podmíněný operátor
expr ? expr : expr
- přiřazení
= *= /= %= += -= <<= >>= &= ^= |=
Nejprve se zdá, že tento kód funguje dobře:
a=1; ((a? b=1 : 2 )) #seems to work
Ale když používám operátory přiřazení po :
, zobrazí se chyba „pokus o přiřazení k neproměnné“:
a=1; ((a? b=1 : c=1)) #attempted assignment to non-variable error
Proč můžeme před dvojtečkou používat pouze operátory přiřazení?
Komentáře
Odpovědět
Bash analyzuje váš poslední příkaz jako
a=1; (( (a? b=1 : c)=1 ))
, což by mělo objasnit, proč nefunguje. Místo toho musíte použít
a=1; (( a? b=1 : (c=1) ))
odpověď
Toto se nazývá ternary assignment
výraz. Tady je něco z jiné mé odpovědi:
% a=abc % b=abcd % t=10 ; f=5 % echo $((r=${#a}>${#b}?t:f)) ; echo $r > 5 > 5 % echo $((r=${#a}<${#b}?t:f)) ; echo $r > 10 > 10
Vidíte, jak říkáte, toto je podmíněná operace přiřazení. Závisí to na podmínkách. Syntaxe funguje takto:
$((var = $condition <compare_operator> $condition \ ?if $true_assign :or $false_assign ))
Nevěřím, že to používáte správně.
Od wikipedia :
?:
je použito takto:
condition ? value_if_true : value_if_false
Podmínka je vyhodnocena jako true nebo false jako booleovský výraz. Na základě vyhodnocení booleovské podmínky vrátí celý výraz value_if_true, pokud je podmínka true, ale value_if_false jinak. Obvykle dva dílčí výrazy value_if_true a value_if_false musí mít stejný typ, který určuje typ celého výrazu. Důležitost této kontroly typu spočívá v nejběžnějším použití operátoru – v příkazech podmíněného přiřazení. V tomto použití se zobrazuje jako výraz na pravé straně příkazu přiřazení, takto:
variable = condition ? value_if_true : value_if_false
?:
operátor je podobný způsobu, jakým podmíněné výrazy (if-then-else
konstrukty) fungují ve funkčních programovacích jazycích, jako jsou Scheme, ML a Haskell, protože if-then-else tvoří výraz namísto prohlášení v těchto jazycích.
Myslím, že s tím souvisí váš konkrétní problém:
Stejně jako v konstrukci if-else je vyhodnocen pouze jeden z výrazů „x“ a „y“.
Pokud si přečtete výše uvedený odkaz na ternary
výrazech uvidíte to hodnocení n je zkratováno, takže vaše přiřazení na falešné straně chyby, protože 1 = true
.
V každém případě na tom nezáleží příliš mnoho, protože si nemyslím, že to dělá to, co si myslíte.
Odpovědět
Ternární operátoři vracejí hodnotu na základě test. Nepoužívají se k větvení.
Zde je jeden způsob, jak získat pseudo-ternární operátor pro bash (všimněte si zpětných značek):
$result=`[ < condition > ] && echo "true-result" || echo "false-result" `
$ a=
$ c=`[ $a ] && echo 1 || echo 0`
$ echo $c
0
$ a=5
$ c=`[ $a ] && echo 1 || echo 0`
$ echo $c
1
((a)) && b=1 || c=1
ternary
operátory vdash, zsh, sh
abash
a všichni se chovají stejně, přestože je POSIX neurčil. Váš příklad funguje pouze vbash
azsh
, pokud vím. Toto je však POSIX friendly:( : ${a?} ) && b=1 || c=1
. Také mi připadá mnohem snazší číst nežternary
nebo váš vlastní příklad.