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
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, 
-eqfortellerbashå tolke strengene som heltall (produserer0uten 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; fibash: [: 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 fordi010vil bli behandlet som et oktaltall (8 i desimal). -  Merk at mens de fleste 
test/[implementeringer har ' t har>=/<=operatorer (yash' s[har skjønt),exprhar slike operatører, selv om det vil gjøre det matematisk sammenligning hvis argumentene gjenkjennes som tall (expr 01 '>=' 1returnerer true,expr X01 '>=' X1returnerer 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 (enksh-funksjon som også støttes avbashogzshmed varianter). 
[ $UID -eq 0 ], ikke[ $UID -eq 0].