Bash ' s feltételes operátor és hozzárendelés

Használhatunk bash feltételes operátort kettőspont után a hozzárendelési operátorokkal?

Bash referencia kézikönyv az aritmetikai operátorokat a következőképpen magyarázza.

  • feltételes operátor expr ? expr : expr
  • hozzárendelés = *= /= %= += -= <<= >>= &= ^= |=

Először is úgy tűnik, hogy ez a kód jól működik:

a=1; ((a? b=1 : 2 )) #seems to work 

De amikor a : után hozzárendelési operátorokat használok, “megkíséreltem hozzárendelni a nem változóhoz” hibát:

a=1; ((a? b=1 : c=1)) #attempted assignment to non-variable error 

Miért használhatunk csak hozzárendelési operátorokat kettőspont előtt?

Megjegyzések

  • Szórakoztató lehet változó hozzárendeléseket végrehajtani a feltételes operátor használatával, de ' d a kódot nagyon olvashatatlanná teszi. id = “12bfbf2de1″>
  • @devnull szerintem a kód ' olvashatósága leginkább attól függ, ki olvassa el. Ennek ellenére igaz lehet, amit mondasz, de én ' teszteltem ternary operátorokat a dash, zsh, sh és bash és mind ugyanúgy viselkednek, annak ellenére, hogy a POSIX nem határozta meg őket. A példád csak a bash és a zsh fájlokban működik, ha jól tudom. Ez azonban POSIX-barát: ( : ${a?} ) && b=1 || c=1. Sokkal könnyebben olvashatónak tartom, mint akár a ternary, akár a saját példáját.
  • Válasz

    A Bash az utolsó parancsot

    a=1; (( (a? b=1 : c)=1 )) 

    elemzi, aminek tisztáznia kell, miért nem működik. Ehelyett a

    a=1; (( a? b=1 : (c=1) )) 

    Válasz

    parancsot kell használni id = “a9c883b1c6″>

    kifejezés. Íme egy másik válaszomtól:

    % 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 

    Látja, ahogy mondja, ez egy feltételes hozzárendelési művelet. A feltételektől függ. A szintaxis így működik:

    $((var = $condition <compare_operator> $condition \ ?if $true_assign :or $false_assign )) 

    Nem hiszem, hogy ezt használja helyesen.

    div id = “b703b012d4″>

    wikipédia :

    ?: használatos az alábbiak szerint:

    condition ? value_if_true : value_if_false

    A feltétel igaz vagy hamis logikai kifejezésként kerül értékelésre. A logikai feltétel értékelése alapján a teljes kifejezés visszaadja az value_if_true értéket, ha a feltétel igaz, de az value_if_false értéket különben. Általában a value_if_true és value_if_false két részkifejezésnek azonos típusúnak kell lennie, amely meghatározza az egész kifejezés típusát. Ennek a típusellenőrzésnek a fontossága az operátor leggyakoribb használatában rejlik – feltételes hozzárendelési utasításokban. Ebben a használatban kifejezésként jelenik meg a hozzárendelési utasítás jobb oldalán, az alábbiak szerint:

    variable = condition ? value_if_true : value_if_false

    A ?: operátor hasonlít ahhoz, ahogyan a feltételes kifejezések (if-then-else konstrukciók) működnek funkcionális programozási nyelvekben, mint például a Scheme, az ML és a Haskell, mivel az if-then-else egy kifejezés az adott nyelveken megadott utasítás helyett.

    Úgy gondolom, hogy a konkrét problémád ehhez kapcsolódik:

    Ahogy az if-else konstrukcióban is, az “x” és “y” kifejezések közül csak az egyiket értékelik.

    Ha átolvassa a fenti linket a ternary kifejezéseken látni fogja azt az értékelést n rövidre van zárva, ezért a hamis oldali hibákra vonatkozó hozzárendelésed azért van, mert 1 = true.

    Mindenesetre nem számít túl sok, mert nem hiszem, hogy ez azt teszi, amit gondol.

    Válasz

    A háromszintű operátorok egy Egy teszt. Nem használják elágazáshoz.

    Ez az egyik módja a bash pszeudo-terner operátor megszerzésének (vegye figyelembe a back-kullancsokat):

    $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

    Vélemény, hozzászólás?

    Az email címet nem tesszük közzé. A kötelező mezőket * karakterrel jelöltük