Slik bruker du testbetingelser i et Bash-skript

De Linuxtest kommando sammenligner ett element med et annet, men det er mer vanlig i BASH shell-skript som en del av betingede uttalelser som styrer logikk og programflyt.

Et grunnleggende eksempel

test eksempel

Prøv disse kommandoene i et terminalvindu.

test 1 -eq 2 && ekko "ja" || ekko "nei"

Kommandoen ovenfor brytes ned som følger:

  • test: Kommandoen for å utføre en sammenligning
  • 1:Det første elementet du skal sammenligne. I dette eksemplet er det nummeret 1 men det kan være et hvilket som helst tall eller en streng innenfor anførselstegn.
  • -ekv: Metoden for sammenligning. I dette tilfellet tester du om en verdi er lik en annen.
  • 2: Elementet du sammenligner det første elementet mot. I dette eksemplet er det nummeret 2.
  • &&: En Linux-snarvei for å kjede kommandoer sammen, i rekkefølge. Utdataene fra testkjedene til kommandoene som følger. En dobbel ampersand utføres når kommandoen som går foran den har en utgangsstatus på 0, som er en fancy måte å si at kommandoen ikke mislyktes.
  • ekko "ja": Kommandoen som skal kjøres hvis sammenligningen lykkes. I dette tilfellet er alt vi gjør å spørre
    ekko kommando for å skrive ut ordet "ja" til standardutdata, men du kan kjøre en hvilken som helst kommando her som vil utføres hvis testresultatet viste seg å være sant.
  • ||: Det motsatte, på en måte, av &&; double-pipen kjøres bare hvis kommandoen som går foran den mislykkes (har en utgangsstatus som ikke er 0).
  • ekko "nei": Kommandoen som skal kjøres hvis sammenligningen mislykkes.

Kjør fra en shell-prompt, test returnerer ikke en verdi til standardutgangen, den returnerer bare en utgangsstatuskode. Det er derfor det er nødvendig å lenke en ekkokommando.

test utgangsstatus

I hovedsak sammenligner kommandoen 1 til 2, og hvis de samsvarer, utføres ekko "ja"-setningen som viser "ja", og hvis de ikke stemmer overens, utføres ekko "nei"-setningen som viser "Nei."

Sammenligning av tall

Hvis du sammenligner elementer som analyserer som tall, kan du bruke følgende sammenligningsoperatorer:

  • -eq: verdi 1 er lik verdi 2
  • -ge: verdi 1 større eller lik verdi 2
  • -gt: verdi 1 større enn verdi 2
  • -le: verdi 1 mindre enn eller lik verdi 2
  • -lt: verdi 1 mindre enn verdi 2
  • -ne: verdi 1 er ikke lik verdi 2

Eksempler på tester

test 1 -eq 2 && ekko "ja" || ekko "nei"

(viser "nei" på skjermen fordi 1 ikke er lik 2)

test 1 -ge 2 && ekko "ja" || ekko "nei"

(viser "nei" på skjermen fordi 1 ikke er større eller lik 2)

test 1 -gt 2 && ekko "ja" || ekko "nei"

(viser "nei" på skjermen fordi 1 ikke er større enn 2)

test 1 -le 2 && ekko "ja" || ekko "nei"

(viser "ja" på skjermen fordi 1 er mindre enn eller lik 2)

test 1 -lt 2 && ekko "ja" || ekko "nei"

(viser "ja" på skjermen fordi 1 er mindre enn eller lik 2)

test 1 -ne 2 && ekko "ja" || ekko "nei"

(viser "ja" på skjermen fordi 1 ikke er lik 2)

Sammenligning av tekst

Når du sammenligner elementer som analyserer som strenger, bruker du følgende sammenligningsoperatorer:

  • =: streng 1 samsvarer med streng 2
  • !=: streng 1 samsvarer ikke med streng 2
  • -n: strenglengden er større enn 0
  • -z: strenglengden er lik 0

Eksempler

test "string1" = "string2" && ekko "ja" || ekko "nei"

(viser "nei" på skjermen fordi "streng1" ikke er lik "streng2")

test "streng1" != "streng2" && ekko "ja" || ekko "nei"

(viser "ja" på skjermen fordi "streng1" ikke er lik "streng2")

test -n "streng1" && ekko "ja" || ekko "nei"

(viser "ja" på skjermen fordi "streng1" har en strenglengde som er større enn null)

test -z "streng1" && ekko "ja" || ekko "nei"

(viser "nei" på skjermen fordi "streng1" har en strenglengde som er større enn null)

Sammenligning av filer

Når du sammenligner filer, bruk følgende sammenligningsoperatorer:

  • -ef: Filene har samme enhets- og inodenumre (er de samme filen)
  • -nt: Den første filen er nyere enn den andre filen
  • -ot: Den første filen er eldre enn den andre filen
  • -b: Filen eksisterer og er blokk spesial
  • -c: Filen eksisterer og er karakter spesielle
  • -d: Filen eksisterer og er en katalog
  • -e: Filen eksisterer
  • -f: Filen eksisterer og er en vanlig fil
  • -g: Filen eksisterer og har det angitte gruppenummeret
  • -G: Filen eksisterer og eier av brukerens gruppe
  • -h eller -L: Filen eksisterer og er en symbolsk lenke
  • -k: Filen eksisterer og har sin sticky bit satt
  • -O: Filen eksisterer du er eieren
  • -s: Filen eksisterer og er en navngitt pipe
  • -r: Filen eksisterer og er lesbar
  • -s: Filen eksisterer og har en størrelse større enn null
  • -S: Filen eksisterer og er en stikkontakt
  • -t: Filbeskrivelsen åpnes på en terminal
  • -u: Filen eksisterer og set-user-id-biten er satt
  • -w: Filen eksisterer og er skrivbar
  • -x: Filen eksisterer og er kjørbar

Eksempler

test /path/to/file1 -nt /path/to/file2 && ekko "ja"

(Hvis fil1 er nyere enn fil2, vil ordet "ja" vises)

test -e /bane/til/fil1 && ekko "ja"

(hvis fil1 eksisterer vil ordet "ja" vises)

test -O /bane/til/fil1 && ekko "ja"

(hvis du eier fil1, vises ordet "ja")

Blokk spesial: Filen er en blokkenhet som betyr at data leses i blokker med byte. Dette er vanligvis enhetsfiler som harddisker.

Karakter spesiell: Filen reageres umiddelbart når du skriver til den og er vanligvis en enhet som en seriell port

Sammenligning av flere forhold

Så langt har alt vært å sammenligne en ting med en annen, men hva om du vil sammenligne to forhold?

For eksempel, hvis et dyr har fire bein og går "moo", er det sannsynligvis en ku. Bare å sjekke for fire ben garanterer ikke at du har en ku, men det gjør det sikkert å sjekke lyden den lager.

For å teste begge forholdene samtidig, bruk følgende setning:

test 4 -eq 4 -a "moo" = "moo" && ekko "det er en ku" || ekko "det er ikke en ku"

Nøkkeldelen her er -en flagg, som står for og.

Det er en bedre og mer vanlig måte å utføre den samme testen på, og det er som følger:

test 4 -eq 4 && test "moo" = "moo" && ekko "det er en ku" || ekko "det er ikke en ku"

Følg grenene!

Forgreningen av test kommandoen er viktig. Hvis den første testen (4 = 4) mislykkes, vil test kommandoen avsluttes med en utgangskode som ikke er null. Dermed hopper vi til dobbeltrørssymbolet og "det er ikke en ku" skriver ut til standard utgang. Men hvis den første testen lykkes og dermed test resulterer i en utgangskode på 0, så hopper vi til den første doble ampersand. Det neste utsagnet er en annen testbetingelse!

Hvis den andre testen mislykkes, hopper vi igjen til dobbeltrøret og fortsetter derfra. Hvis imidlertid den andre testen lykkes, hopper vi til den andre doble ampersand-setningen, som i dette eksemplet gir bare et ekko av "det er en ku" til standard utgang og avsluttes deretter tilbake til skallet ledetekst.

En annen test sammenligner to utsagn, og hvis en av dem er sann, skriver du ut en streng. For å kontrollere at en fil med navnet "file1.txt" eksisterer eller en fil kalt "fil1.doc" eksisterer, kan du bruke følgende kommando:

test -e fil1.txt -o -e fil1.doc && ekko "fil1 finnes" || ekko "fil1 eksisterer ikke"

Nøkkeldelen her er -o som står for eller.

Det er en bedre og mer vanlig måte å utføre den samme testen på, og det er som følger:

test -e fil1.txt || test -e fil1.doc && ekko "fil1 finnes" || ekko "fil1 eksisterer ikke"

Eliminering av testsøkeordet

Du trenger faktisk ikke bruke ordet test for å utføre sammenligningen. Alt du trenger å gjøre er å sette setningen i hakeparentes som følger:

[ -e fil1.txt ] && ekko "fil1 finnes" || ekko "fil1 eksisterer ikke"

De [ og ] betyr i utgangspunktet det samme som test.

Nå vet du at dette kan du forbedre ved å sammenligne flere forhold som følger:

[ 4 -eq 4 ] && [ "moo" = "moo" ] && ekko "det er en ku" || ekko "det er ikke en ku"
[ -e fil1.txt ] || [ -e fil1.doc ] && ekko "fil1 finnes" || ekko "fil1 eksisterer ikke"

Sammendrag

Testkommandoen er mer nyttig i skript fordi du kan teste verdien av en variabel mot en annen og kontrollere programflyten. På kommandolinjen bruker du den til å teste om en fil eksisterer eller ikke.