Teen kokonaislukuvertailua bashissa (yritän nähdä, onko käyttäjä juurtunut root-nimisenä), ja löysin kaksi erilaista tapoja tehdä se:
Tupla on yhtä suuri kuin:
if [ $UID == 0 ] then fi
-eq
if [ $UID -eq 0 ] then fi
Ymmärrän, että bashissa ei ole ”s no> = tai < =, vain -ge ja -le, joten miksi ==
jos on ”sa -eq
?
Onko eroa tavassa verrata molempia osapuolia?
Kommentit
vastaus
==
on bash
-erityinen alias kohteelle =
, joka suorittaa merkkijonollisen (leksikaalisen) vertailun -eq
numeerisen vertailun sijaan. (Perlistä taaksepäin: sanatyyppiset operaattorit ovat numeerisia, symboliset – leksikaalisia.)
Kommentit
- Tarkoittaako tämä, että jos molemmat puolet ovat kokonaislukuja, se muuntaa molemmat puolet merkkijonoiksi ja vertaa niitä sitten?
- Tarkemmin sanottuna se ' s toisinpäin: kaikki on merkkijono,
-eq
käskeebash
tulkitsemaan merkkijonot kokonaislukuina (tuottaa0
ilman varoitusta, jos merkkijono ei ole ' t numeerinen). - @tjameson Esimerkiksi:
[ 01 -eq 1 ]
mutta[ 01 != 1 ]
. - Huomaa, että vaikka
==
operaattorina[
ei ole vakio ja sen pitäisi ei käytetä, se ei ole bash-spesifinen . Sen otti käyttöön ksh, ja sitä tukee myös zsh (vaikka ensimmäinen=
on lainattava) , yash ja GNU[
-apuohjelma ( ja kaikki tällaiset apuohjelmat, jotka on toteutettu ksh-skripteinä joissakin järjestelmissä) ainakin). - @geekosaur Saan varoituksen bash v4.3.42: sta, jos merkkijononi ei ole ' t numeerinen:
$ if [ "hello" -eq 0 ]; then echo true; fi
bash: [: hei: kokonaislauseke odotettavissa
vastaus
Tarkenna bollovanin vastausta …
>=
tai <=
merkkijonojen vertailuoperaattori. Mutta voit käyttää niitä ((...))
-aritmeettisen komennon avulla kokonaislukujen vertaamiseen.
Voit käyttää myös muita merkkijonojen vertailuoperaattoreita (==
, !=
, <
, >
, mutta ei =
) verrata kokonaislukuja, jos käytät niitä ((...))
-tilassa.
Esimerkkejä
- Sekä
[[ 01 -eq 1 ]]
että(( 01 == 1 ))
tee kokonaisluku vertailut. Molemmat ovat totta. - Sekä
[[ 01 == 1 ]]
että[ 01 = 1 ]
tekevät merkkijonovertailuja. Molemmat ovat vääriä. - Sekä
(( 01 -eq 1 ))
että(( 01 = 1 ))
palauttavat virheen.
Huomaa: Kaikki kuoret eivät tue kaksoissulkujen syntaksia [[...]]
ja kaksoissulkeiden syntaksia ((...))
.
Kommentit
- Huomaa (paitsi
mksh
/zsh
(paitsi POSIX-tilassa (vaikka ' ei ole POSIX-ominaisuus)),(( 010 == 10 ))
palauttaisi epätosi, koska010
käsitettäisiin oktaaliluvuna (8 desimaalilukuna). - Huomaa, että vaikka suurin osa
test
/[
toteutuksissa don ' ei ole>=
/<=
operaattoreita (yash
' s[
on kuitenkin),expr
on tällaisia operaattoreita, vaikka se tekee ar eettinen vertailu, jos argumentit tunnistetaan numeroina (expr 01 '>=' 1
palauttaa arvon true,expr X01 '>=' X1
palauttaa arvon false).
vastaus
Jos haluat tehdä kokonaislukuvertailun, käytä paremmin (()), jossa voit käyttää myös> = jne.
Esimerkki:
if (( $UID == 0 )); then echo "You are root" else echo "You are not root" fi
kommentit
- Tai
(( UID == 0 ))
tai(( ! UID ))
. Huomaa, että((...))
ei ole vakio (ominaisuuttaksh
tukee myösbash
jazsh
muunnelmilla).
[ $UID -eq 0 ]
, ei[ $UID -eq 0]
.