Welcome to Our Website

Bash Scripting Tutorial – 5. Om uttalanden

om uttalanden!

beslut, beslut.

introduktion

Bash om uttalanden är mycket användbara. I det här avsnittet i vår Bash Scripting Tutorial lär du dig hur du kan använda om uttalanden i dina Bash skript för att automatisera uppgifter.

om uttalanden (och, närbesläktade, kundcaseförklaringar) tillåter oss att fatta beslut i våra bash-skript. De tillåter oss att bestämma om vi ska köra en bit kod baserat på villkor som vi kan ställa in., Om uttalanden, i kombination med loopar (som vi ska titta på i nästa avsnitt) tillåter oss att göra mycket mer komplexa skript som kan lösa större uppgifter.

liksom vad vi har tittat på i tidigare avsnitt, är deras syntax mycket specifik så håll koll på alla små detaljer.

grundläggande If-satser

en grundläggande if-sats säger, om ett visst test är sant, utför sedan en viss uppsättning åtgärder. Om det inte är sant, utför inte dessa åtgärder., Om du följer formatet nedan:

om

<kommandon>
fi

något mellan då och fi (om bakåt) kommer att utföras endast om testet (mellan hakparenteserna) är sant.

låt oss titta på ett enkelt exempel:

if_example.sh

  1. #!/ bin / bash
  2. # Basic if statement
  3. Om
  4. sedan
  5. echo hey det är ett stort antal.,
  6. pwd
  7. fi
  8. datum

låt oss bryta ner det:

  • linje 4 – Låt oss se om det första kommandoradsargumentet är större än 100
  • linje 6 och 7 – kommer bara att köras om testet på rad 4 returnerar sant. Du kan ha så många kommandon här som du vill.
  • linje 6-backslashen ( \ ) framför det enda citatet ( ’ ) behövs eftersom det enda citatet har en speciell betydelse för bash och vi vill inte ha den speciella betydelsen. Backslashen undviker den speciella betydelsen för att göra det till ett normalt vanligt enda citat igen.,
  • Linje 8 – fi signalerar slutet av if-satsen. Alla kommandon efter detta kommer att köras som vanligt.
  • rad 10 – eftersom det här kommandot ligger utanför if-satsen kommer det att köras oavsett resultatet av if-satsen.
  1. . / if_example.sh 15
  2. Fre 5 Feb 9: 06: 30 2021
  3. . / if_example.sh 150
  4. Hej det är ett stort antal.
  5. /home/ryan/bin
  6. Fre 5 Feb 9:06:30 2021

det är alltid bra att testa dina skript med input som täcker de olika scenarierna som är möjliga.,

Test

hakparenteserna ( ) i if-satsen ovan är faktiskt en referens till kommandotestet. Detta innebär att alla operatörer som testar tillåter kan användas här också. Slå upp mansidan för test för att se alla möjliga operatörer (det finns en hel del) men några av de vanligaste är listade nedan.

operatör beskrivning
! Uttryck uttrycket är falskt.
-n STRING strängens längd är större än noll.,
-z STRING strängens längd är noll (dvs den är tom).
STRING1 = STRING2 STRING1 är lika med STRING2
STRING1 ! STRING2 STRING1 är inte lika med STRING2
HELTAL1-EQ HELTAL2 HELTAL1 är numeriskt lika med HELTAL2
HELTAL1-gt HELTAL2 HELTAL1 är numeriskt större än HELTAL2
HELTAL1-lt HELTAL2 heltal1 är numeriskt mindre än heltal2
-d-fil filen finns och är en katalog.,
-E-fil filen finns.
-R fil filen finns och läsbehörighet beviljas.
-s fil filen finns och dess storlek är större än noll (dvs. det är inte tomt).
-W-fil filen finns och skrivbehörighet beviljas.
-x fil filen finns och kör tillstånd beviljas.

några punkter att notera:

  • = är något annorlunda än-eq. kommer att returnera falskt som = gör en strängjämförelse (dvs., samma) medan-eq gör en numerisk jämförelse mening kommer att returnera sant.
  • när vi hänvisar till filen ovan betyder vi faktiskt en sökväg. Kom ihåg att en sökväg kan vara absolut eller relativ och kan hänvisa till en fil eller en katalog.
  • eftersom det bara är en referens till kommandotestet kan vi experimentera och problem skjuta med test på kommandoraden för att se till att vår förståelse av dess beteende är korrekt.
  1. test 001 = 1
  2. echo $?
  3. 1
  4. test 001-EQ 1
  5. echo $?,
  6. 0
  7. touch myfile
  8. test-s myfile
  9. echo $?
  10. 1
  11. ls / etc > myfile
  12. test-s myfile
  13. echo $?
  14. 0

låt oss bryta ner det:

  • linje 1 – Utför en strängbaserad jämförelse. Testet skriver inte ut resultatet så istället kontrollerar vi att det är utgångsstatus vilket är vad vi ska göra på nästa rad.
  • Linje 2 – variabeln $? håller exit status för det tidigare kör kommandot (i detta fall test). 0 betyder sant (eller framgång). 1 = falskt (eller fel).,
  • linje 4 – den här gången utför vi en numerisk jämförelse.
  • Line 7 – skapa en ny tom fil myfile (förutsatt att myfile inte redan finns).
  • Linje 8 – är storleken på myfile större än noll?
  • Line 11 – omdirigera lite innehåll till myfile så det är storlek är större än noll.
  • Linje 12 – testa storleken på myfile igen. Den här gången är det sant.

indragning

Du kommer att märka att i if-uttalandet ovan indragen vi de kommandon som kördes om uttalandet var sant., Detta kallas indentering och är en viktig del av att skriva bra, ren kod (på något språk, inte bara Bash skript). Syftet är att förbättra läsbarheten och göra det svårare för oss att göra enkla, dumma misstag. Det finns inga regler för indragning i Bash så att du kan indrag eller inte indrag men du vill och dina skript kommer fortfarande att köra exakt samma. Jag rekommenderar starkt att du gör indrag din kod dock (särskilt som dina skript blir större) annars kommer du att finna det allt svårare att se strukturen i dina skript.,

kapslade om uttalanden

talar om indrag. Här är ett perfekt exempel på när det gör livet lättare för dig. Du kan ha så många om uttalanden som behövs i ditt skript. Det är också möjligt att ha ETT if-uttalande inuti ett annat if-uttalande. Vi kanske till exempel vill analysera ett tal som ges på kommandoraden som så:

låt oss bryta ner det:

  • rad 4 – Utför följande, endast om det första kommandoradsargumentet är större än 100.
  • Linje 8 – det här är en ljus variation på if-satsen., Om vi vill kontrollera ett uttryck kan vi använda de dubbla parenteserna precis som vi gjorde för variabler.
  • linje 10 – endast körs om båda uttalandena är sanna.

Yo dawg, jag slår dig om uttalanden så jag lägger ett if-uttalande inuti ditt if-uttalande.

Xzibit

(Xzibit sa faktiskt inte det men jag är säker på att han skulle ha, om han hade varit värd för Pimp My Bash Script.,)

Du kan bo så många om uttalanden som du vill men som en allmän tumregel Om du behöver bo mer än 3 nivåer djupt bör du förmodligen ha en tänka på att omorganisera din logik.

om annars

Ibland vill vi utföra en viss uppsättning åtgärder om ett uttalande är sant och en annan uppsättning åtgärder om det är falskt. Vi kan anpassa detta till den andra mekanismen.,

om

<kommandon>
else
<andra kommandon>
fi

Nu kan vi enkelt läsa från en fil om den levereras som kommandoradsargument, annars läsa från en fil.stdin.

else.sh

  1. #!/bin/bash
  2. # else exempel
  3. Om
  4. sedan
  5. nl $1
  6. else
  7. nl/dev/stdin
  8. fi

om Elif annat

Ibland kan vi ha en rad villkor som kan leda till olika vägar.,

om
sedan
<kommandon>
elif
sedan
<olika kommandon>
annat
<andra kommandon<andra kommandon
fi

till exempel kan det vara så att om du är 18 eller över kan du gå till festen. Om du inte är men du har ett brev från dina föräldrar kan du gå men måste vara tillbaka före midnatt. Annars kan du inte gå.

Du kan ha så många elif-grenar som du vill. Det sista är också frivilligt.,

Booleska operationer

Ibland vill vi bara göra något om flera villkor är uppfyllda. Andra gånger vill vi utföra åtgärden om ett av flera villkor är uppfyllt. Vi kan rymma dessa med booleska operatörer.

  • och – &&
  • eller – |/

till exempel kanske vi bara vill utföra en operation om filen är läsbar och har en storlek som är större än noll.

and.sh

  1. #!,/bin/bash
  2. # och exempel
  3. Om &&
  4. sedan
  5. echo den här filen är användbar.
  6. fi

kanske skulle vi vilja utföra något något annorlunda om användaren är antingen bob eller andy.

or.sh

  1. #!/bin/bash
  2. # eller exempel
  3. Om | /
  4. sedan
  5. ls-alh
  6. else
  7. ls
  8. fi

Fall uttalanden

Ibland kan vi vilja ta olika vägar baserat på en variabel som matchar en serie mönster., Vi skulle kunna använda en rad IF-och elif-uttalanden, men det skulle snart bli ovedersägligt. Lyckligtvis finns det ett fall uttalande som kan göra saker renare., It’s a little hard to explain so here are some examples to illustrate:

case <variable> in
<pattern 1>)
<commands>
;;
<pattern 2>)
<other commands>
;;
esac

Here is a basic example:

case.sh

  1. #!,/bin/bash
  2. # case exempel
  3. case $1 i
  4. start)
  5. echo start
  6. ;;
  7. stopp)
  8. echo stoping
  9. ;;
  10. starta om)
  11. echo starta om
  12. ;;;
  13. *)
  14. Echo vet inte
  15. ;;
  16. ESAC

låt oss bryta ner det:

  • linje 4 – den här raden börjar casemechanismen.
  • linje 5 – om $1 är lika med ”start” utför sedan de efterföljande åtgärderna. den) betyder slutet av mönstret.,
  • linje 7 – vi identifierar slutet på denna uppsättning uttalanden med en dubbel halvkolon ( ;; ). Efter detta är nästa fall att överväga.
  • linje 14 – kom ihåg att testet för varje enskilt fall är ett mönster. * Representerar valfritt antal tecken. Det är essentialy en fångst alla om för om ingen av de andra fallen matchar. Det är inte nödvändigt men används ofta.
  • linje 17 – esac är fallet bakåt och indikerar att vi är i slutet av kundcaseförklaringen. Alla andra uttalanden efter detta kommer att utföras normalt.
  1. . / case.sh start
  2. start
  3. .,/case.sh starta om
  4. starta om
  5. . /case.sh bla
  6. vet inte

låt oss nu titta på ett något mer komplext exempel där mönster används lite mer.

sammanfattning

om du utför en uppsättning kommandon om ett test är sant. annars om testet inte är sant sedan utföra en annan uppsättning kommandon. elif om föregående test returneras falskt sedan prova den här. && utför och operation. / / Utför eller operation. välj en uppsättning kommandon som ska köras beroende på en sträng som matchar ett visst mönster.,
indragning indentering gör din kod mycket lättare att läsa. Det blir allt viktigare eftersom dina Bash-skript blir längre. Planerar nu när dina skript blir lite mer komplexa kommer du förmodligen vill spendera lite tid att tänka på hur du strukturera dem innan dykning i.

aktiviteter

låt oss nu fatta några beslut.

  • skapa ett bash-skript som tar 2 nummer som kommandoradsargument. Det kommer att skriva ut på skärmen den större av de två siffrorna.,
  • skapa ett bash-skript som accepterar en fil som ett kommandoradsargument och analyserar det på vissa sätt. t.ex. du kan kontrollera om filen är körbar eller skrivbar. Du bör skriva ut ett visst meddelande om sant och en annan om falskt.
  • skapa ett bash-skript som kommer att skriva ut ett meddelande baserat på vilken dag i veckan det är (t.ex. ”Happy hump day” för Wedensday, ”TGIF” för fredag etc).

Lämna ett svar

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