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].