Historiskt sett har skalet varit den ursprungliga kommandoradstolken för Unix-liknande system. Det har visat sig vara en av Unix huvudfunktioner och har vuxit till ett nytt ämne. Linux erbjuder en mängd kraftfulla skal med robust funktionalitet, inklusive Bash, Zsh, Tcsh och Ksh.
En av de mest fantastiska egenskaperna hos dessa skal är deras programmerbarhet. Det är enkelt att skapa enkla men effektiva Linux-skalskript för att hantera dagliga jobb. Dessutom kommer en blygsam kunskap om detta ämne att göra dig till en Linux-användare på nolltid. Stanna hos oss för en detaljerad introduktion till Unix-skalskript.
Exempel på Linux Shell och Bash Script
Majoriteten av skalskript som görs på Linux involverar bash-skalet. Men avancerade användare med specificerade val använder ofta skal som Zsh och Ksh. Vi kommer för det mesta att hålla oss till Linux bash-skript i våra exempel på grund av deras utbredda popularitet och enorma användbarhet.
Våra redaktörer har dock också försökt beskriva några skalskriptexempel som handlar om andra skal än bash. Som ett resultat kommer du att hitta betydande förtrogenhet mellan olika skalskript.
Linux Bash-skript
Våldsamt slag, Bourne Again Shellär standardkommandoradstolken i de flesta Linux-distros nuförtiden. Det är en uppgradering av det tidigare Bourne-skalet som först introducerades i version 7 Unix. Att lära sig bash-skalskript gör att du kan förstå andra skalskript mycket snabbare. Så prova dessa enkla exempel själv för att få förstahandserfarenhet.
1. Hej världen
Programmerare lär sig ofta nya språk genom att lära sig programmet Hello World. Det är ett enkelt program som skriver ut strängen till standardutgången. Använd sedan en redigerare som Vim eller Nano för att skapa filen hello-world.sh och kopiera raderna nedan till den.
#!/bin/bash echo "Hello World"
Spara och avsluta filen. Därefter måste du göra den här filen körbar med kommandot nedan.
$ chmod a+x hello-world.sh
Du kan köra detta med något av nedanstående två kommandon.
—
$ bash hello-world.sh $ ./hello-world.sh
Det kommer att skriva ut strängen som skickas till eko inuti skriptet.
2. Använda eko för att skriva ut
Ekokommandot används för att skriva ut information i bash. Den liknar C-funktionen ‘printf’ och ger många vanliga alternativ, inklusive escape-sekvenser och omdirigering.
Kopiera nedanstående rader till en fil som heter echo.sh och gör den körbar enligt ovan.
#!/bin/bash echo "Printing text" echo -n "Printing text without newline" echo -e "\nRemoving \t special \t characters\n"
Kör skriptet för att se vad det gör. De -e alternativet används för att tala om för ekot att strängen som skickas till den innehåller specialtecken och kräver utökad funktionalitet.
Kommentarer är användbara för dokumentation och är ett krav för högkvalitativa kodbaser. Det är vanligt att lägga kommentarer i koder som handlar om kritisk logik. För att kommentera en rad, använd bara #(hash) tecken före det. Kolla till exempel bash-skriptexemplet nedan.
#!/bin/bash # Adding two values ((sum=25+35)) #Print the result echo $sum
Detta skript kommer att mata ut siffran 60. Kontrollera först hur kommentarer används med hjälp av # före några rader. Den första raden är dock ett undantag. Det kallas shebang och låter systemet veta vilken tolk som ska användas när det här skriptet körs.
Många använder flerradiga kommentarer för att dokumentera sina skalskript. Kontrollera hur detta görs i nästa skript som heter comment.sh.
#!/bin/bash : ' This script calculates the square of 5. ' ((area=5*5)) echo $area
Lägg märke till hur flerradiga kommentarer placeras inuti :’ och ‘ tecken.
5. The While Loop
While loop-konstruktionen används för att köra vissa instruktioner flera gånger. Kolla in följande skript som heter while.sh för en bättre förståelse av detta koncept.
#!/bin/bash i=0 while [ $i -le 2 ] do echo Number: $i ((i++)) done
Så while-slingan tar formen nedan.
while [ condition ] do commands 1 commands n done
Utrymmet kring hakparenteserna är obligatoriskt.
6. For Loop
For-loopen är en annan allmänt använd bash-skalkonstruktion som tillåter användare att iterera över koder effektivt. Ett enkelt exempel visas nedan.
#!/bin/bash for (( counter=1; counter<=10; counter++ )) do echo -n "$counter " done printf "\n"
Spara den här koden i en fil som heter for.sh och kör den med ./for.sh. Glöm inte att göra det körbart. Detta program bör skriva ut siffrorna 1 till 10.
7. Ta emot input från användare
Att få användarinput är avgörande för att implementera användarinteraktion i dina skript. Skalskriptexemplet nedan visar hur man tar emot användarinput i ett skalprogram.
#!/bin/bash echo -n "Enter Something:" read something echo "You Entered: $something"
Så läskonstruktionen, följt av ett variabelnamn, används för att få användarinmatning. Indata lagras i denna variabel och kan nås med $-tecknet.
8. If-utlåtandet
Om uttalanden är den vanligaste villkorskonstruktionen som finns tillgänglig i Unix-skalskript, har de den form som visas nedan.
if CONDITION then STATEMENTS fi
Satserna exekveras endast när CONDITION är sant. Nyckelordet fi används för att markera slutet av if-satsen. Ett snabbt exempel visas nedan.
#!/bin/bash echo -n "Enter a number: " read num if [[ $num -gt 10 ]] then echo "Number is greater than 10." fi
Ovanstående program kommer endast att visa utdata om antalet som tillhandahålls via ingång är större än tio. De -gt står för större än; liknande -lt för mindre än; -le för mindre än lika; och -ge för större än lika. Dessutom [[ ]]krävs.
9. Mer kontroll med om annat
Att kombinera den andra konstruktionen med if ger mycket bättre kontroll över ditt skripts logik. Ett enkelt exempel visas nedan.
#!/bin/bash read n if [ $n -lt 10 ]; then echo "It is a one digit number" else echo "It is a two digit number" fi
Den andra delen måste placeras efter åtgärdsdelen av if och före fi.
10. Använda AND-operatören
OCH-operatören låter vårt program kontrollera om flera villkor är uppfyllda samtidigt eller inte. Alla delar separerade av en AND-operator måste vara sanna. Annars kommer satsen som innehåller AND att returnera falskt. Kontrollera följande bash-skriptexempel för att bättre förstå hur OCH fungerar.
#!/bin/bash echo -n "Enter Number:" read num if [[ ( $num -lt 10 ) && ( $num%2 -eq 0 ) ]]; then echo "Even Number" else echo "Odd Number" fi
OCH-operatorn betecknas med && tecken.
11. Använda ELLER-operatören
OR-operatorn är en annan viktig konstruktion som gör att vi kan implementera komplex, robust programmeringslogik i våra skript. I motsats till AND, returnerar ett påstående som består av OR-operatorn sant när någon av dess operander är sann. Det returnerar falskt endast när varje operand separerad av ELLER är falsk.
#!/bin/bash echo -n "Enter any number:" read n if [[ ( $n -eq 15 || $n -eq 45 ) ]] then echo "You won" else echo "You lost!" fi
Detta enkla exempel visar hur OR-operatören fungerar i Linux-skalskript. Det förklarar användaren som vinnare först när han anger siffran 15 eller 45. || tecken representerar ELLER-operatorn.
12. Använda Elif
elif-satsen står för else if och erbjuder ett bekvämt sätt att implementera kedjelogik. Ta reda på hur elif fungerar genom att bedöma följande exempel.
#!/bin/bash echo -n "Enter a number: " read num if [[ $num -gt 10 ]] then echo "Number is greater than 10." elif [[ $num -eq 10 ]] then echo "Number is equal to 10." else echo "Number is less than 10." fi
Ovanstående program är självförklarande så vi kommer inte att dissekera det rad för rad. Ändra istället delar av skriptet, som variabelnamn och värden, för att kontrollera hur de fungerar tillsammans.
13. Switchkonstruktionen
Switch-konstruktionen är en annan kraftfull funktion som erbjuds av Linux bash-skript. Det kan användas där kapslade villkor krävs, men du vill inte använda komplexa om-annat-elif kedjor. Ta en titt på nästa exempel.
#!/bin/bash echo -n "Enter a number: " read num case $num in 100) echo "Hundred!!" ;; 200) echo "Double Hundred!!" ;; *) echo "Neither 100 nor 200" ;; esac
Villkoren skrivs mellan nyckelordet case och esac. *) används för att matcha andra ingångar än 100 och 200.
14. Kommandoradsargument
Att få argument direkt från kommandoskalet kan vara fördelaktigt i ett antal fall. Exemplet nedan visar hur man gör detta i bash.
#!/bin/bash echo "Total arguments : $#" echo "First Argument = $1" echo "Second Argument = $2"
Kör det här skriptet med ytterligare två parametrar efter namnet. Jag har döpt det till test.sh, och anropsproceduren beskrivs nedan.
$ ./test.sh Hey Howdy
Så, $1 används för att komma åt det första argumentet, $2 för det andra, och så vidare. Sedan, slutligen, används $# för att få det totala antalet argument.
15. Få argument med namn
Exemplet nedan visar hur man får kommandoradsargument med deras namn.
#!/bin/bash for arg in "$@" do index=$(echo $arg | cut -f1 -d=) val=$(echo $arg | cut -f2 -d=) case $index in X) x=$val;; Y) y=$val;; *) esac done ((result=x+y)) echo "X+Y=$result"
Namnge detta skript test.sh och kalla det som visas nedan.
$ ./test.sh X=44 Y=100
Det bör returnera X+Y=144. Argumenten här lagras i ‘$@‘ och skriptet hämtar dem med kommandot Linux cut.
16. Sammanfoga strängar
Strängbearbetning är av yttersta vikt för ett brett utbud av moderna bash-skript. Tack och lov är den mycket bekvämare i bash och möjliggör ett mer exakt, kortfattat sätt att implementera detta. Se exemplet nedan för en blick på bash-strängssammansättning.
#!/bin/bash string1="Ubuntu" string2="Pit" string=$string1$string2 echo "$string is a great resource for Linux beginners."
Följande program matar ut strängen “UbuntuPit är en bra resurs för Linux-nybörjare.” till skärmen.
17. Skiva strängar
Till skillnad från många programmeringsspråk har bash ingen inbyggd funktion för att klippa delar av en sträng. Men exemplet nedan visar hur detta kan göras med hjälp av parameterexpansion.
#!/bin/bash Str="Learn Bash Commands from UbuntuPit" subStr=${Str:0:20} echo $subStr
Detta skript ska skriva ut “” som dess utdata. Parameterexpansionen tar formen ${VAR_NAME:S:L}. Här anger S startpositionen och L anger längden.
Linux cut-kommandot kan användas i dina skript för att “klippa ut” en del av en sträng, alias understrängen. Nästa exempel visar hur detta kan göras.
#!/bin/bash Str="Learn Bash Commands from UbuntuPit" #subStr=${Str:0:20} subStr=$(echo $Str| cut -d ' ' -f 1-3) echo $subStr
19. Lägga till två värden
Det är ganska enkelt att utföra aritmetiska operationer i Linux-skalskript. Exemplet nedan visar hur man tar emot och lägger till två nummer som input från användaren och lägger till dem.
#!/bin/bash echo -n "Enter first number:" read x echo -n "Enter second number:" read y (( sum=x+y )) echo "The result of addition=$sum"
Som du kan se är det ganska enkelt att lägga till siffror i bash.
20. Lägga till flera värden
Du kan använda loopar för att få flera användaringångar och lägga till dem i ditt skript. Följande exempel visar detta i praktiken.
#!/bin/bash sum=0 for (( counter=1; counter<5; counter++ )) do echo -n "Enter Your Number:" read n (( sum+=n )) #echo -n "$counter " done printf "\n" echo "Result is: $sum"
Men att utelämna (( )) kommer att resultera i strängsammansättning snarare än tillägg. Så kolla efter saker som detta i ditt program.
21. Funktioner i Bash
Som med alla programmeringsdialekter spelar funktioner en viktig roll i Linux-skalskript. De tillåter administratörer att skapa anpassade kodblock för frekvent användning. Nedanstående demonstration kommer att beskriva hur funktioner fungerar i Linux bash-skript.
#!/bin/bash function Add() { echo -n "Enter a Number: " read x echo -n "Enter another Number: " read y echo "Adiition is: $(( x+y ))" } Add
Här har vi lagt till två nummer precis som tidigare. Men här har vi gjort jobbet med en funktion som heter Lägg till. Så närhelst du behöver lägga till igen kan du bara anropa den här funktionen istället för att skriva det avsnittet igen.
22. Funktioner med returvärden
En av de mest fantastiska funktionerna är att tillåta överföring av data från en funktion till en annan. Det är användbart i en mängd olika scenarier. Kolla in nästa exempel.
#!/bin/bash function Greet() { str="Hello $name, what brings you to UbuntuPit.com?" echo $str } echo "-> what's your name?" read name val=$(Greet) echo -e "-> $val"
Här innehåller utdata data som tas emot från Greet()-funktionen.
23. Skapa kataloger från Bash-skript
Möjligheten att köra systemkommandon med hjälp av skalskript gör att utvecklare kan vara mycket mer produktiva. Följande enkla exempel visar hur du skapar en katalog inifrån ett skalskript.
#!/bin/bash echo -n "Enter directory name ->" read newdir cmd="mkdir $newdir" eval $cmd
Detta skript anropar helt enkelt ditt standardskalkommando mkdir och skickar det katalognamnet om du tittar noga. Detta program bör skapa en katalog i ditt filsystem. Du kan också skicka kommandot för att köra inuti backticks(“), som visas nedan.
`mkdir $newdir`
24. Skapa en katalog efter att ha bekräftat existensen
Ovanstående program kommer inte att fungera om din nuvarande arbetskatalog redan innehåller en mapp med samma namn. Till exempel kommer programmet nedan att kontrollera om det finns någon mapp med namnet $dir och skapa bara en om den inte hittar någon.
#!/bin/bash echo -n "Enter directory name ->" read dir if [ -d "$dir" ] then echo "Directory exists" else `mkdir $dir` echo "Directory created" fi
Skriv det här programmet med hjälp av eval för att öka dina bash-skriptfärdigheter.
25. Läsa filer
Bash-skript tillåter användare att läsa filer mycket effektivt. Exemplet nedan visar hur man läser en fil med hjälp av skalskript. Skapa först en fil som heter editors.txt med följande innehåll.
1. Vim 2. Emacs 3. ed 4. nano 5. Code
Detta skript kommer att mata ut var och en av ovanstående 5 rader.
#!/bin/bash file="editors.txt" while read line; do echo $line done < $file
26. Ta bort filer
Följande program kommer att visa hur man tar bort en fil i Linux-skalskript. Programmet kommer först att be användaren att ange filnamnet som indata och ta bort det om det finns. Kommandot Linux rm tar bort filen här.
#!/bin/bash echo -n "Enter filename ->" read name rm -i $name
Låt oss skriva in editors.txt som filnamn och tryck på y när du tillfrågas om bekräftelse. Det bör ta bort filen.
27. Bifoga till filer
Skalskriptexemplet nedan visar dig hur du lägger till data till en fil på ditt filsystem med bash-skript. Den lägger till en extra rad till den tidigare editors.txt-filen.
#!/bin/bash echo "Before appending the file" cat editors.txt echo "6. NotePad++" >> editors.txt echo "After appending the file" cat editors.txt
Du bör märka vid det här laget att vi använder vardagliga terminalkommandon direkt från Linux bash-skript.
28. Testa filexistens
Nästa skalskriptexempel visar hur man kontrollerar existensen av en fil från bash-program.
#!/bin/bash filename=$1 if [ -f "$filename" ]; then echo "File exists" else echo "File does not exist" fi
Vi skickar filnamnet direkt som argumentet från kommandoraden.
29. Skicka e-postmeddelanden från Shell Scripts
Det är ganska enkelt att skicka e-postmeddelanden från bash-skript. Följande enkla exempel kommer att visa ett sätt att göra detta från bash-applikationer.
#!/bin/bash recipient=”[email protected]” subject=”Greetings” message=”Welcome to UbuntuPit” `mail -s $subject $recipient <<< $message`
Det kommer att skicka ett e-postmeddelande till mottagaren med det angivna ämnet och meddelandet.
30. Analys av datum och tid
Nästa exempel på bashskript visar dig hur du hanterar datum och tider med hjälp av skript. Återigen, Linux-datumkommandot används för att få den nödvändiga informationen, och vårt program analyserar.
#!/bin/bash year=`date +%Y` month=`date +%m` day=`date +%d` hour=`date +%H` minute=`date +%M` second=`date +%S` echo `date` echo "Current Date is: $day-$month-$year" echo "Current Time is: $hour:$minute:$second"
Kör det här programmet för att se hur det fungerar. Testa också att köra date-kommandot från din terminal.
31. Sömnkommandot
Sleep-kommandot låter ditt skalskript pausa mellan instruktionerna. Det är användbart i ett antal scenarier, som att utföra jobb på systemnivå. Nästa exempel visar sleep-kommandot i aktion från ett skalskript.
#!/bin/bash echo "How long to wait?" read time sleep $time echo "Waited for $time seconds!"
Detta program pausar den sista instruktionens exekvering tills $tid sekunder, som användaren i detta fall tillhandahåller.
32. Väntekommandot
Vänta kommandot används för att pausa systemprocesser från Linux bash-skript. Kolla in följande exempel för en detaljerad förståelse av hur detta fungerar i bash.
#!/bin/bash echo "Testing wait command" sleep 5 & pid=$! kill $pid wait $pid echo $pid was terminated.
Kör det här programmet själv för att se hur det fungerar.
33. Visar den senast uppdaterade filen
Ibland kan du behöva hitta den senast uppdaterade filen för vissa operationer. Följande enkla program visar oss hur man gör detta i bash med hjälp av kommandot awk. Den kommer att lista antingen den senast uppdaterade eller skapade filen i din nuvarande arbetskatalog.
#!/bin/bash ls -lrt | grep ^- | awk 'END{print $NF}'
För enkelhetens skull undviker vi att beskriva hur awk fungerar i det här exemplet. Istället kan du helt enkelt kopiera den här koden för att slutföra uppgiften.
34. Lägga till batchtillägg
Exemplet nedan kommer att tillämpa ett anpassat tillägg på alla filer i en katalog. Skapa en ny katalog och lägg in några filer där för demonstrationsändamål. Min mapp har totalt fem filer, varje namngiven test följt av (0-4). Jag har programmerat det här skriptet för att lägga till (.UPP) i slutet av filerna. Du kan lägga till vilken tillägg du vill.
#!/bin/bash dir=$1 for file in `ls $1/*` do mv $file $file.UP done
För det första, försök inte det här skriptet från någon vanlig katalog; kör istället detta från en testkatalog. Dessutom måste du ange katalognamnet på dina filer som ett kommandoradsargument. Använd period(.) för den aktuella arbetskatalogen.
35. Skriv ut antalet filer eller kataloger
Linux bash-skriptet nedan hittar antalet filer eller mappar som finns i en given katalog. Den använder Linux find-kommandot för att göra detta. Först måste du skicka katalognamnet för att söka efter filer från kommandoraden.
#!/bin/bash if [ -d "$@" ]; then echo "Files found: $(find "$@" -type f | wc -l)" echo "Folders found: $(find "$@" -type d | wc -l)" else echo "[ERROR] Please retry with another folder." exit 1 fi
Programmet kommer att be användaren att försöka igen om den angivna katalogen inte är tillgänglig eller har behörighetsproblem.
36. Rensa loggfiler
Nästa enkla exempel visar hur vi kan använda skalskript i verkligheten. Detta program kommer att radera alla loggfiler som finns i din /var/log-katalog. Du kan ändra variabeln som innehåller den här katalogen för att rensa upp andra loggar.
#!/bin/bash LOG_DIR=/var/log cd $LOG_DIR cat /dev/null > messages cat /dev/null > wtmp echo "Logs cleaned up."
Kom ihåg att köra detta Linux-skalskript som root.
37. Säkerhetskopieringsskript med Bash
Skalskript ger ett robust sätt att säkerhetskopiera dina filer och kataloger. Följande exempel kommer att säkerhetskopiera varje fil eller katalog som har ändrats under de senaste 24 timmarna. Detta program använder kommandot find för att göra detta.
#!/bin/bash BACKUPFILE=backup-$(date +%m-%d-%Y) archive=${1:-$BACKUPFILE} find . -mtime -1 -type f -print0 | xargs -0 tar rvf "$archive.tar" echo "Directory $PWD backed up in archive file \"$archive.tar.gz\"." exit 0
Det kommer att skriva ut namnen på filerna och katalogerna efter att säkerhetskopieringen har lyckats.
38. Kontrollera om du är root
Exemplet nedan visar ett snabbt sätt att avgöra om en användare är en rot från Linux bash-skript.
#!/bin/bash ROOT_UID=0 if [ "$UID" -eq "$ROOT_UID" ] then echo "You are root." else echo "You are not root" fi exit 0
Utdata från detta skript beror på användaren som kör det. Det kommer att matcha root-användaren baserat på $UID.
39. Ta bort dubbletter från filer
Filbearbetning tar avsevärd tid och hämmar admins produktivitet på många sätt. Att söka efter dubbletter i dina filer kan till exempel bli en skrämmande uppgift. Lyckligtvis kan du göra detta med ett kort skalskript.
#! /bin/sh echo -n "Enter Filename-> " read filename if [ -f "$filename" ]; then sort $filename | uniq | tee sorted.txt else echo "No $filename in $pwd...try again" fi exit 0
Ovanstående skript går rad för rad genom din fil och tar bort alla duplicerade rader. Den placerar sedan det nya innehållet i en ny fil och behåller den ursprungliga filen intakt.
40. Systemunderhåll
Jag använder ofta ett litet Linux-skalskript för att uppgradera mitt system istället för att göra det manuellt. Det enkla skalskriptet nedan visar dig hur du gör detta.
#!/bin/bash echo -e "\n$(date "+%d-%m-%Y --- %T") --- Starting work\n" apt-get update apt-get -y upgrade apt-get -y autoremove apt-get autoclean echo -e "\n$(date "+%T") \t Script Terminated"
Skriptet tar även hand om gamla paket som inte längre behövs. Du måste köra det här skriptet med sudo; annars kommer det inte att fungera korrekt.
Avslutande tankar
Linux-skalskript kan vara så olika du kan föreställa dig. Det finns ingen gräns när man avgör vad man kan eller inte kan. Om du är en ny Linux-entusiast rekommenderar vi starkt att du behärskar dessa grundläggande bash-skriptexempel. Du bör justera dem för att förstå hur de fungerar tydligare.
Vi har försökt vårt bästa för att ge dig alla viktiga insikter som behövs för moderna Linux bash-skript. Vi har inte berört några tekniska frågor för enkelhetens skull. Den här guiden borde dock vara en bra utgångspunkt för många av er.