Bash: dubbelt lika med vs -eq

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

  • Observera att mellanslag inom parentes krävs: [ $UID -eq 0 ], inte [ $UID -eq 0].

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 till bash att tolka strängarna som heltal (producerar 0 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 eftersom 010 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 (en ksh -funktion som också stöds av bash och zsh med variationer).

Lämna ett svar

Din e-postadress kommer inte publiceras. Obligatoriska fält är märkta *