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,
-eqkäskeebashtulkitsemaan merkkijonot kokonaislukuina (tuottaa0ilman 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; fibash: [: 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, koska010käsitettäisiin oktaaliluvuna (8 desimaalilukuna). - Huomaa, että vaikka suurin osa
test/[toteutuksissa don ' ei ole>=/<=operaattoreita (yash' s[on kuitenkin),expron tällaisia operaattoreita, vaikka se tekee ar eettinen vertailu, jos argumentit tunnistetaan numeroina (expr 01 '>=' 1palauttaa arvon true,expr X01 '>=' X1palauttaa 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 (ominaisuuttakshtukee myösbashjazshmuunnelmilla).
[ $UID -eq 0 ], ei[ $UID -eq 0].