Bash ' ehdollinen operaattori ja määritys

Voimmeko käyttää bashin ehdollista operaattoria kaksoispisteen jälkeen tehtäväoperaattoreiden kanssa?

Bash-käyttöopas selittää aritmeettiset operaattorit seuraavasti.

  • ehdollinen operaattori expr ? expr : expr
  • tehtävä = *= /= %= += -= <<= >>= &= ^= |=

Ensinnäkin tämä koodi näyttää toimivan hyvin:

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

Mutta kun käytän määritysoperaattoreita : jälkeen, sain virheen ”yritti osoittaa ei-muuttujaan”:

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

Miksi voimme käyttää vain tehtäväoperaattoreita ennen kaksoispistettä?

Kommentit

  • Voi olla hauskaa suorittaa muuttuvia määrityksiä ehdollisella operaattorilla, mutta se ' d tekee koodistasi erittäin luettavan. I ' d mieluummin ((a)) && b=1 || c=1
  • @devnull Luulen, että koodi ' luettavuus riippuu eniten siitä, kuka lukee sen. Silti voi olla totta, mitä sanot, mutta olen ' testannut ternary operaattoreita dash, zsh, sh, ja bash ja ne kaikki käyttäytyvät samalla tavalla, vaikka POSIX ei ole määrittänyt niitä. Esimerkkisi toimii vain tietojeni mukaan bash – ja zsh -malleissa. Tämä on kuitenkin POSIX-ystävällinen: ( : ${a?} ) && b=1 || c=1. Minusta on myös paljon helpompi lukea kuin joko ternary tai oma esimerkkisi.

Vastaa

Bash jäsentää viimeisen komennosi nimellä

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

jonka pitäisi tehdä selväksi, miksi se ei toimi. Sen sijaan sinun on käytettävä

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

Answer

Tätä kutsutaan ternary assignment -lauseke. Tässä on vähän toisesta vastauksestani:

% 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 

Näet, kuten sanot, tämä on ehdollinen määritysoperaatio. Se riippuu olosuhteista. Syntaksi toimii näin:

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

En usko, että käytät tätä oikein.

Lähettäjä wikipedia :

?: käytetään seuraavasti:

condition ? value_if_true : value_if_false

Ehto arvioidaan tosi tai epätosi Boolen lausekkeeksi. Boolen ehdon arvioinnin perusteella koko lauseke palauttaa arvon_tosi_tosi, jos ehto on tosi, mutta muuten arvo_Jos_tosi. Tavallisesti kahdella alilausekkeella value_if_true ja value_if_false on oltava sama tyyppi, joka määrittää koko lausekkeen tyypin. Tämän tyyppitarkistuksen merkitys on käyttäjän tavallisimmassa käytössä – ehdollisissa määrityslausekkeissa. Tässä käytöksessä se esiintyy lausekkeena toimeksiannon oikealla puolella seuraavasti:

variable = condition ? value_if_true : value_if_false

?: -operaattori on samanlainen kuin ehdolliset lausekkeet (if-then-else -rakenteet) toimivat toiminnallisilla ohjelmointikielillä, kuten Scheme, ML ja Haskell, koska if-then-else muodostaa lauseke lausunnon sijasta näillä kielillä.

Luulen, että ongelmasi liittyy tähän:

Kuten if-else -rakenteessa, vain yksi lausekkeista ”x” ja ”y” arvioidaan.

Jos luet yllä olevan linkin lausekkeisiin ternary näet tämän arvioinnin n on oikosulussa, joten tehtäväsi väärässä sivuvirheessä, koska 1 = true.

Joka tapauksessa sillä ei ole väliä liikaa, koska en usko, että tämä tekee sen, mitä luulet tekevän.

Vastaa

Kolmikantaiset operaattorit palauttavat arvon, joka perustuu koe. Niitä ei käytetä haarautumiseen.

Tässä on yksi tapa saada bash-pseudo-ternäärinen operaattori (huomioi takimerkit):

$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

Vastaa

Sähköpostiosoitettasi ei julkaista. Pakolliset kentät on merkitty *