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″>
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