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,
-eqsäger tillbashatt tolka strängarna som heltal (producerar0utan 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; fibash: [: 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 eftersom010skulle behandlas som ett oktalt tal (8 i decimal). - Observera att medan de flesta
test/[implementeringar har ' t har>=/<=operatörer (yash' s[har dock),exprhar 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 '>=' 1returnerar true,expr X01 '>=' X1returnerar 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 avbashochzshmed variationer).
[ $UID -eq 0 ], inte[ $UID -eq 0].