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
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
((a)) && b=1 || c=1
ternary
operaattoreitadash, zsh, sh
, jabash
ja ne kaikki käyttäytyvät samalla tavalla, vaikka POSIX ei ole määrittänyt niitä. Esimerkkisi toimii vain tietojeni mukaanbash
– jazsh
-malleissa. Tämä on kuitenkin POSIX-ystävällinen:( : ${a?} ) && b=1 || c=1
. Minusta on myös paljon helpompi lukea kuin jokoternary
tai oma esimerkkisi.