Nybörjarens guide till Shell Scripting Grunderna
Termen "skalskriptning" nämns ofta i Linux-forum, men många användare är inte bekanta med det. Att lära sig denna enkla och kraftfulla programmeringsmetod kan hjälpa dig att spara tid, lära kommandoraden bättre och förhindra tråkiga filhanteringsuppgifter.
Vad är Shell Scripting?
Att vara en Linux-användare innebär att du leker med kommandoraden. Gilla det eller inte, det finns bara några saker som görs mycket lättare via detta gränssnitt än genom att peka och klicka. Ju mer du använder och lär kommandoraden, desto mer ser du dess potential. Tja, kommandoraden själv är ett program: skalet. De flesta Linux distros använder idag Bash, och det här är vad du verkligen kommit in i kommandon till.
Nu kan några av er som använde Windows innan de använder Linux, komma ihåg batchfiler. Dessa var små textfiler som du kan fylla med kommandon som ska utföras och Windows skulle köra dem i sin tur. Det var ett smart och snyggt sätt att få saker att göra, som att köra spel i ditt högskolelaboratorium när du inte kunde öppna systemmappar eller skapa genvägar. Batchfiler i Windows, medan det är användbart, är en billig imitation av skalskript.
Shell-skript tillåter oss att programmera kommandon i kedjor och få systemet att utföra dem som en skriptevenemang, precis som batchfiler. De möjliggör också mycket mer användbara funktioner, såsom kommandosubstitution. Du kan anropa ett kommando, som datum, och använda det som utgångspunkt som en del av ett filnamnschema. Du kan automatisera säkerhetskopior och varje kopierad fil kan ha det aktuella datumet bifogat till slutet av dess namn. Skript är inte bara invokationer av kommandon, heller. De är program i sig själv. Scripting tillåter dig att använda programmeringsfunktioner - som "för" loopar, om / då / annat uttalanden osv. - direkt i operativsystemets gränssnitt. Och du behöver inte lära dig ett annat språk eftersom du använder det du redan vet: kommandoraden.
Det är verkligen skriptets kraft, tror jag. Du får programmera med kommandon som du redan vet, medan du lär dig häftklammer i de flesta större programmeringsspråk. Behöver du göra något repetitivt och tråkigt? Skriv det! Behöver du en genväg för ett riktigt ingripet kommando? Skriv det! Vill du bygga ett lättanvänt kommandoradsgränssnitt för något? Skript det!
Innan du börjar
Innan vi börjar vår skriptserie, låt oss täcka några grundläggande uppgifter. Vi använder bash-skalet, som de flesta Linux-distributioner använder nativt. Bash är tillgängligt för Mac OS-användare och Cygwin på Windows. Eftersom det är så universellt, borde du kunna skript oavsett din plattform. Dessutom, så länge som alla kommandon som refereras finns, kan skript fungera på flera plattformar med liten eller ingen tweaking krävs.
Scripting kan enkelt använda "administratör" eller "superuser" -behörighet, så det är bäst att testa skript innan du sätter dem på jobbet. Använd också sunt förnuft, som att se till att du har säkerhetskopior av filerna du ska köra ett skript på. Det är också väldigt viktigt att använda rätt alternativ, som -i för kommandot rm, så att din interaktion krävs. Detta kan förhindra några otäcka misstag. Läs så igenom skript som du laddar ner och var försiktig med data du har, bara om saker går fel.
Kärnorna är i själva verket bara vanliga textfiler. Du kan använda någon textredigerare för att skriva dem: gedit, emacs, vim, nano ... Listan fortsätter. Var noga med att spara den som vanlig text, inte som en rik text eller ett Word-dokument. Eftersom jag älskar användarvänligheten som nano ger, använder jag det.
Skriptbehörigheter och namn
Skript utförs som program, och för att detta ska kunna ske måste de ha rätt behörighet. Du kan göra skript körbara genom att köra följande kommando på det:
chmod + x ~ / somecrazyfolder / script1
Detta gör det möjligt för någon att köra det aktuella skriptet. Om du vill begränsa användningen till bara din användare kan du använda det istället:
chmod u + x ~ / somecrazyfolder / script1
För att kunna köra det här skriptet måste du cd i rätt katalog och sedan köra skriptet så här:
cd ~ / somecrazyfolder
./ script1
För att göra saker bekvämare kan du placera skript i en "bin" -mapp i din hemkatalog:
~ / Bin
I många moderna distros skapas den här mappen inte längre som standard, men du kan skapa den. Detta är vanligtvis där exekverbara filer lagras som tillhör din användare och inte till andra användare. Genom att placera skript här kan du bara köra dem genom att skriva in deras namn, precis som andra kommandon, istället för att behöva cd runt och använda prefixet "./".
Innan du namnger ett skript bör du dock följande kommando kontrollera om du har ett program installerat som använder det namnet:
vilken [kommando]
Många människor heter deras tidiga skript "test", och när de försöker köra det i kommandoraden, inträffar ingenting. Detta beror på att det strider mot testkommandot, vilket gör ingenting utan argument. Var alltid säker på att dina skriptnamn inte stämmer överens med kommandon, annars kan du hitta dig själv saker som du inte har för avsikt att göra!
Scripting Guidelines
Som jag nämnde tidigare är varje skriptfil huvudsakligen vanlig text. Det betyder inte att du kan skriva vad du vill ha, alla kommer att vara. När en textfil försöker utföras, kommer skalen att analysera dem för ledtrådar om huruvida de är skript eller inte och hur man hanterar allt ordentligt. På grund av detta finns det några riktlinjer du behöver veta.
- Varje skript borde vara med "#! / Bin / bash"
- Varje ny rad är ett nytt kommando
- Kommentarlinjer börjar med en #
- Kommandon är omgivna av ()
Hash-Bang Hack
När ett skal analyseras via en textfil är det mest direkta sättet att identifiera filen som ett skript genom att göra din första rad:
#! / Bin / bash
Om du använder ett annat skal, ersätt dess väg här. Kommentarlinjer börjar med hashes (#), men lägger till bang (!) Och skalbanan efter att det är ett slags hack som kringgår denna kommentoregel och kommer att tvinga manuset att utföras med skalet som denna linje pekar på.
Ny linje = nytt kommando
Varje ny rad bör betraktas som ett nytt kommando, eller en komponent i ett större system. Om / då / andra uttalanden, till exempel, tar över flera linjer, men varje komponent i det systemet ligger i en ny rad. Låt inte kommandot blöda i nästa rad, eftersom det här kan trunka föregående kommando och ge dig ett fel på nästa rad. Om din textredigerare gör det ska du stänga av textförpackning för att vara på den säkra sidan. Du kan stänga av textförpackning i nano-bitar som slår ALT + L.
Kommentera ofta med #s
Om du börjar en rad med en # ignoreras linjen. Detta gör det till en kommentarlinje, där du kan påminna dig om vad produktionen av det föregående kommandot var eller vad nästa kommando kommer att göra. Återigen stäng av textförpackning, eller bryt dig om att kommentera flera rader som alla börjar med en hash. Att använda massor av kommentarer är en bra övning att behålla, eftersom det låter dig och andra personer enkelt anpassa dina skript. Det enda undantaget är det ovan nämnda Hash-Bang-hacket, så följ inte #s med! S. ;-)
Kommandon omges av parenteser
På äldre dagar gjordes kommandosubstitutioner med enskilda fältmärken (', delar ~ -knappen). Vi kommer inte att ta på det här ännu, men eftersom de flesta går och utforskar efter att ha läst grunderna är det nog en bra idé att nämna att du ska använda parentes istället. Detta beror främst på att när du boar - sätt kommandon inuti andra kommandon - fungerar parentes bättre.
Ditt första skript
Låt oss börja med ett enkelt skript som låter dig kopiera filer och lägga till datum till slutet av filnamnet. Låt oss kalla det "datecp". Låt oss först kontrollera om det namnet står i konflikt med någonting:
Du kan se att det inte finns någon utmatning av vilket kommando, så vi är alla inställda att använda det här namnet.
Låt oss skapa en tom fil i ~ / bin-mappen:
tryck på ~ / bin / datecp
Och låt oss ändra tillståndet nu innan vi glömmer:
Låt oss börja bygga vårt skript då. Öppna den filen i valfri textredigerare. Som jag sa, gillar jag enkelheten i nano.
nano ~ / bin / datecp
Och låt oss gå vidare och sätta in förutsättningen första raden och en kommentar om vad det här skriptet gör.
Låt oss nu förklara en variabel. Om du någonsin har tagit algebra vet du förmodligen vad det är. En variabel låter oss lagra information och göra saker med den. Variabler kan "expandera" när de refereras någon annanstans. Det är istället för att visa sitt namn, de kommer att visa sina lagrade innehåll. Du kan senare berätta samma variabel för att lagra olika uppgifter, och eventuella instruktioner som inträffar efter det kommer att använda den nya informationen. Det är en riktigt bra platshållare.
Vad ska vi lägga ut variabel? Tja, lagra datum och tid! För att göra detta ska vi anropa datumkommandot.
Ta en titt på skärmdumpen nedan för hur du bygger utdata från datumkommandot:
Du kan se att genom att lägga till olika variabler som börjar med%, kan du ändra kommandot till det du vill ha. För mer information kan du titta på den manuella sidan för datumkommandot.
Låt oss använda den senaste iterationen av datumkommandot, "datum +% m_% d_% y-% H.% M.% S" och använd det i vårt skript.
Om vi skulle spara det här skriptet just nu kunde vi köra det och det skulle ge oss resultatet av datumkommandot som vi skulle förvänta oss:
Men låt oss göra något annat. Låt oss ge ett variabelt namn, som date_formatted till det här kommandot. Den korrekta syntaxen för detta är följande:
variabel = $ (kommandooptioner argument)
Och för oss skulle vi bygga det så här:
date_formatted = $ (datum +% m_% d_% y-% H.% M.% S)
Det här är vad vi kallar kommandosubstitution. Vi berättar väsentligen att när variabeln "date_formatted" dyker upp, kör kommandot i parenteserna. Då ska vad som helst som kommandon ger, visas i stället för variabelns namn, "date_formatted".
Här är ett exempel skript och dess produktion:
Observera att det finns två mellanslag i utmatningen. Utrymmet inom citaten för ekokommandot och utrymmet framför variabeln visas båda. Använd inte mellanslag om du inte vill att dom ska dyka upp. Observera också att utan denna extra "echo" -linje skulle skriptet ge absolut ingen utmatning.
Låt oss komma tillbaka till vårt manus. Låt oss nu lägga till den kopierande delen av kommandot.
cp -iv $ 1 $ 2. $ date_formatted
Detta kommer att påkalla kopieringskommandot, med alternativen -i och -v. Den förra kommer att be dig om verifiering innan du skriver över en fil, och den senare kommer att visa vad som ligger på kommandoraden.
Därefter kan du se att jag har lagt till alternativet "$ 1". När man skriver, kommer ett dollartecken ($) följt av ett tal att beteckna det numrerade argumentet för manuset när det påkallades. Till exempel i följande kommando:
cp -iv Trogdor2.mp3 ringtone.mp3
Det första argumentet är "Trogdor2.mp3" och det andra argumentet är "ringtone.mp3".
När vi tittar tillbaka på vårt manus ser vi att vi hänvisar till två argument:
Det betyder att när vi kör skriptet måste vi ge två argument för att skriptet ska köras korrekt. Det första argumentet, $ 1, är filen som kommer att kopieras och ersätts som "cp -iv" -kommandotets första argument.
Det andra argumentet, $ 2, kommer att fungera som utgångsfilen för samma kommando. Men du kan också se att det är annorlunda. Vi har lagt till en period och vi har refererat till variabeln "date_formatted" ovanifrån. Nyfiken om vad detta gör?
Det här är vad som händer när man kör skriptet:
Du kan se att utdatafilen är listad som vad jag angav för $ 2, följt av en period, sedan utsignalen från datumkommandot! Förnuftigt, rätt?
Nu när jag kör kommandot datecp kör det här skriptet och tillåter mig att kopiera en fil till en ny plats och lägger automatiskt till datum och tid till slutet av filnamnet. Användbar för arkivering av saker!
Shell scripting är kärnan i att göra ditt OS arbete för dig. Du behöver inte lära dig ett nytt programmeringsspråk för att det ska hända heller. Prova att skripta med några grundläggande kommandon hemma och börja tänka på vad du kan använda detta för.
Skriver du? Har du några råd för nybörjare? Dela dina tankar i kommentarerna! Det finns mer att komma i denna serie!