Nybegynners Guide til Shell Scripting: Grunnleggende

Innholdsfortegnelse:

Nybegynners Guide til Shell Scripting: Grunnleggende
Nybegynners Guide til Shell Scripting: Grunnleggende

Video: Nybegynners Guide til Shell Scripting: Grunnleggende

Video: Nybegynners Guide til Shell Scripting: Grunnleggende
Video: Why I'm switching to Apple Maps (from Google) for cycling navigation - YouTube 2024, April
Anonim
Begrepet "shell scripting" blir ofte nevnt i Linux fora, men mange brukere er ikke kjent med det. Å lære denne enkle og kraftige programmeringsmetoden kan hjelpe deg med å spare tid, lære kommandolinjen bedre, og forkaste kjedelige filbehandlingsoppgaver.
Begrepet "shell scripting" blir ofte nevnt i Linux fora, men mange brukere er ikke kjent med det. Å lære denne enkle og kraftige programmeringsmetoden kan hjelpe deg med å spare tid, lære kommandolinjen bedre, og forkaste kjedelige filbehandlingsoppgaver.

Hva er Shell Scripting?

Å være en Linux bruker betyr at du spiller rundt med kommandolinjen. Liker det eller ikke, det er bare noen ting som gjøres mye lettere via dette grensesnittet enn ved å peke og klikke. Jo mer du bruker og lærer kommandolinjen, desto mer ser du potensialet. Vel, kommandolinjen i seg selv er et program: skallet. De fleste Linux distros i dag bruker Bash, og dette er hva du virkelig skriver inn kommandoer inn i.

Nå, noen av dere som brukte Windows før du bruker Linux, kan huske batchfiler. Disse var små tekstfiler som du kunne fylle med kommandoer for å utføre, og Windows ville kjøre dem igjen. Det var en smart og fin måte å få ting gjort, for eksempel å kjøre spill i din videregående datamaskinlaboratorium når du ikke kunne åpne systemmapper eller lage snarveier. Batchfiler i Windows, mens nyttig, er en billig etterligning av shell-skript.

Shell-skript tillater oss å programmere kommandoer i kjeder og få systemet til å utføre dem som en skripthendelse, akkurat som batchfiler. De tillater også langt flere nyttige funksjoner, som kommandosubstitusjon. Du kan påkalle en kommando, som dato, og bruke den er utdata som en del av et filnavn. Du kan automatisere sikkerhetskopier, og hver kopierte fil kan ha den aktuelle datoen vedlagt til slutten av navnet. Skript er ikke bare invokasjoner av kommandoer, heller. De er programmer i seg selv. Scripting lar deg bruke programmeringsfunksjoner - for eksempel for looper, om / da / andre setninger og så videre - direkte i operativsystemets grensesnitt. Og du trenger ikke å lære et annet språk fordi du bruker det du allerede vet: kommandolinjen.
Shell-skript tillater oss å programmere kommandoer i kjeder og få systemet til å utføre dem som en skripthendelse, akkurat som batchfiler. De tillater også langt flere nyttige funksjoner, som kommandosubstitusjon. Du kan påkalle en kommando, som dato, og bruke den er utdata som en del av et filnavn. Du kan automatisere sikkerhetskopier, og hver kopierte fil kan ha den aktuelle datoen vedlagt til slutten av navnet. Skript er ikke bare invokasjoner av kommandoer, heller. De er programmer i seg selv. Scripting lar deg bruke programmeringsfunksjoner - for eksempel for looper, om / da / andre setninger og så videre - direkte i operativsystemets grensesnitt. Og du trenger ikke å lære et annet språk fordi du bruker det du allerede vet: kommandolinjen.

Det er virkelig makt for skripting, tror jeg. Du kommer til å programmere med kommandoer du allerede vet, mens du lærer stifter av de fleste store programmeringsspråk. Trenger du å gjøre noe repeterende og kjedelig? Skript det! Trenger du en snarvei for en virkelig innviklet kommando? Skript det! Vil du bygge et veldig enkelt å bruke kommandolinjegrensesnitt for noe? Skript det!

Før du begynner

Før vi begynner vår skriptserie, la oss dekke noen grunnleggende opplysninger. Vi bruker bash-skallet, som de fleste Linux-distribusjoner bruker innfødt. Bash er tilgjengelig for Mac OS-brukere og Cygwin på Windows også. Siden det er så universelt, bør du kunne skanne uavhengig av plattformen din. I tillegg, så lenge alle kommandoer som refereres finnes, kan skript fungere på flere plattformer med liten eller ingen tilpasning.

Scripting kan enkelt gjøre bruk av "administrator" eller "superuser" privilegier, så det er best å teste skript før du setter dem på jobb. Bruk også sunn fornuft, som å sørge for at du har sikkerhetskopier av filene du skal kjøre et skript på. Det er også veldig viktig å bruke de riktige alternativene, som -i for kommandoen rm, slik at samspillet ditt er nødvendig. Dette kan forhindre noen ekkel feil. Som sådan, les gjennom skript du laster ned og vær forsiktig med data du har, bare hvis ting går galt.

Kjernen er bare enkle tekstfiler. Du kan bruke noen tekstredigerer til å skrive dem: gedit, emacs, vim, nano … Denne listen fortsetter. Bare vær sikker på å lagre den som ren tekst, ikke som rik tekst, eller et Word-dokument. Siden jeg elsker brukervennligheten som nano gir, bruker jeg det.

Skript Tillatelser og navn

Skript utføres som programmer, og for at dette skal skje, må de ha de riktige tillatelsene. Du kan gjøre skript kjørbare ved å kjøre følgende kommando på det:

chmod +x ~/somecrazyfolder/script1

Dette vil tillate noen å kjøre det bestemte skriptet. Hvis du vil begrense bruken til bare brukeren din, kan du bruke dette i stedet:

chmod u+x ~/somecrazyfolder/script1

For å kunne kjøre dette skriptet, må du cd inn i riktig katalog og deretter kjøre skriptet slik:

cd ~/somecrazyfolder

./script1

For å gjøre ting mer praktisk, kan du plassere skript i en "bin" -mappe i din hjemmekatalog:

~/bin

I mange moderne distroer er denne mappen ikke lenger opprettet som standard, men du kan opprette den. Dette er vanligvis hvor kjørbare filer lagres som tilhører brukeren din og ikke til andre brukere. Ved å plassere skript her, kan du bare kjøre dem ved å skrive navnet deres, akkurat som andre kommandoer, i stedet for å måtte cd rundt og bruke prefikset './'.

Før du navngir et skript, bør du imidlertid følgende kommando for å sjekke om du har installert et program som bruker det navnet:

which [command]

Mange mennesker kaller deres tidlige skript "test", og når de prøver å kjøre det i kommandolinjen, skjer ingenting. Dette skyldes at det er i konflikt med testkommandoen, noe som ikke gjør noe uten argumenter. Vær alltid sikker på at skriptnavnene dine ikke står i konflikt med kommandoer, ellers kan du finne deg selv å gjøre ting du ikke har tenkt å gjøre!

Scripting Retningslinjer

Som jeg nevnte før, er hver skriptfil hovedsakelig ren tekst.Det betyr ikke at du kan skrive hva du vil ha, men vilje. Når en tekstfil blir forsøkt å bli utført, vil skjellene analysere dem for å finne ut om de er skript eller ikke, og hvordan man skal håndtere alt riktig. På grunn av dette er det noen retningslinjer du trenger å vite.
Som jeg nevnte før, er hver skriptfil hovedsakelig ren tekst.Det betyr ikke at du kan skrive hva du vil ha, men vilje. Når en tekstfil blir forsøkt å bli utført, vil skjellene analysere dem for å finne ut om de er skript eller ikke, og hvordan man skal håndtere alt riktig. På grunn av dette er det noen retningslinjer du trenger å vite.
  1. Hvert script skal være med "#! / Bin / bash"
  2. Hver ny linje er en ny kommando
  3. Kommentar linjer starter med en #
  4. Kommandoer er omgitt av ()

Hash-Bang Hack

Når et skall analyserer gjennom en tekstfil, er den mest direkte måten å identifisere filen som et skript ved å lage din første linje:

#!/bin/bash

Hvis du bruker et annet skall, erstatte du banen her. Kommentar linjer starter med hashes (#), men legger til bang (!) Og shell banen etter at det er en slags hack som vil omgå denne kommentaren regel og vil tvinge skriptet til å utføre med skallet som denne linjen peker på.

Ny linje = Ny kommando

Hver ny linje bør betraktes som en ny kommando, eller en komponent av et større system. Hvis / da / andre setninger vil for eksempel overta flere linjer, men hver komponent i det systemet er i en ny linje. Ikke la en kommando bløde over i neste linje, da dette kan avkorte forrige kommando og gi deg en feil på neste linje. Hvis tekstredigereren gjør det, bør du slå av tekstinnpakning for å være på den sikre siden. Du kan slå av tekstinnpakning i nano-bit som rammer ALT + L.

Kommenter Ofte med #s

Hvis du starter en linje med en #, ignoreres linjen. Dette gjør det til en kommentarlinje, der du kan minne deg om hva resultatet av den forrige kommandoen var, eller hva neste kommando vil gjøre. Igjen, slå av tekstinnpakning, eller bry deg om kommentarer til flere linjer som alle begynner med en hash. Å bruke mange kommentarer er en god praksis å beholde, ettersom det lar deg og andre mennesker tilpasse dine skript lettere. Det eneste unntaket er den nevnte Hash-Bang hack, så følg ikke #s med! S.;-)

Kommandoer er omgitt av parenteser

I eldre dager ble kommandosubstitusjoner gjort med enkelt merketegn (`, aksjer ~ -tasten). Vi kommer ikke til å røre på dette ennå, men som de fleste går av og utforske etter å ha lært grunnleggende, er det sannsynligvis en god ide å nevne at du bør bruke parenteser i stedet. Dette skyldes hovedsakelig at når du nest - sette kommandoer i andre kommandoer - fungerer parenteser bedre.

Ditt første skript

La oss starte med et enkelt skript som lar deg kopiere filer og legge til datoer til slutten av filnavnet. La oss kalle det "datecp". Først, la oss sjekke for å se om det navnet står i konflikt med noe:

Du kan se at det ikke er noen utdata fra hvilken kommando, så vi er alle satt til å bruke dette navnet.
Du kan se at det ikke er noen utdata fra hvilken kommando, så vi er alle satt til å bruke dette navnet.

La oss lage en tom fil i ~ / bin-mappen:

touch ~/bin/datecp

Og, la oss endre tillatelsen nå, før vi glemmer:
Og, la oss endre tillatelsen nå, før vi glemmer:
La oss begynne å bygge skriptet vårt da. Åpne den filen i valgfri tekstredigerer. Som jeg sa, liker jeg enkelheten til nano.
La oss begynne å bygge skriptet vårt da. Åpne den filen i valgfri tekstredigerer. Som jeg sa, liker jeg enkelheten til nano.

nano ~/bin/datecp

Og la oss gå videre og sette inn forutsetningen første linje, og en kommentar om hva dette skriptet gjør.

Neste, la oss erklære en variabel. Hvis du noen gang har tatt algebra, vet du sikkert hva det er. En variabel tillater oss å lagre informasjon og gjøre ting med det. Variabler kan "utvide" når de refereres andre steder. Det vil si, i stedet for å vise navnet deres, vil de vise deres lagrede innhold. Du kan senere fortelle den samme variabelen for å lagre forskjellig informasjon, og enhver instruksjon som oppstår etter det, vil bruke den nye informasjonen. Det er en veldig fin plassholder.
Neste, la oss erklære en variabel. Hvis du noen gang har tatt algebra, vet du sikkert hva det er. En variabel tillater oss å lagre informasjon og gjøre ting med det. Variabler kan "utvide" når de refereres andre steder. Det vil si, i stedet for å vise navnet deres, vil de vise deres lagrede innhold. Du kan senere fortelle den samme variabelen for å lagre forskjellig informasjon, og enhver instruksjon som oppstår etter det, vil bruke den nye informasjonen. Det er en veldig fin plassholder.

Hva skal vi sette inn variabel? Vel, la oss lagre dato og klokkeslett! For å gjøre dette, ringer vi på datoen kommandoen.

Ta en titt på skjermbildet nedenfor for hvordan du bygger utdataene fra datakommandoen:

La oss bruke den siste iterasjonen av datakommandoen, "dato +% m_% d_% y-% H.% M.% S", og bruk det i vårt skript.

Hvis vi skulle lagre dette skriptet akkurat nå, kunne vi kjøre det, og det ville gi oss utdataene fra datakommandoen som vi ville forvente:
Hvis vi skulle lagre dette skriptet akkurat nå, kunne vi kjøre det, og det ville gi oss utdataene fra datakommandoen som vi ville forvente:
Image
Image

Men la oss gjøre noe annerledes. La oss gi et variabelt navn, som date_formatted til denne kommandoen. Den riktige syntaksen for dette er som følger:

variable=$(command –options arguments)

Og for oss vil vi bygge det slik:

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

Dette er hva vi kaller kommandosubstitusjon. Vi forteller i utgangspunktet at når variabelen "date formatted" dukker opp, kjører kommandoen inne parentesene. Deretter skal uansett utdata kommandoene gi vises i stedet for navnet på variabelen, "date formatted".
Dette er hva vi kaller kommandosubstitusjon. Vi forteller i utgangspunktet at når variabelen "date formatted" dukker opp, kjører kommandoen inne parentesene. Deretter skal uansett utdata kommandoene gi vises i stedet for navnet på variabelen, "date formatted".

Her er et eksempelskript og dets utgang:

Image
Image
Merk at det er to mellomrom i utgangen. Plassen i sitatene til ekkokommandoen og plassen foran variabelen vises begge. Ikke bruk mellomrom hvis du ikke vil at de skal dukke opp. Vær også oppmerksom på at uten denne ekstra "echo" -linjen, ville skriptet gi absolutt ingen utgang.
Merk at det er to mellomrom i utgangen. Plassen i sitatene til ekkokommandoen og plassen foran variabelen vises begge. Ikke bruk mellomrom hvis du ikke vil at de skal dukke opp. Vær også oppmerksom på at uten denne ekstra "echo" -linjen, ville skriptet gi absolutt ingen utgang.

La oss komme tilbake til vårt skript. La oss legge til i kopieringsdelen av kommandoen.

cp –iv $1 $2.$date_formatted

Dette vil påkalle kopikommandoen, med alternativene -i og -v. Den tidligere vil be deg om bekreftelse før du overskriver en fil, og sistnevnte vil vise hva som kommer ned på kommandolinjen.
Dette vil påkalle kopikommandoen, med alternativene -i og -v. Den tidligere vil be deg om bekreftelse før du overskriver en fil, og sistnevnte vil vise hva som kommer ned på kommandolinjen.

Deretter kan du se at jeg har lagt til «$ 1» -alternativet.Ved skripting vil et dollarskilt ($) etterfulgt av et tall angi det nummererte argumentet for skriptet når det ble påkalt. For eksempel i følgende kommando:

cp –iv Trogdor2.mp3 ringtone.mp3

Det første argumentet er, ÄúTrogdor2.mp3,Äù og det andre argumentet er, Eúringtone.mp3,Äù.

Ser tilbake på skriptet vårt, vi kan se at vi refererer til to argumenter:

Dette betyr at når vi kjører skriptet, må vi gi to argumenter for at skriptet skal kjøre riktig. Det første argumentet, $ 1, er filen som vil bli kopiert, og er erstattet som "Eupp, Äìiv,Äù kommandoen" første argument.
Dette betyr at når vi kjører skriptet, må vi gi to argumenter for at skriptet skal kjøre riktig. Det første argumentet, $ 1, er filen som vil bli kopiert, og er erstattet som "Eupp, Äìiv,Äù kommandoen" første argument.

Det andre argumentet, $ 2, vil fungere som utdatafil for samme kommando. Men du kan også se at det er annerledes. Vi har lagt til en periode, og vi har referert til, Äúdate_formatted,Äù variabel ovenfra. Nysgjerrig på hva dette gjør?

Her skjer hva som skjer når skriptet kjøres:

Du kan se at utdatafilen er oppført som det jeg skrev inn for $ 2, etterfulgt av en periode, deretter utgangen av datakommandoen! Fornuftig, ikke sant?
Du kan se at utdatafilen er oppført som det jeg skrev inn for $ 2, etterfulgt av en periode, deretter utgangen av datakommandoen! Fornuftig, ikke sant?

Nå når jeg kjører datecp-kommandoen, vil den kjøre dette skriptet og tillate meg å kopiere noen fil til en ny plassering, og legg automatisk til dato og klokkeslett til slutten av filnavnet. Nyttig for arkivering av ting!

Shell skripting er sentral i å gjøre ditt OS arbeid for deg. Du må ikke lære et nytt programmeringsspråk for å få det til å skje heller. Prøv å skripte med noen grunnleggende kommandoer hjemme og begynn å tenke på hva du kan bruke dette til.

Skriver du? Har du råd til nybegynnere? Del dine tanker i kommentarene! Det er mer å komme inn i denne serien!

Anbefalt: