De beginnershandleiding voor Shell-scripting De basisprincipes
De term 'shell scripting' wordt vaak genoemd in Linux-forums, maar veel gebruikers zijn er niet bekend mee. Door deze eenvoudige en krachtige programmeermethode te leren, 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.
Sommigen van jullie die Windows gebruikten voordat ze Linux gebruikten, kunnen mogelijk batchbestanden onthouden. Dit waren kleine tekstbestanden die je kon vullen met uit te voeren commando's en Windows zou ze beurtelings uitvoeren. Het was een slimme en handige 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 handig, 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 een aanroep van opdrachten. Het zijn programma's op zich. Met scripting kunt u programmeerfuncties gebruiken - zoals 'for' loops, if / then / else-opdrachten, enzovoort - rechtstreeks in de interface van uw besturingssysteem. En je hoeft geen andere taal te leren omdat je gebruikt wat je 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 je 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 scripts te gebruiken, ongeacht je platform. Bovendien, zolang alle opdrachten waarnaar wordt verwezen bestaan, kunnen scripts op meerdere platforms werken met weinig tot geen aanpassingen vereist.
Scripting kan eenvoudig gebruik maken van de "administrator" of "superuser" -rechten, dus het is het beste om scripts uit te testen voordat u ze aan het werk zet. Gebruik ook uw gezond verstand, zoals ervoor zorgen dat u back-ups 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 scripts die u downloadt en wees voorzichtig met uw gegevens, 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 als programma's uitgevoerd en om dit te laten gebeuren, moeten ze de juiste rechten hebben. U kunt scripts uitvoerbaar maken door de volgende opdracht uit te voeren:
chmod + x ~ / somecrazyfolder / script1
Hierdoor kan iedereen dat specifieke script uitvoeren. Als u het gebruik ervan wilt beperken tot alleen uw gebruiker, kunt u 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 uitvoeren:
cd ~ / somecrazyfolder
./ script1
Om dingen handiger te maken, kunt u scripts in een "bin" -map in uw homedirectory plaatsen:
~ / Bin
In veel moderne distro's wordt deze map niet meer standaard gemaakt, maar je kunt hem wel maken. Dit is meestal waar uitvoerbare bestanden worden opgeslagen die behoren tot uw gebruiker en niet tot andere gebruikers. Door scripts hier te plaatsen, kun je ze gewoon uitvoeren door hun naam te typen, net als andere commando's, in plaats van rond te moeten rennen en het voorvoegsel './' te gebruiken.
Voordat u een script een naam geeft, moet u de volgende opdracht uitvoeren om te controleren of u een programma hebt geïnstalleerd dat die naam gebruikt:
welke [opdracht]
Veel mensen noemen hun vroege scripts 'testen' en wanneer ze proberen het in de opdrachtregel uit te voeren, gebeurt er 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 eerder 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 ze alles goed moeten afhandelen. Daarom zijn er enkele richtlijnen die u moet kennen.
- Elk script zou moeten zijn met "#! / Bin / bash"
- Elke nieuwe regel is een nieuw commando
- Commentaarregels beginnen met een #
- Commando's worden omringd door ()
De Hash-Bang-hack
Wanneer een shell door een tekstbestand parseert, is de meest directe manier om het bestand als een script te identificeren, door uw 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 in de volgende regel bloeden, 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.
Reactie 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. Het is een goede gewoonte om veel reacties te gebruiken, omdat jij en andere mensen je scripts gemakkelijker kunnen aanpassen. De enige uitzondering is de eerder genoemde Hash-Bang-hack, dus volg #s met! S niet. ;-)
Opdrachten worden omringd door haakjes
In oudere dagen werden de opdrachtvervangingen uitgevoerd met enkele maatstreepjes (', deelt de ~ -toets). We zullen 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.
Je eerste script
Laten we beginnen met een eenvoudig script waarmee je 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 ergens tegenstrijdig is:
U kunt zien dat er geen uitvoer van de opdracht is, dus we zijn er helemaal klaar voor om deze naam te gebruiken.
Laten we een leeg bestand maken in de map ~ / bin:
raak ~ / bin / datecp aan
En laten we de toestemming nu wijzigen voordat we vergeten:
Laten we beginnen met het bouwen 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 doorgaan en de vereiste eerste regel invoegen en een opmerking plaatsen over wat dit script doet.
Laten we vervolgens een variabele declareren. Als je ooit algebra hebt gedaan, weet je waarschijnlijk wat dat is. Een variabele stelt ons in staat informatie op te slaan en er dingen mee te doen. Variabelen kunnen "uitvouwen" wanneer elders wordt verwezen. Dat wil zeggen, in plaats van hun naam te tonen, zullen ze hun opgeslagen inhoud weergeven. U 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 placeholder.
Wat zullen we variabel invullen? 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 dat zien door verschillende variabelen toe te voegen die beginnen met%, u kunt de uitvoer van de opdracht wijzigen in wat u wilt. Voor meer informatie, kunt u de handleidingpagina voor de datumopdracht bekijken.
Laten we die laatste iteratie van het datumcommando gebruiken, "date +% m_% d_% y-% H.% M.% S", en gebruik dat in ons script.
Als we dit script nu zouden opslaan, zouden we het kunnen uitvoeren en zou het 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 -optie-argumenten)
En voor ons zouden we het zo bouwen:
date_formatted = $ (datum +% m_% d_% y-% H.% M.% S)
Dit is wat we opdrachtvervanging noemen. We vertellen in feite bash dat wanneer de variabele "date_formatted" verschijnt, om de opdracht tussen haakjes uit te voeren. 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:
Merk op dat er twee spaties in de uitvoer zijn. 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 kunt u zien dat ik de optie "$ 1" heb toegevoegd. Bij scripting 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 opgeven om het script correct uit te voeren. Het eerste argument, $ 1, is het bestand dat wordt gekopieerd en wordt vervangen door het eerste argument van het "cp -iv" -commando.
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! Klopt, juist?
Wanneer 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 feit dat uw besturingssysteem voor u werkt. Je hoeft geen nieuwe programmeertaal te leren om dit ook te laten gebeuren. Probeer thuis een aantal basisopdrachten te scripten en denk erover na waar je dit voor kunt gebruiken.
Ben je script? Heb je een advies voor nieuwkomers? Deel uw mening in de comments! Er komt nog meer in deze serie!