23Aug
Termen "skalskriptning" nämns ofta i Linuxfora, 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 sig kommandoraden bättre och förhindra tråkiga filhanteringsuppgifter.
Vad är Shell Scripting?
Att vara en Linux-användare innebär att du spelar 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 skripthändelse, precis som batchfiler. De möjliggör också mycket mer användbara funktioner, såsom kommandosubstitution. Du kan åberopa 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. Med Scripting kan du använda programmeringsfunktioner - till exempel "för" loopar, om /then/ säger annat och så vidare - 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 repeterande 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? Skriv 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 också.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 anpassning.
Scripting kan enkelt använda "administratör" eller "superuser" privilegier, så det är bäst att testa skript innan du lägger 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 sakerna går fel.
Kärnan är helt enkelt enkla 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 skall kunna ske måste de ha rätt behörigheter. Du kan göra skript körbara genom att köra följande kommando på det:
chmod + x ~ /somecrazyfolder/ script1
Detta låter vem som helst springa det aktuella skriptet. Om du vill begränsa användningen till bara din användare kan du använda det här 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 är denna mapp inte längre skapad 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:
vilket [kommando]
Många människor heter deras tidiga skript "test" och när de försökerkör det i kommandoraden, händer inget. 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 som gör saker du inte tänker göra!
Scripting Guidelines
Som jag nämnde tidigare är varje skriptfil i huvudsak vanlig text. Det betyder inte att du kan skriva vad du vill ha, men kommer inte 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 omgiven av()
Hash-Bang Hack
När ett skal analyseras via en textfil, är det mest direkta sättet att identifiera filen somett skript är genom att göra din första raden:
#!/bin/ bash
Om du använder ett annat skal, ersätt dess sökvä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öra med det skal som den här raden pekar på.
Ny linje = Ny kommando
Varje ny rad ska betraktas som ett nytt kommando, eller en komponent i ett större system. Om /then/ annars uttalanden 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, bör 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 kommentarrad, 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 textomslag, 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
Under äldre dagar har kommandosubstitutioner gjorts 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 borde 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 vana att använda det här namnet.
Låt oss skapa en tom fil i ~ / bin-mappen:
touch ~ /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 fortsätta och sätta in förutsättningen för första raden och en kommentar om vad det här skriptet gör.
Därefter låt oss 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 annan information, 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 uppdata från datumkommandot:
Du kan se det genom att lägga till olika variabler som börjar med%, du kan ändra kommandot i 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 kallas kommandosubstitution. Vi berättar väsentligen att när variabeln "date_formatted" dyker upp, kör kommandot inom parenteserna. Då ska vad som helst som kommandon ger, visas i stället för variabelns namn, "date_formatted".
Här är ett exempelskript och dess utgång:
Observera att det finns två mellanslag i utmatningen. Utrymmet i citaten av 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 aktiverar kopieringskommandot med -i och -v alternativen. 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".
Återblick på vårt skript kan vi se 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 manuset körs:
Du kan se att utdatafilen anges som vad som helst som jag angav för $ 2, följt av en period, då utsignalen från datumkommandot! Ger mening, eller hur?
Nu när jag kör kommandot datecp kör det här skriptet och tillåter mig att kopiera någon fil till en ny plats och lägg automatiskt till datum och tid till slutet av filnamnet. Användbar för arkivering av saker!
Shell scripting är kärnan i att ditt operativsystem fungerar för dig. Du behöver inte lära dig ett nytt programmeringsspråk för att få det att hända. Försök 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!