Bash ' s podmíněný operátor a přiřazení

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

  • Může být zábavné provádět přiřazení proměnných pomocí podmíněného operátoru, ale díky ' d bude váš kód vysoce nečitelný. ' d preferuji ((a)) && b=1 || c=1
  • @devnull Myslím, že kód závisí nejvíce na tom, kdo ji přečte. Přesto může být pravda, co říkáte, ale ' jsem testoval ternary operátory v dash, zsh, sh a bash a všichni se chovají stejně, přestože je POSIX neurčil. Váš příklad funguje pouze v bash a zsh, 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.

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

Napsat komentář

Vaše e-mailová adresa nebude zveřejněna. Vyžadované informace jsou označeny *