Bash -skript är ett mycket effektivt sätt att automatisera uppgifter, särskilt de som drar nytta av andra befintliga program. Denna automatisering kräver ofta att en liknande operation upprepas flera gånger, vilket är precis där för slinga 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 på åtgärden med Windows delsystem för Linux .
Hur Bash Scripts fungerar
Ett bash -skript är helt enkelt en vanlig textfil som innehåller en serie kommandon som bash -skalet kan läsa och köra. Bash är standardskal 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 låter dig öva på nyckelbegrepp, inklusive skapandet av manuset och dess körning.
Skapa först följande fil på en lämplig plats (helst, öppna en terminal och navigera först till önskad katalog):
#!/bin/bash
echo 'Hello, World'
Den första raden berättar vad som helst som kör det här programmet hur man kör det (dvs med bash -tolk). Det andra är bara ett kommando som alla andra du kan ange på kommandoraden. Spara filen som hej_värld.sh , då:
$ chmod +x hello_world.sh
$ ./hello_world.sh
De chmod kommandot på den första raden gör filen körbar, vilket innebär att den kan köras genom att skriva dess namn, som på den andra raden.
Om du ser orden Hej, världen visas tryckt på en rad i din terminal, så fungerar allt efter behov.
Hur för slingor 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 slingor fokuserar vanligtvis på ett enda heltal som avgör hur många iterationer som kommer att utföras, till exempel:
for (i = 0; i <100; i++) {
/* statements to execute repeatedly */
}
Detta är en välbekant sökslinga som kommer att upprepa exakt 100 gånger, såvida inte i ändras i slingan, eller om ett annat uttalande får exekveringen av for-slingan att stanna.
Foreach -slingor tenderar däremot att fungera på strukturer som listor eller matriser och iterera för varje objekt i den samlingen:
people = [ 'Peter', 'Paul', 'Mary' ]
foreach (people as person) {
if (person == 'Paul') {
...
}
}
Vissa språk använder en något annorlunda syntax som byter ordning på samling och objekt:
people = [ 'Peter', 'Paul', 'Mary' ]
for (person in people) {
if (person == 'Paul') {
...
}
}
För i loopar
I bash, förkroppen - eller för in - loop är vanligare. Den grundläggande syntaxen är helt enkelt:
for arg in [list]
do
/* statements to execute repeatedly */
/* the value of arg can be obtained using $arg */
done
Till exempel att iterera genom tre uttryckligen namngivna filer:
lösenordet uppträdde i en dataläckage
for file in one.c two.c three.c
do
ls '$file'
done
Om sådana filer finns i den aktuella katalogen kommer utmatningen 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 upprepas for -loop över alla filer (i den aktuella katalogen) vars namn slutar på '.xml':
for file in *.xml
do
ls -l '$file'
done
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 staff 6447 27 Oct 16:24 sitemap.xml
Det här kan se ut som ett långdraget sätt att göra:
$ ls -l *.xml
Men det finns en signifikant skillnad: for loop -körningen utför ls program 2 separata gånger, med ett enda filnamn som skickas till det varje gång. I det separata ls-exemplet matchar globmönstret (*.xml) filnamn först och skickar sedan alla, som individuella kommandoradsparametrar, till en instans av ls .
Här är ett exempel som använder toalett (ordantal) program för att göra skillnaden mer uppenbar:
$ wc -l *.xml
44 feed.xml
231 sitemap.xml
275 total
De toalett programmet räknar antalet rader i varje fil separat och skriver sedan ut ett totalt antal över alla. Däremot, om toalett fungerar inom en for loop:
for file in *.xml
do
wc -l $file
done
Du kommer fortfarande att se antalet för varje fil:
44 feed.xml
231 sitemap.xml
Men det finns ingen övergripande sammanfattning totalt eftersom 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 det gäller slingor, 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:
for file in one.c two.c
Inte så här:
for file in 'one.c two.c'
Det andra exemplet omsluter filnamn i dubbla citattecken som resulterar i en lista med bara en enda parameter; for -slingan körs bara en gång. Detta problem kan undvikas genom att använda en variabel i sådana fall:
FILES='one.c two.c'
for file in $FILES
do
...
done
Observera att variabeldeklarationen i sig behöver inkludera dess värde i dubbla citattecken!
hur man ansluter telefon till tv med usb
För Utan lista
Med inget att iterera igenom fungerar en for loop på alla kommandoradsargument som skriptet gav när det anropades. Till exempel om du har ett skript med namnet args.sh som innehåller följande:
#!/bin/sh
for a
do
echo $a
done
Då kommer körningen avs.s.s. att ge dig följande:
$ ./args.sh one two three
one
two
three
Bash känner igen det här fallet och behandlar för ett gör som motsvarande för en i $@ do där $@ är en speciell variabel som representerar kommandoradsargument.
Emulera en traditionell numerisk för loop
Bash -skript behandlar ofta listor över filer eller utdatarader från andra kommandon, så slingan för i -typ är vanlig. Den traditionella operationen i c-stil stöds dock fortfarande:
for (( i=1; i<=5; i++ ))
do
echo $i
done
Detta är den klassiska formen med tre delar där:
- en variabel initialiseras (i = 1) när slingan först träffas
- slingan fortsätter så länge villkoret (i<=5) is true
- varje gång runt slingan ökas variabeln (i ++)
Att växla mellan två värden är tillräckligt vanligt att det finns ett kortare, lite mindre förvirrande alternativ:
for i in {1..5}
do
echo $i
done
Brace -expansionen som äger rum översätter effektivt ovanstående för loop till:
for i in 1 2 3 4
Finare slingkontroll 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
for file in *
do
if [ ! -f '$file' ]
then
echo '$file is not a file'
continue
fi
num_chars=$(wc -c <'$file')
echo $file is '$num_chars characters long'
if [ $num_chars -gt 100 ]
then
echo 'Found $file'
break
fi
done
For -slingan 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ättningssatsen för att starta om slingan med nästa fil i tur och ordning. Om det är en vanlig fil avgör det andra villkorade blocket om det innehåller mer än 100 tecken. Om så är fallet används break -satsen för att omedelbart lämna for -slingan (och nå slutet av manuset).
Slutsats
Ett bash -skript är en fil som innehåller en uppsättning instruktioner som kan köras. En för loop gör att en del av ett manus kan upprepas många gånger. Med användning av variabler, externa kommandon och break and continue -påståenden kan bash -skript tillämpa mer komplex logik och utföra ett brett spektrum av uppgifter.
Dela med sig Dela med sig Tweet E-post Är det värt att uppgradera till Windows 11?Windows har gjorts om. Men är det tillräckligt för att övertyga dig om att byta från Windows 10 till Windows 11?
Läs Nästa Relaterade ämnen- Programmering
- Linux
Bobby är en teknikentusiast som arbetade som mjukvaruutvecklare i de flesta av två decennier. Han brinner för spel, jobbar som recensioner -redaktör på Switch Player Magazine och är fördjupad i alla aspekter av online -publicering och webbutveckling.
Mer från Bobby JackPrenumerera på vårt nyhetsbrev
Gå med i vårt nyhetsbrev för tekniska tips, recensioner, gratis e -böcker och exklusiva erbjudanden!
Klicka här för att prenumerera