Begyndervejledningen til Shell Scripting: Grundlæggende

Udtrykket "shell scripting" bliver ofte nævnt i Linux-fora, men mange brugere er ikke fortrolige med det. At lære denne nemme og effektive programmeringsmetode kan hjælpe dig med at spare tid, lære kommandolinjen bedre og forvise kedelige filadministrationsopgaver.

Hvad er Shell Scripting?

At være Linux-bruger betyder, at du leger med kommandolinjen. Kan det lide eller ej, der er bare nogle ting, der gøres meget lettere via denne grænseflade end ved at pege og klikke. Jo mere du bruger og lærer kommandolinjen, jo mere ser du dens potentiale. Nå, selve kommandolinjen er et program: skallen. De fleste Linux-distroer i dag bruger Bash, og det er det, du virkelig indtaster kommandoer i.

Nu kan nogle af jer, der brugte Windows, før de brugte Linux, huske batchfiler. Dette var små tekstfiler, som du kunne udfylde med kommandoer til at udføre, og Windows kørte dem igen. Det var en smart og pæn måde at få nogle ting gjort, som at køre spil i dit gymnasiums computerlaboratorium, når du ikke kunne åbne systemmapper eller oprette genveje. Batchfiler i Windows, selvom det er nyttigt, er en billig efterligning af shell-scripts.

Shell-scripts giver os mulighed for at programmere kommandoer i kæder og få systemet til at udføre dem som en scripted begivenhed, ligesom batchfiler. De giver også mulighed for langt mere nyttige funktioner, såsom kommandosubstitution. Du kan påberåbe en kommando, som dato, og bruge dens output som en del af et filnavngivningsskema. Du kan automatisere sikkerhedskopier, og hver kopierede fil kan have den aktuelle dato tilføjet i slutningen af ​​navnet. Scripts er heller ikke kun påkald af kommandoer. De er programmer i sig selv. Scripting giver dig mulighed for at bruge programmeringsfunktioner - såsom 'til' sløjfer, hvis / så / andet udsagn osv. - direkte inden for dit operativsystems grænseflade. Og du behøver ikke at lære et andet sprog, fordi du bruger det, du allerede kender: kommandolinjen.

Det er virkelig kraften i scripting, tror jeg. Du kommer til at programmere med kommandoer, du allerede kender, mens du lærer hæfteklammer på de fleste større programmeringssprog. Brug for at gøre noget gentagne og kedelige? Script det! Brug for en genvej til en virkelig indviklet kommando? Script det! Vil du opbygge en rigtig nem at bruge kommandolinjegrænseflade til noget? Script det!

Før du begynder

Før vi begynder vores scripting-serie, lad os dække nogle grundlæggende oplysninger. Vi bruger bash shell, som de fleste Linux-distributioner bruger indbygget. Bash er også tilgængelig for Mac OS-brugere og Cygwin på Windows. Da det er så universelt, skal du kunne scripte uanset din platform. Derudover, så længe alle de kommandoer, der henvises til, eksisterer, kan scripts arbejde på flere platforme uden behov for finjustering.

Scripting kan let gøre brug af "administrator" eller "superbruger" privilegier, så det er bedst at teste scripts, før du sætter dem i gang. Brug også sund fornuft, som at sikre dig, at du har sikkerhedskopier af de filer, du er ved at køre et script på. Det er også meget vigtigt at bruge de rigtige muligheder, som –i til kommandoen rm, så din interaktion er påkrævet. Dette kan forhindre nogle grimme fejl. Læs således de scripts, du downloader, og vær forsigtig med de data, du har, bare hvis ting går galt.

I deres kerne er scripts bare almindelige tekstfiler. Du kan bruge en hvilken som helst teksteditor til at skrive dem: gedit, emacs, vim, nano ... Denne liste fortsætter. Bare sørg for at gemme det som almindelig tekst, ikke som rig tekst eller et Word-dokument. Da jeg elsker den brugervenlighed, som nano giver, bruger jeg det.

Scripttilladelser og navne

Scripts udføres som programmer, og for at dette kan ske, skal de have de rette tilladelser. Du kan gøre scripts eksekverbare ved at køre følgende kommando på det:

chmod + x ~ / somecrazyfolder / script

Dette giver alle mulighed for at køre det pågældende script. Hvis du vil begrænse brugen til kun din bruger, kan du bruge dette i stedet:

chmod u + x ~ / somecrazyfolder / script

For at køre dette script skal du cd i det rigtige bibliotek og derefter køre scriptet sådan:

cd ~ / somecrazyfolder

./skript1

For at gøre tingene mere bekvemme kan du placere scripts i en "bin" -mappe i dit hjemmekatalog:

~ / bin

I mange moderne distroer oprettes denne mappe ikke længere som standard, men du kan oprette den. Dette er normalt hvor eksekverbare filer er gemt, der tilhører din bruger og ikke til andre brugere. Ved at placere scripts her kan du bare køre dem ved at skrive deres navn, ligesom andre kommandoer, i stedet for at skulle cd rundt og bruge præfikset './'.

Før du navngiver et script, skal du dog bruge følgende kommando for at kontrollere, om du har et program installeret, der bruger dette navn:

hvilken [kommando]

Mange navngiver deres tidlige scripts "test", og når de prøver at køre det på kommandolinjen, sker der intet. Dette skyldes, at det er i konflikt med testkommandoen, som ikke gør noget uden argumenter. Sørg altid for, at dine scriptnavne ikke er i konflikt med kommandoer, ellers kan du finde ud af, at du gør ting, du ikke har til hensigt at gøre!

Retningslinjer for scripting

Som jeg nævnte før, er hver scriptfil i det væsentlige almindelig tekst. Det betyder dog ikke, at du kan skrive, hvad du vil have alle sammen. Når en tekstfil forsøges eksekveret, analyserer skaller gennem dem for spor om, hvorvidt de er scripts eller ej, og hvordan man håndterer alt korrekt. På grund af dette er der et par retningslinjer, du har brug for at vide.

  1. Hvert script skal være med "#! / Bin / bash"
  2. Hver ny linje er en ny kommando
  3. Kommentarlinjer starter med et #
  4. Kommandoer er omgivet af ()

Hash-Bang Hack

Når en skal parses gennem en tekstfil, er den mest direkte måde at identificere filen på som et script ved at lave din første linje:

#! / bin / bash

Hvis du bruger en anden skal, skal du erstatte dens sti her. Kommentarlinjer starter med hashes (#), men tilføjelse af bang (!) Og shell-stien efter det er en slags hack, der vil omgå denne kommentarregel og vil tvinge scriptet til at udføre med den shell, som denne linje peger på.

Ny linje = Ny kommando

Hver ny linje skal betragtes som en ny kommando eller en komponent i et større system. Hvis / så / andet udsagn f.eks. Overtager flere linjer, men hver komponent i systemet er i en ny linje. Lad ikke en kommando bløde over i den næste linje, da dette kan afkorte den forrige kommando og give dig en fejl på den næste linje. Hvis din teksteditor gør det, skal du slå tekstindpakning fra for at være på den sikre side. Du kan slå tekstindpakning fra i nano-bit, der rammer ALT + L.

Kommenter ofte med #s

Hvis du starter en linje med et #, ignoreres linjen. Dette gør det til en kommentarlinje, hvor du kan minde dig selv om, hvad output fra den forrige kommando var, eller hvad den næste kommando vil gøre. Igen skal du slå tekstindpakning fra, eller bryde din kommentar i flere linjer, der alle begynder med en hash. Brug af mange kommentarer er en god praksis at holde, da det lader dig og andre mennesker tilpasse dine scripts lettere. Den eneste undtagelse er det ovennævnte Hash-Bang-hack, så følg ikke #s med! S. ;-)

Kommandoer er omgivet af parenteser

I ældre dage blev kommandosubstitutioner udført med enkelt kryds (`, deler ~ nøglen). Vi vil ikke røre ved dette endnu, men da de fleste mennesker går ud og udforsker efter at have lært det grundlæggende, er det sandsynligvis en god ide at nævne, at du i stedet skal bruge parenteser. Dette skyldes hovedsageligt, at når du nester - læg kommandoer inde i andre kommandoer - fungerer parenteser bedre.

Dit første script

Lad os starte med et simpelt script, der giver dig mulighed for at kopiere filer og tilføje datoer til slutningen af ​​filnavnet. Lad os kalde det "datecp". Lad os først kontrollere, om dette navn er i konflikt med noget:

Du kan se, at der ikke er nogen output af hvilken kommando, så vi er klar til at bruge dette navn.

Lad os oprette en tom fil i ~ / bin-mappen:

tryk på ~ / bin / datecp

Og lad os ændre tilladelsen nu, før vi glemmer:

Lad os begynde at bygge vores script derefter. Åbn filen i din valgte teksteditor. Som jeg sagde, kan jeg lide nanoens enkelhed.

nano ~ / bin / datecp

Og lad os gå videre og sætte den forudsatte første linje og en kommentar om, hvad dette script gør.

Lad os derefter erklære en variabel. Hvis du nogensinde har taget algebra, ved du sandsynligvis, hvad det er. En variabel giver os mulighed for at gemme oplysninger og gøre ting med det. Variabler kan "udvides", når der henvises til andetsteds. I stedet for at vise deres navn, vil de vise deres lagrede indhold. Du kan senere fortælle den samme variabel at gemme forskellige oplysninger, og enhver instruktion, der opstår efter det, vil bruge de nye oplysninger. Det er en rigtig fin pladsholder.

Hvad vil vi sætte ud variabel? Lad os gemme dato og klokkeslæt! For at gøre dette kalder vi på datokommandoen.

Se på skærmbilledet nedenfor for, hvordan du bygger output fra dato-kommandoen:

Du kan se, at ved at tilføje forskellige variabler, der starter med%, kan du ændre output af kommandoen til det, du ønsker. For mere information kan du se manualsiden for dato-kommandoen.

Lad os bruge den sidste iteration af datokommandoen, "date +% m_% d_% y-% H.% M.% S", og brug det i vores script.

Hvis vi skulle gemme dette script lige nu, kunne vi køre det, og det ville give os output af dato-kommandoen, som vi havde forventet:

Men lad os gøre noget andet. Lad os give et variabelnavn, som dato_formateret til denne kommando. Den korrekte syntaks for dette er som følger:

variabel = $ (kommando-valg argumenter)

Og for os ville vi bygge det sådan:

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

Dette er hvad vi kalder kommandosubstitution. Vi fortæller i det væsentlige bash, at når variablen "date_formatted" vises, skal du køre kommandoen inden for parenteserne. Derefter, uanset hvilket output kommandoerne giver, skal vises i stedet for navnet på variablen, "date_formatted".

Her er et eksempel på script og dets output:

Bemærk, at der er to mellemrum i output. Mellemrummet inden for citaterne fra ekkokommandoen og rummet foran variablen vises begge. Brug ikke mellemrum, hvis du ikke vil have dem til at dukke op. Bemærk også, at uden denne tilføjede "ekko" -linie, giver scriptet absolut ingen output.

Lad os vende tilbage til vores script. Lad os derefter tilføje i kopieringsdelen af ​​kommandoen.

cp –iv $ 1 $ 2. $ date_formatted

Dette påkalder kopikommandoen med indstillingerne –i og –v. Førstnævnte beder dig om verifikation, før de overskriver en fil, og sidstnævnte viser, hvad der er nede på kommandolinjen.

Derefter kan du se, at jeg har tilføjet indstillingen “$ 1”. Ved scripting angiver et dollartegn ($) efterfulgt af et tal det nummererede argument for scriptet, da det blev påberåbt. For eksempel i følgende kommando:

cp –iv Trogdor2.mp3 ringetone.mp3

Det første argument er “Trogdor2.mp3”, og det andet argument er “ringtone.mp3”.

Når vi ser tilbage på vores script, kan vi se, at vi henviser til to argumenter:

Dette betyder, at når vi kører scriptet, skal vi give to argumenter for, at scriptet kører korrekt. Det første argument, $ 1, er den fil, der skal kopieres, og erstattes med kommandoen “cp –iv” første argument.

Det andet argument, $ 2, fungerer som outputfil for den samme kommando. Men du kan også se, at det er anderledes. Vi har tilføjet en periode, og vi har henvist til variablen "dato_formateret" ovenfra. Nysgerrig efter, hvad dette gør?

Her er hvad der sker, når scriptet køres:

Du kan se, at outputfilen er angivet som det, jeg indtastede for $ 2, efterfulgt af en periode, derefter output fra dato-kommandoen! Det giver mening, ikke?

Nu når jeg kører datecp-kommandoen, kører den dette script og giver mig mulighed for at kopiere enhver fil til en ny placering og automatisk tilføje dato og tid til slutningen af ​​filnavnet. Nyttig til arkivering af ting!

Shell-scripting er kernen i at få dit operativsystem til at fungere for dig. Du behøver heller ikke at lære et nyt programmeringssprog for at få det til at ske. Prøv at script med nogle grundlæggende kommandoer derhjemme og begynd at tænke på, hvad du kan bruge dette til.

Skriver du script? Har du råd til nybegyndere? Del dine tanker i kommentarerne! Der kommer mere i denne serie!