Bash-scripts zijn een zeer efficiënte manier om taken te automatiseren, met name degene die profiteren van andere bestaande programma's. Deze automatisering vereist vaak het meerdere keren herhalen van een soortgelijke bewerking, en dat is precies waar de for loop komt tot zijn recht.
Linux- en Mac-systeembeheerders zijn doorgaans bekend met scripts via de terminal, maar zelfs Windows-gebruikers kunnen dat kom in actie met het Windows-subsysteem voor Linux.
Heb je Linux nodig om over te schakelen naar een andere pc of om een VM te draaien? Voer Linux in Windows 10 uit met een Bash-shell-terminal!
Hoe Bash-scripts werken
Een bash-script is gewoon een gewoon tekstbestand dat een reeks opdrachten bevat die de bash-shell kan lezen en uitvoeren. Bash is de standaardshell in macOS vóór Catalina en de meeste Linux-distributies.
Als u nog nooit met een shellscript heeft gewerkt, moet u beginnen met het absoluut eenvoudigste geval. Hiermee kunt u de belangrijkste concepten oefenen, waaronder het maken van het script en de uitvoering ervan.
Maak eerst het volgende bestand op een handige locatie (idealiter opent u een terminal en navigeert u eerst naar de gewenste map):
#! / bin / bash
echo "Hallo wereld"
De eerste regel vertelt degene die dit programma uitvoert, hoe het moet worden uitgevoerd (d.w.z. met behulp van de bash-interpreter). De tweede is gewoon een commando zoals elk ander dat je zou kunnen invoeren op de commandoregel. Sla dat bestand op als hello_world.sh, vervolgens:
$ chmod + x hello_world.sh
$ ./hello_world.sh
De chmod commando op de eerste regel maakt het bestand uitvoerbaar, wat betekent dat het kan worden uitgevoerd door de naam te typen, zoals op de tweede regel.
Als u de woorden 'Hallo, wereld' ziet verschijnen op een regel in uw terminal, werkt alles zoals vereist.
Hoe For Loops werkt
Bij algemene programmering zijn er twee hoofdtypen for-lus: numeriek en voor elk. Het numerieke type is traditioneel het meest gebruikelijk, maar bij bash-gebruik is het meestal andersom.
Numerieke for-lussen richten zich meestal op een enkel geheel getal dat bepaalt hoeveel iteraties zullen worden uitgevoerd, bijvoorbeeld:
voor (i = 0; i <100; i ++) {
/ * verklaringen die herhaaldelijk moeten worden uitgevoerd * /
}
Dit is een vertrouwd uitziende for-lus die exact 100 keer wordt herhaald, tenzij i binnen de lus wordt gewijzigd of een andere instructie ervoor zorgt dat de uitvoering van de for-lus stopt.
Foreach-loops werken daarentegen meestal op structuren zoals lijsten of arrays en herhalen voor elk item in die verzameling:
people = ["Peter", "Paul", "Mary"]
foreach (mensen als persoon) {
if (person == "Paul") {
...
}
}
Sommige talen gebruiken een iets andere syntaxis die de volgorde van verzameling en item verwisselt:
people = ["Peter", "Paul", "Mary"]
voor (persoon in mensen) {
if (person == "Paul") {
...
}
}
Voor in Loops
In bash, de foreach - of voor in- lus komt vaker voor. De basissyntaxis is simpelweg:
voor arg in [lijst]
Doen
/ * verklaringen die herhaaldelijk moeten worden uitgevoerd * /
/ * de waarde van arg kan worden verkregen met $ arg * /
gedaan
Om bijvoorbeeld drie expliciet genoemde bestanden te doorlopen:
voor bestand in one.c two.c three.c
Doen
ls "$ file"
gedaan
Als dergelijke bestanden in de huidige directory bestaan, is de uitvoer van dit script:
een.c
twee.c
drie.c
In plaats van een vaste set bestanden, kan de lijst worden verkregen via een glob-patroon (een inclusief jokertekens - speciale tekens die andere tekens vertegenwoordigen). In het volgende voorbeeld herhaalt de for-lus zich door alle bestanden (in de huidige directory) waarvan de namen eindigen op ".xml":
voor bestand in * .xml
Doen
ls -l "$ bestand"
gedaan
Hier is een voorbeeld van uitvoer:
$ -rw-r - r-- 1 bobby staff 2436 3 november 2019 feed.xml
$ -rw-r - r-- 1 bobby staff 6447 27 okt 16:24 sitemap.xml
Dit lijkt misschien heel erg op een langdradige manier om te doen:
$ ls -l * .xml
Maar er is een significant verschil: de for-lus voert de ls programmeer 2 verschillende keren, met elke keer een enkele bestandsnaam. In het afzonderlijke voorbeeld van ls komt het glob-patroon (* .xml) eerst overeen met bestandsnamen en verzendt ze ze allemaal, als individuele opdrachtregelparameters, naar één exemplaar van ls.
Hier is een voorbeeld dat de wc (aantal woorden) programma om het verschil duidelijker te maken:
$ wc -l * .xml
44 feed.xml
231 sitemap.xml
275 totaal
De wc programma telt het aantal regels in elk bestand afzonderlijk en drukt vervolgens een totaal aantal af over alle regels. Als wc werkt binnen een for-lus:
voor bestand in * .xml
Doen
wc -l $ bestand
gedaan
U ziet nog steeds het aantal voor elk bestand:
44 feed.xml
231 sitemap.xml
Maar er is geen totaaloverzicht omdat wc wordt afzonderlijk uitgevoerd, elke keer dat de lus wordt herhaald.
Als een lijst geen lijst is
Er is een heel gemakkelijke en veel voorkomende fout bij het omgaan met for-loops, vanwege de manier waarop bash omgaat met geciteerde argumenten / strings. Het doorlopen van een lijst met bestanden zou als volgt moeten gebeuren:
voor bestand in one.c two.c
Niet zoals dit:
voor bestand in "one.c two.c"
In het tweede voorbeeld staan bestandsnamen tussen dubbele aanhalingstekens, wat resulteert in een lijst met slechts één parameter; de for-lus wordt slechts één keer uitgevoerd. Dit probleem kan worden vermeden door in dergelijke gevallen een variabele te gebruiken:
FILES = "one.c two.c"
voor bestand in $ FILES
Doen
...
gedaan
Merk op dat de variabeledeclaratie zelf de waarde ervan tussen dubbele aanhalingstekens moet omsluiten!
Voor zonder lijst
Met niets om doorheen te herhalen, werkt een for-lus op alle opdrachtregelargumenten die aan het script zijn verstrekt toen deze werd aangeroepen. Als u bijvoorbeeld een script heeft met de naam args.sh met het volgende:
#! / bin / sh
voor een
Doen
echo $ a
gedaan
Als u vervolgens args.sh uitvoert, krijgt u het volgende:
$ ./args.sh een twee drie
een
twee
drie
Bash herkent deze zaak en behandelt voor een do als het equivalent van voor een in $ @ do waarbij $ @ een speciale variabele is die opdrachtregelargumenten voorstelt.
Een traditionele numerieke For-lus emuleren
Bash-scripts hebben vaak te maken met lijsten met bestanden of regels met uitvoer van andere opdrachten, dus het type for in-lus is gebruikelijk. De traditionele bewerking in c-stijl wordt echter nog steeds ondersteund:
voor ((i = 1; i <= 5; i ++))
Doen
echo $ i
gedaan
Dit is de klassieke vorm met drie delen waarin:
- een variabele wordt geïnitialiseerd (i = 1) wanneer de lus voor het eerst wordt aangetroffen
- de lus gaat door zolang de voorwaarde (i <= 5) waar is
- elke keer rond de lus wordt de variabele verhoogd (i ++)
Het herhalen tussen twee waarden is een voldoende algemene vereiste dat er een korter, iets minder verwarrend alternatief is:
voor ik in {1..5}
Doen
echo $ i
gedaan
De brace-expansie die plaatsvindt, vertaalt de bovenstaande for-lus effectief in:
voor i in 1 2 3 4
Fijnere luscontrole met pauze en doorgaan
Complexere for-loops hebben vaak een manier nodig om de hoofdlus vroegtijdig te verlaten of de hoofdlus onmiddellijk opnieuw te starten met de volgende waarde. Om dit te doen, leent bash de break and continue statements die gebruikelijk zijn in andere programmeertalen. Hier is een voorbeeld waarin beide worden gebruikt om het eerste bestand te vinden dat meer dan 100 tekens lang is:
#! / bin / bash
voor bestand in *
Doen
als [! -f "$ file"]
vervolgens
echo "$ bestand is geen bestand"
doorgaan met
fi
num_chars = $ (wc -c echo $ bestand is "$ num_chars karakters lang"
if [$ num_chars -gt 100]
vervolgens
echo "Gevonden $ bestand"
breken
fi
gedaan
De for-lus werkt hier op alle bestanden in de huidige directory. Als het bestand geen gewoon bestand is (bijvoorbeeld als het een directory is), wordt de instructie continue gebruikt om de lus opnieuw te starten met het volgende bestand. Als het een gewoon bestand is, bepaalt het tweede voorwaardelijke blok of het meer dan 100 tekens bevat. Als dit het geval is, wordt de break-instructie gebruikt om de for-lus onmiddellijk te verlaten (en het einde van het script te bereiken).
Gevolgtrekking
Een bash-script is een bestand met een reeks instructies die kunnen worden uitgevoerd. Met een for-lus kan een deel van een script meerdere keren worden herhaald. Met het gebruik van variabelen, externe commando's en de break and continue statements kunnen bash-scripts complexere logica toepassen en een breed scala aan taken uitvoeren.
Rapport suggereert dat de app-privacylabels van Apple enkele problemen kunnen hebben.
- Programmeren
- Linux
Bobby is een technologieliefhebber die het grootste deel van twee decennia als softwareontwikkelaar heeft gewerkt. Hij is gepassioneerd door gamen, werkt als recensie-editor bij Switch Player Magazine en is ondergedompeld in alle aspecten van online publiceren en webontwikkeling.
Abonneer op onze nieuwsbrief
Word lid van onze nieuwsbrief voor technische tips, recensies, gratis e-boeken en exclusieve deals!
Nog een stap…!
Bevestig uw e-mailadres in de e-mail die we u zojuist hebben gestuurd.