23Aug

De beginnershandleiding voor shell-scripting: de basisprincipes

De term "shell-scripting" wordt vaak genoemd in Linux-forums, maar veel gebruikers zijn er niet mee vertrouwd. Als u deze eenvoudige en krachtige programmeermethode leert, kunt u tijd besparen, de opdrachtregel beter leren kennen en saaie taken voor bestandsbeheer uitbannen.

Wat is Shell-scripting?

Linux-gebruiker zijn betekent dat je speelt met de opdrachtregel. Leuk vinden of niet, er zijn slechts enkele dingen die veel gemakkelijker worden gedaan via deze interface dan door te wijzen en te klikken. Hoe meer u gebruikt en leert de opdrachtregel, hoe meer u ziet zijn potentieel. Nou, de opdrachtregel zelf is een programma: de shell. De meeste Linux-distro's gebruiken tegenwoordig Bash en dit is waar je echt opdrachten in invoert.

Nu, sommigen van jullie die Windows gebruikten voordat ze Linux gebruikten, herinneren zich mogelijk batchbestanden. Dit waren kleine tekstbestanden die u kon vullen met uit te voeren opdrachten en Windows zou ze om de beurt uitvoeren. Het was een slimme en nette manier om dingen gedaan te krijgen, zoals het uitvoeren van spellen in je computerlokaal op de middelbare school als je geen systeemmappen kon openen of snelkoppelingen kon maken. Batch-bestanden in Windows, hoewel nuttig, zijn een goedkope imitatie van shell-scripts.

Shell-scripts stellen ons in staat om commando's in ketens te programmeren en het systeem uit te voeren als een scripted evenement, net als batch-bestanden. Ze laten ook veel nuttiger functies toe, zoals opdrachtvervanging. U kunt een opdracht oproepen, zoals datum, en de uitvoer gebruiken als onderdeel van een schema voor bestandsnaamgeving. U kunt back-ups automatiseren en voor elk gekopieerd bestand kan de huidige datum worden toegevoegd aan het einde van de naam. Scripts zijn ook niet alleen aanroepingen van opdrachten. Het zijn programma's op zich. Met scripting kunt u programmeerfuncties gebruiken, zoals 'voor' loops, als /then/ else-instructies, enzovoort, rechtstreeks in de interface van uw besturingssysteem. En u hoeft geen andere taal te leren omdat u gebruikt wat u al weet: de opdrachtregel.

Dat is echt de kracht van scripting, denk ik. Je kunt programmeren met opdrachten die je al kent, terwijl je nietjes leert van de meeste belangrijke programmeertalen. Moet u iets repetitief en vervelend doen? Script het! Een sneltoets nodig voor een echt ingewikkeld commando? Script het! Wil je een heel eenvoudig te gebruiken command-line interface voor iets bouwen? Script het!

Voordat u begint

Voordat we aan onze scripting-serie beginnen, laten we wat basisinformatie bekijken. We zullen de bash-shell gebruiken, die de meeste Linux-distributies native gebruiken. Bash is ook beschikbaar voor Mac OS-gebruikers en Cygwin voor Windows. Omdat het zo universeel is, zou je in staat moeten zijn om te scripten, ongeacht je platform. Bovendien, zolang alle opdrachten waarnaar wordt verwezen bestaan, kunnen scripts op meerdere platforms werken, met weinig of geen aanpassingen.

Scripting kan eenvoudig gebruik maken van de "administrator" of "superuser" -rechten, dus het is het beste om scripts uit te testen voordat je ze aan het werk zet. Gebruik ook uw gezond verstand, zoals ervoor zorgen dat u een back-up hebt van de bestanden waarop u een script wilt uitvoeren. Het is ook erg belangrijk om de juiste opties te gebruiken, zoals -i voor de opdracht rm, zodat uw interactie vereist is. Dit kan enkele vervelende fouten voorkomen. Lees dus de scripts die je downloadt en wees voorzichtig met de gegevens die je hebt, voor het geval er iets misgaat.

In de kern zijn scripts gewoon tekstbestanden. Je kunt elke teksteditor gebruiken om ze te schrijven: gedit, emacs, vim, nano. .. Deze lijst gaat maar door. Zorg ervoor dat u het opslaat als gewone tekst, niet als rijke tekst of als Word-document. Omdat ik hou van het gebruiksgemak dat nano biedt, zal ik dat gebruiken.

Scriptrechten en -namen

-scripts worden uitgevoerd als programma's en om dit te laten gebeuren, moeten ze de juiste rechten hebben. U kunt scripts uitvoerbaar maken door de volgende opdracht erop uit te voeren:

chmod + x ~ /somecrazyfolder/ script1

Hiermee kan iedereen dat specifieke script uitvoeren. Als je het gebruik ervan wilt beperken tot alleen je gebruiker, kun je dit in plaats daarvan gebruiken:

chmod u + x ~ /somecrazyfolder/ script1

Om dit script uit te voeren, zou je naar de juiste map moeten gaan en het script als volgt moeten uitvoeren:

cd ~ / somecrazyfolder

. /script1

Om dingen handiger te maken, kunt u scripts in een "bin" -map in uw thuismap plaatsen:

~ / bin

In veel moderne distro's wordt deze map niet meer standaard gemaakt, maar u kunt deze wel maken. Dit is meestal waar uitvoerbare bestanden worden opgeslagen die bij uw gebruiker horen en niet bij andere gebruikers. Door scripts hier te plaatsen, kun je ze gewoon uitvoeren door hun naam te typen, net als andere opdrachten, in plaats van dat je rond moet draaien en het voorvoegsel './' moet gebruiken.

Voordat je een script een naam geeft, moet je de volgende opdracht gebruiken om te controleren of je een geïnstalleerd programma hebt dat die naam gebruikt:

die [opdracht]

Veel mensen noemen hun vroege scripts "testen" en wanneer ze proberenvoer het uit in de opdrachtregel, er gebeurt niets. Dit komt omdat het conflicteert met de testopdracht, die niets zonder argumenten doet. Zorg er altijd voor dat je scriptnamen niet in strijd zijn met opdrachten, anders kun je dingen doen die je niet van plan bent te doen!

Scripting Guidelines

Zoals ik al zei, is elk scriptbestand in wezen platte tekst. Dat betekent echter niet dat je wel alles kunt schrijven wat je wilt. Wanneer een tekstbestand wordt geprobeerd te worden uitgevoerd, zullen shells ze doorzoeken voor aanwijzingen of ze scripts zijn of niet, en hoe alles op de juiste manier moet worden afgehandeld. Daarom zijn er enkele richtlijnen die u moet kennen.

  1. Elk script hoort bij "#!/bin/ bash "
  2. Elke nieuwe regel is een nieuwe opdracht
  3. Commentaarregels beginnen met een #
  4. -opdrachten worden omgeven door()

De Hash-Bang-hack

Wanneer een shell door een tekstbestand parseert, is dit de meest directe manier om het bestand te identificeren alseen script is door je eerste regel te maken:

#!/bin/ bash

Als u een andere shell gebruikt, vervangt u hier het pad. Commentaarregels beginnen met hashes( #), maar voegen het knal-( !) En het shell-pad toe nadat het een soort hack is die deze commentaregel zal omzeilen en het script zal dwingen om uit te voeren met de shell waarnaar deze regel verwijst.

Nieuwe regel = nieuwe opdracht

Elke nieuwe regel moet worden beschouwd als een nieuwe opdracht of als onderdeel van een groter systeem. Als /then/ else-instructies bijvoorbeeld meerdere regels overnemen, staat elke component van dat systeem op een nieuwe regel. Laat een opdracht niet bloeden in de volgende regel, omdat dit de vorige opdracht kan afkappen en u een foutmelding krijgt op de volgende regel. Als uw teksteditor dat doet, moet u de tekstomslag uitschakelen om aan de veilige kant te blijven. U kunt tekstomloop uitschakelen in nano-bit op ALT + L.

Commentaar Vaak met #s

Als u een regel met een # begint, wordt de regel genegeerd. Dit verandert het in een commentaarregel, waar je jezelf kunt herinneren aan wat de uitvoer van het vorige commando was, of wat het volgende commando zal doen. Schakel opnieuw tekstomloop uit of verbreek je reactie in meerdere regels die allemaal beginnen met een hash. Veel opmerkingen gebruiken is een goede gewoonte om te houden, omdat u en anderen uw scripts gemakkelijker kunnen aanpassen. De enige uitzondering is de eerder genoemde Hash-Bang-hack, dus volg #s met! S niet.;-)

-opdrachten worden omgeven door haakjes

In oudere dagen werden opdrachtvervangingen uitgevoerd met enkele maatstreepjes( `, deelt de ~ -toets).We gaan dit nog niet aanraken, maar aangezien de meeste mensen erop uit gaan om na het leren van de basis te verkennen, is het waarschijnlijk een goed idee om te vermelden dat je in plaats daarvan haakjes moet gebruiken. Dit komt vooral omdat wanneer je nesten - zet commando's in andere commando's - haakjes beter werken.

Uw eerste script

Laten we beginnen met een eenvoudig script waarmee u bestanden kunt kopiëren en datums kunt toevoegen aan het einde van de bestandsnaam. Laten we het "datecp" noemen. Laten we eerst eens kijken of die naam conflicteert met iets:

U kunt zien dat er geen uitvoer is van de opdracht, dus we zijn helemaal klaar om deze naam te gebruiken.

Laten we een leeg bestand maken in de map ~ / bin:

touch ~ /bin/ datecp

En laten we de toestemming nu wijzigen voordat we het vergeten:

Laten we beginnen met het maken van ons script. Open dat bestand in je teksteditor naar keuze. Zoals ik al zei, ik hou van de eenvoud van nano.

nano ~ /bin/ datecp

En laten we beginnen met het plaatsen van de eerste vereiste regel en een opmerking over wat dit script doet.

Laten we vervolgens een variabele declareren. Als je ooit algebra hebt gebruikt, weet je waarschijnlijk wat dat is. Met een variabele kunnen we informatie opslaan en er dingen mee doen. Variabelen kunnen "uitvouwen" wanneer elders wordt verwezen. Dat wil zeggen, in plaats van hun naam te tonen, zullen ze hun opgeslagen inhoud weergeven. Je kunt later diezelfde variabele vertellen om verschillende informatie op te slaan, en elke instructie die daarna plaatsvindt, zal de nieuwe informatie gebruiken. Het is echt een mooie plaatsaanduider.

Wat zullen we in de variabele zetten? Laten we de datum en tijd opslaan! Om dit te doen, zullen we een beroep doen op het datumcommando.

Bekijk de onderstaande schermafbeelding voor het bouwen van de uitvoer van de datumopdracht:

U kunt zien dat door het toevoegen van verschillende variabelen die beginnen met%, u de uitvoer van de opdracht kunt veranderen in wat u wilt. Voor meer informatie, kunt u de handleidingpagina voor de datumopdracht bekijken.

Laten we die laatste iteratie van de datumopdracht "date +% m_% d_% y-% H.% M.% S" gebruiken en die gebruiken in ons script.

Als we dit script nu zouden opslaan, zouden we het kunnen uitvoeren en zou het ons de uitvoer van de datumopdracht geven zoals we zouden verwachten:

Maar laten we iets anders doen. Laten we een variabele naam geven, zoals date_formatted bij deze opdracht. De juiste syntaxis hiervoor is als volgt:

variabele = $( commando -opties argumenten)

En voor ons zouden we het zo bouwen:

date_formatted = $( datum +% m_% d_% y-% H.%M.% S)

Dit noemen we de opdrachtvervanging. In feite vertellen we bash dat wanneer de variabele "date_formatted" verschijnt, de opdracht tussen de haakjes wordt uitgevoerd. Vervolgens moet de uitvoer van de opdrachten worden weergegeven in plaats van de naam van de variabele, "date_formatted".

Hier is een voorbeeldscript en de uitvoer ervan:

Let op: er zijn twee spaties in de uitvoer. De ruimte tussen de aanhalingstekens van de echo-opdracht en de spatie voor de variabele worden beide weergegeven. Gebruik geen spaties als u niet wilt dat ze worden weergegeven. Merk ook op dat zonder deze toegevoegde "echo" -regel het script absoluut geen uitvoer zou geven.

Laten we teruggaan naar ons script. Laten we vervolgens het kopieergedeelte van de opdracht toevoegen.

cp -iv $ 1 $ 2. $ date_formatted

Dit zal de kopieeropdracht oproepen, met de -i en -v opties. De eerste zal u om verificatie vragen voordat u een bestand overschrijft, en de laatste zal weergeven wat er op de opdrachtregel staat.

Vervolgens ziet u dat ik de optie "$ 1" heb toegevoegd. Bij het scripten zal een dollarteken( $) gevolgd door een nummer dat genummerde argument van het script aanduiden wanneer het werd opgeroepen. Bijvoorbeeld in de volgende opdracht:

cp -iv Trogdor2.mp3 ringtone.mp3

Het eerste argument is "Trogdor2.mp3" en het tweede argument is "ringtone.mp3".

Terugkijkend op ons script, kunnen we zien dat we verwijzen naar twee argumenten:

Dit betekent dat wanneer we het script uitvoeren, we twee argumenten moeten geven om het script correct te laten werken. Het eerste argument, $ 1, is het bestand dat wordt gekopieerd en wordt vervangen door het eerste argument van het commando "cp -iv".

Het tweede argument, $ 2, fungeert als het uitvoerbestand voor dezelfde opdracht. Maar je kunt ook zien dat het anders is. We hebben een punt toegevoegd en we hebben van bovenaf verwezen naar de variabele 'date_formatted'.Benieuwd wat dit doet?

Dit is wat er gebeurt als het script wordt uitgevoerd:

U kunt zien dat het uitvoerbestand wordt vermeld als wat ik heb ingevoerd voor $ 2, gevolgd door een punt en vervolgens de uitvoer van het datumcommando! Klinkt logisch, toch?

Als ik nu de opdracht datecp voer, wordt dit script uitgevoerd en kan ik elk bestand naar een nieuwe locatie kopiëren en automatisch de datum en tijd toevoegen aan het einde van de bestandsnaam. Handig voor het archiveren van dingen!

Shell-scripting vormt de kern van het werken voor uw besturingssysteem. Je hoeft geen nieuwe programmeertaal te leren om dit te laten gebeuren. Probeer thuis een aantal basisopdrachten te scripten en denk erover na waar je dit voor kunt gebruiken.

Bent u script? Heb je een advies voor nieuwkomers? Deel uw mening in de comments! Er komt nog meer in deze serie!