Bash: kaksinkertainen yhtä kuin vs -eq

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

  • Huomaa, että suluissa on oltava välilyöntejä: [ $UID -eq 0 ], ei [ $UID -eq 0].

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äskee bash tulkitsemaan merkkijonot kokonaislukuina (tuottaa 0 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, koska 010 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 (ominaisuutta ksh tukee myös bash ja zsh muunnelmilla).

Vastaa

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