Bash: dobbel tilsvarer vs -eq

Jeg gjør heltalssammenligning i bash (prøver å se om brukeren kjører som root), og jeg fant to forskjellige måter å gjøre det på:

Dobbelt tilsvarer:

if [ $UID == 0 ] then fi 

-eq

if [ $UID -eq 0 ] then fi 

Jeg forstår at det «s no> = eller < = i bash, bare -ge og -le, så hvorfor er det == hvis det er «sa -eq?

Er det en forskjell i måten den sammenligner begge sider på?

Kommentarer

  • Merk at mellomrom i parentes er påkrevd: [ $UID -eq 0 ], ikke [ $UID -eq 0].

Svar

== er en bash -spesifikt alias for =, som utfører en streng (leksikal) sammenligning i stedet for -eq numerisk sammenligning. (Det er bakover fra Perl: ordstiloperatorene er numeriske, de symbolske er leksikale.)

Kommentarer

  • Betyr det at hvis begge sider er heltall, konverterer den begge sider til strenger og sammenligner dem?
  • Mer presist er det ' omvendt: alt er en streng, -eq forteller bash å tolke strengene som heltall (produserer 0 uten advarsel hvis en streng isn ' t numerisk).
  • @tjameson For å gi et eksempel: [ 01 -eq 1 ] men [ 01 != 1 ].
  • Merk at mens == som [ operatør er ikke-standard og bør ikke brukes, den er ikke bash-spesifikk . Den ble introdusert av ksh og støttes også av zsh (selv om den første = må siteres) , yash og GNU [ verktøyet ( og slike verktøy som er implementert som ksh-skript på noen systemer) i det minste).
  • @geekosaur Jeg får en advarsel fra bash v4.3.42 hvis strengen min ikke er ' t numerisk: $ if [ "hello" -eq 0 ]; then echo true; fi bash: [: hallo: heltalluttrykk forventet

Svar

For å utdype bollovans svar

Det er ingen >= eller <= sammenligningsoperator for strenger. Men du kan bruke dem med ((...)) aritmetisk kommando for å sammenligne heltall.

Du kan også bruke de andre strengesammenligningsoperatorene (==, !=, <, >, men ikke =) for å sammenligne heltall hvis du bruker dem i ((...)).

Eksempler

  • Både [[ 01 -eq 1 ]] og (( 01 == 1 )) gjør heltall sammenligninger. Begge er sanne.
  • Både [[ 01 == 1 ]] og [ 01 = 1 ] gjør strengesammenligninger. Begge er falske.
  • Både (( 01 -eq 1 )) og (( 01 = 1 )) vil returnere en feil.

Merk: Syntaksen for dobbel brakett [[...]] og syntaksen for dobbel parentes ((...)) støttes ikke av alle skjell.

Kommentarer

  • Merk at (unntatt mksh / zsh (unntatt i POSIX-modus (skjønt at ' ikke er en POSIX-funksjon))), ville (( 010 == 10 )) returnere falsk fordi 010 vil bli behandlet som et oktaltall (8 i desimal).
  • Merk at mens de fleste test / [ implementeringer har ' t har >= / <= operatorer (yash ' s [ har skjønt), expr har slike operatører, selv om det vil gjøre det matematisk sammenligning hvis argumentene gjenkjennes som tall (expr 01 '>=' 1 returnerer true, expr X01 '>=' X1 returnerer false).

Svar

Hvis du vil sammenligne heltal, vil du bedre bruke (()), hvor du også kan bruke> = etc.

Eksempel:

if (( $UID == 0 )); then echo "You are root" else echo "You are not root" fi 

Kommentarer

  • Eller (( UID == 0 )) eller (( ! UID )) for det som betyr noe. Merk at ((...)) ikke er standard (en ksh -funksjon som også støttes av bash og zsh med varianter).

Legg igjen en kommentar

Din e-postadresse vil ikke bli publisert. Obligatoriske felt er merket med *