Bash-skript är ett mycket effektivt sätt att automatisera uppgifter, särskilt de som utnyttjar andra befintliga program. Denna automatisering kräver ofta att en liknande operation upprepas flera gånger, vilket är precis där för loop kommer till sin rätt.

Linux- och Mac-systemadministratörer är vanligtvis bekanta med skript via terminalen, men även Windows-användare kan gå in i åtgärden med Windows Subsystem för Linux.

Så här får du Linux Bash Shell på Windows 10

Behöver du använda Linux ingen tid för att byta till en annan dator eller köra en virtuell dator? Kör Linux i Windows 10 med en Bash-skalterminal istället!

Hur Bash-skript fungerar

Ett bash-skript är helt enkelt en vanlig textfil som innehåller en serie kommandon som bash-skalet kan läsa och utföra. Bash är standardskalet i pre-Catalina macOS och de flesta Linux-distributioner.

Om du aldrig har arbetat med ett skalskript tidigare, bör du börja med det absolut enklaste fallet. Detta gör att du kan öva på nyckelbegrepp, inklusive skapandet av manuset och dess körning.

instagram viewer

Skapa först följande fil på en bekväm plats (helst öppna en terminal och navigera till önskad katalog först):

#! / bin / bash
eko "Hello, World"

Den första raden berättar vad som kör det här programmet hur man kör det (dvs. använder bash-tolk). Den andra är bara ett kommando som alla andra du kan ange på kommandoraden. Spara filen som hej_världen.sh, sedan:

$ chmod + x hello_world.sh
$ ./hello_world.sh

De chmod kommandot på första raden gör filen körbar, vilket innebär att den kan köras genom att skriva dess namn, som på andra raden.

Om orden "Hello, World" visas tryckta på en rad i din terminal, fungerar allt efter behov.

Hur för loopar fungerar

I allmän programmering finns det två huvudtyper av för loop: numerisk och för varje. Den numeriska typen är traditionellt den vanligaste, men i bash-användning är det vanligtvis tvärtom.

Numeriskt för loopar fokuserar vanligtvis på ett enda heltal som avgör hur många iterationer som ska utföras, till exempel:

för (i = 0; i <100; i ++) {
/ * uttalanden att utföra upprepade gånger * /
}

Detta är en bekant snygg slinga som kommer att iterera exakt 100 gånger, såvida inte jag ändras i slingan, eller om ett annat uttalande får körningen av for-slingan att stoppa.

Foreach-loopar däremot tenderar att fungera på strukturer som listor eller matriser, och itera för varje objekt i den samlingen:

folk = ["Peter", "Paul", "Mary"]
foreach (människor som person) {
if (person == "Paul") {
...
}
}

Vissa språk använder en något annan syntax som byter ordning på insamling och objekt:

folk = ["Peter", "Paul", "Mary"]
för (person i människor) {
if (person == "Paul") {
...
}
}

För i slingor

I bash, förgrunden — eller för in—Loop är vanligare. Den grundläggande syntaxen är helt enkelt:

för arg i [lista]
do
/ * uttalanden att utföra upprepade gånger * /
/ * värdet av arg kan erhållas med $ arg * /
Gjort

Till exempel för att itera genom tre uttryckligen namngivna filer:

för fil i en. c två. c tre. c
do
ls "$ file"
Gjort

Om sådana filer finns i den aktuella katalogen kommer utdata från detta skript att vara:

one.c
two.c
three.c

Istället för en fast uppsättning filer kan listan erhållas via ett globmönster (ett inklusive jokertecken - specialtecken som representerar andra tecken). I följande exempel upprepar for-loop över alla filer (i den aktuella katalogen) vars namn slutar med ".xml":

för fil i * .xml
do
ls -l "$ fil"
Gjort

Här är några exempel på utdata:

$ -rw-r - r-- 1 bobby staff 2436 3 nov 2019 feed.xml
$ -rw-r - r-- 1 bobby personal 6447 27 okt 16:24 sitemap.xml

Det här kan se ut som ett långsiktigt sätt att göra:

$ ls -l * .xml

Men det finns en betydande skillnad: for loop kör ls programmera två separata tider, med ett enda filnamn skickas till det varje gång. I det separata ls-exemplet matchar globmönstret (* .xml) först filnamnen och skickar sedan dem alla, som enskilda kommandoradsparametrar, till en instans av ls.

Här är ett exempel som använder toalett (ordräkning) -program för att göra skillnaden mer uppenbar:

$ wc -l * .xml
44 feed.xml
231 webbplatskarta.xml
275 totalt

De toalett programmet räknar antalet rader i varje fil separat och skriver sedan ut ett totalt antal över dem alla. Däremot om toalett fungerar inom en för loop:

för fil i * .xml
do
wc -l $ -fil
Gjort

Du ser fortfarande antalet för varje fil:

44 feed.xml
231 webbplatskarta.xml

Men det finns ingen total sammanfattning på grund av toalett körs isolerat, varje gång slingan upprepas.

När en lista inte är en lista

Det finns ett mycket enkelt och vanligt misstag när man hanterar för loopar på grund av hur bash hanterar citerade argument / strängar. Att bläddra igenom en lista med filer bör göras så här:

för fil i en. c två. c

Inte så här:

för fil i "one.c two.c"

Det andra exemplet bifogar filnamn i dubbla citat som resulterar i en lista med bara en enda parameter. for-loop kommer bara att köras en gång. Detta problem kan undvikas genom att använda en variabel i sådana fall:

FILES = "one.c two.c"
för fil i $ FILES
do
...
Gjort

Observera att variabeldeklarationen i sig behöver lägga in dess värde i dubbla citat!

För utan en lista

Med inget att iterera igenom fungerar en for loop på de kommandoradsargument som skriptet gav när de anropades. Till exempel om du har ett skript som heter args.sh som innehåller följande:

#! / bin / sh
för en
do
eko $ a
Gjort

Då kommer körning av args.sh att ge dig följande:

$ ./args.sh en två tre
ett
två
tre

Bash känner igen detta fall och behandlar för att göra som motsvarande för en i $ @ do där $ @ är en speciell variabel som representerar kommandoradsargument.

Efterlikna ett traditionellt numeriskt för loop

Bash-skript hanterar ofta listor över filer eller utmatningsrader från andra kommandon, så för typ av slinga är vanligt. Den traditionella c-stiloperationen stöds dock fortfarande:

för ((i = 1; i <= 5; i ++))
do
eko $ i
Gjort

Detta är den klassiska formen med tre delar där:

  1. en variabel initialiseras (i = 1) när slingan först påträffas
  2. slingan fortsätter så länge villkoret (i <= 5) är sant
  3. varje gång runt slingan ökas variabeln (i ++)

Att växla mellan två värden är ett vanligt nog krav att det finns ett kortare, lite mindre förvirrande alternativ:

för jag i {1..5}
do
eko $ i
Gjort

Brace-expansionen som sker effektivt översätter ovanstående för loop till:

för i i 1 2 3 4

Finare loopkontroll med paus och fortsätt

Mer komplex för slingor behöver ofta ett sätt att avsluta tidigt eller omedelbart starta om huvudslingan med nästa värde i tur och ordning. För att göra det lånar bash pausen och fortsätter uttalanden som är vanliga i andra programmeringsspråk. Här är ett exempel som använder båda för att hitta den första filen som är mer än 100 tecken lång:

#! / bin / bash
för fil i *
do
om [! -f "$ file"]
sedan
eko "$ -fil är inte en fil"
Fortsätta
fi
num_chars = $ (wc -c echo $ -filen är "$ num_chars tecken lång"
om [$ num_chars -gt 100]
sedan
echo "Found $ file"
ha sönder
fi
Gjort

For loop här fungerar på alla filer i den aktuella katalogen. Om filen inte är en vanlig fil (t.ex. om det är en katalog) används fortsättningsuttrycket för att starta om slingan med nästa fil i tur och ordning. Om det är en vanlig fil kommer det andra villkorliga blocket att avgöra om den innehåller mer än 100 tecken. Om så är fallet används break-uttalandet för att omedelbart lämna for-loop (och nå slutet av skriptet).

Slutsats

Ett bash-skript är en fil som innehåller en uppsättning instruktioner som kan köras. En for loop gör att en del av ett skript kan upprepas många gånger. Med användning av variabler, externa kommandon och break and continue-uttalanden kan bash-skript tillämpa mer komplex logik och utföra ett brett spektrum av uppgifter.

E-post
Apples integritetsetiketter för appar kanske inte är helt exakta

Rapporten tyder på att Apples integritetsetiketter för appar kan ha vissa problem.

Relaterade ämnen
  • Programmering
  • Linux
Om författaren
Bobby Jack (19 artiklar publicerade)

Bobby är en teknikentusiast som arbetat som mjukvaruutvecklare under mer än två decennier. Han brinner för spel, arbetar som Recensentredaktör på Switch Player Magazine och är nedsänkt i alla aspekter av onlinepublicering och webbutveckling.

Mer från Bobby Jack

Prenumerera på vårt nyhetsbrev

Gå med i vårt nyhetsbrev för tekniska tips, recensioner, gratis e-böcker och exklusiva erbjudanden!

Ett steg till…!

Bekräfta din e-postadress i e-postmeddelandet som vi just skickade till dig.

.