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,
-eq
fortellerbash
å tolke strengene som heltall (produserer0
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 fordi010
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 (enksh
-funksjon som også støttes avbash
ogzsh
med varianter).
[ $UID -eq 0 ]
, ikke[ $UID -eq 0]
.