Jag gör heljämförelse i bash (försöker se om användaren kör som root), och jag hittade två olika sätt att göra det:
Dubbel är lika med:
if [ $UID == 0 ] then fi
-eq
if [ $UID -eq 0 ] then fi
Jag förstår att det finns ”s no> = eller < = i bash, bara -ge och -le, så varför finns det en ==
om det finns ”sa -eq
?
Finns det en skillnad i hur den jämför båda sidor?
Kommentarer
Svar
==
är en bash
-specifikt alias för =
, som utför en strängjämförelse (lexikal) i stället för -eq
numerisk jämförelse. (Det är bakåt från Perl: ordstilsoperatorerna är numeriska, de symboliska är lexikala.)
Kommentarer
- Betyder det att om båda sidor är heltal, det konverterar båda sidor till strängar och jämför dem sedan?
- Mer exakt är det ' tvärtom: allt är en sträng,
-eq
säger tillbash
att tolka strängarna som heltal (producerar0
utan en varning om en sträng isn ' t numeriskt). - @tjameson För att ge ett exempel:
[ 01 -eq 1 ]
men[ 01 != 1 ]
. - Observera att medan
==
som[
operatör inte är standard och bör används inte, det är inte bash-specifikt . Det introducerades av ksh och stöds också av zsh (även om den första=
måste citeras) , yash och GNU[
-verktyget ( och alla sådana verktyg implementerade som ksh-skript på vissa system) åtminstone). - @geekosaur Jag får en varning från bash v4.3.42 om min sträng inte är ' t numeriskt:
$ if [ "hello" -eq 0 ]; then echo true; fi
bash: [: hej: heltaluttryck förväntas
Svar
För att utarbeta bollovans svar …
Det finns inget >=
eller <=
jämförelseoperatör för strängar. Men du kan använda dem med ((...))
aritmetik-kommandot för att jämföra heltal.
Du kan också använda andra operatörer för strängjämförelse (==
, !=
, <
, >
, men inte =
) för att jämföra heltal om du använder dem i ((...))
.
Exempel
- Både
[[ 01 -eq 1 ]]
och(( 01 == 1 ))
gör heltal jämförelser. Båda är sanna. - Både
[[ 01 == 1 ]]
och[ 01 = 1 ]
gör strängjämförelser. Båda är falska. - Både
(( 01 -eq 1 ))
och(( 01 = 1 ))
returnerar ett fel.
Obs! Syntaxen med dubbla parenteser [[...]]
och syntaxen med dubbla parenteser ((...))
stöds inte av alla skal.
Kommentarer
- Observera att (förutom
mksh
/zsh
(utom i POSIX-läge (även om ' inte är en POSIX-funktion)), skulle(( 010 == 10 ))
returnera falskt eftersom010
skulle behandlas som ett oktalt tal (8 i decimal). - Observera att medan de flesta
test
/[
implementeringar har ' t har>=
/<=
operatörer (yash
' s[
har dock),expr
har sådana operatörer, även om det kommer att göra det matematisk jämförelse om argumenten känns igen som siffror (expr 01 '>=' 1
returnerar true,expr X01 '>=' X1
returnerar false).
Svar
Om du vill göra heljämförelse kan du bättre använda (()), där du också kan använda> = etc.
Exempel:
if (( $UID == 0 )); then echo "You are root" else echo "You are not root" fi
Kommentarer
- Eller
(( UID == 0 ))
eller(( ! UID ))
för det som är viktigt. Observera att((...))
inte är standard (enksh
-funktion som också stöds avbash
ochzsh
med variationer).
[ $UID -eq 0 ]
, inte[ $UID -eq 0]
.