E3. Skript
Skript är kronan på verket när det gäller att illustrera hur kraftfullt Linux är och hur mycket du kan göra med skalkommandon. Vi kommer dock bara att hinna börja nosa lite på hur du kan skriva egna skript. Du förväntas inte kunna skriva egna avancerade skript från grunden, utan vi kommer guida dig stegvis. Poängen med det här kapitlet är att illustrera vad Linux kan göra.
1. Vad är skript?
I Linux spelar kommandotolken eller skalet en central roll. Här skriver man in kommandon som Linux tolkar och kör. För att effektivisera användningen av skalet kan man skriva så kallade skript. Detta är korta textfiler som innehåller flera kommandon som ska köras i ett svep. Skript lämpar sig därför utmärkt om man har en uppgift man vill göra ofta, eller om man vill göra en komplicerad operation på flera olika filer. Skript är alltså ett slags makro.
Låt oss ta ett enkelt exempel. För att lista alla användare som tidigare loggat in på den aktuella datorn kan vi använda kommandot last
. Om vi bara är intresserade av en specifik användare kan vi filtrera fram informationen om denne med grep
. Vill vi t.ex. veta om Peter varit inloggad på just den här datorn kan vi skriva så här:
turte123@li10-3:-$ last | grep petda123
petda123 pts/1 2001:6b0:17:f023 Mon Aug 11 13:33 - 14:33 (60:00)
Här får vi veta att Peter loggade in på den här datorn 11 augusti. Antag att vi tycker att det är lite jobbigt att skriva hela det här kommandot varje gång vi vill leta efter någon. Vi kan då placera kommandot i ett skript som t.ex. kan se ut så här: x
#!/bin/sh
last | grep $1
Om vi sparar de här raderna i filen check.sh
och gör den körbar kan vi sedan skriva ./check.sh petda123
när vi vill leta reda på Peter. Vi kan också lätt byta ut hans inloggningsnamn mot ett annat.
Istället för att specificera skriptet check.sh
genom att referera till den från aktuella katalogen så kan man lägga till aktuella katalogen som sökväg. Då kan man istället skriva check.sh petda123
för att köra skriptet.
Övning
Starta valfri textredigerare och skriv in de två raderna ovan. Spara filen med namnet check.sh
och gör den körbar genom att skriva chmod +x check.sh
i ett skalfönster. Testa sedan skriptet genom att t.ex. använda ditt eget LiU-id som argument.
2. Att skriva egna skript
För att kunna konstruera användbara skript bör man känna till de vanligaste kommandona. Det är dock inte nödvändigt att känna till alla detaljer om deras flaggor och parametrar. Även erfarna användare slår upp saker i den inbyggda manualen. Titta gärna tillbaka på de föregående kapitel som behandlar olika kommandon, särskilt avsnitten om hur du hittar hjälp.
Rent konkret är skript helt vanliga textfiler som man kan skriva i godtycklig textredigerare. För att systemet ska veta att textfilen är körbar måste den få körrättigheter. Detta kan du göra genom kommandot chmod +x skriptfil
.
I detta avsnitt ska vi undersöka skriptet show.sh. Spara ner filen och gör den körbar genom att skriva chmod +x show.sh
i ett skalfönster. Öppna filen i valfri textredigerare och följ med genom resten av avsnittet.
Val av skriptspråk
Skript är skrivna i ett skriptspråk som tolkas och körs av skalet. sh
, tcsh
och bash
är tre exempel på skal med tillhörande skriptspråk. Skriptspråket består av alla kommandon, inklusive speciella kontrollsatser som if, for och while. Det skal som du normalt kör heter bash
, men skripten i den här kapitlet är skrivna i ett lite enklare skal som heter sh
.
Den första raden i show.sh
inleds med prefixet #!
vilket anger vilket skal som skriptet ska köras i. Vi har valt skalet sh
som ligger i katalogen /bin
. Vi specifierar vilket skal vi vill använda eftersom vi inte alltid vet vilka personer som kommer att använda skriptet och det är möjligt att många kör olika skal och därmed har annorlunda syntax. Prefixet #!
brukar kallas för shebang.
För att underlätta lite när man skapar skript kan man byta ut #!/bin/sh
mot #!/bin/sh -x
. Detta tillägg gör att alla rader i skriptet kommer att skrivas ut samtidigt som skriptet körs. Genom att använda flaggan -x
är det enklare att hitta fel som uppstår. När man har ett skript som fungerar ska man ta bort flaggan eftersom det är onödigt att skriva ut hela skriptet varje gång det körs.
Att köra skript
När du kör show.sh
kan du förvänta dig utskrift som ser ut ungefär så här:
turte123@li10-3:-$ chmod +x show.sh
turte123@li10-3:-$ show.sh
Datum och tid:
torsdag, 15 augusti 2002 kl 13:33:39 MEST
Du är inloggad som:
turte123 pts/5 aug 5 10:11 (:0.0)
Du befinner dig i katalogen:
/home/turte123
turte123@li10-3:-$
Efter den första raden i show.sh
kommer några rader som börjar med #
som följs av text. Dessa utgör kommentarer som beskriver vad skriptet gör och påverkar inte vad skriptet gör när det körs. Ta här för vana att skriva en liten kort beskrivning av vad det är dina skript gör.
Som du ser följer sedan några vanliga kommandon i Linux. Kommandot echo
skriver ut text på skärmen. Kommandot date
visar aktuellt datum och tid, who am i
visar vem man är inloggad som och pwd
visar aktuell katalog.
3. Variabler och argument
Ett argument är någon typ av information som vi skickar med till ett kommando. I exemplet ls *.txt
är *.txt
ett argument. När man konstruerar skript kan man komma åt argumenten i form av variabler. En variabel är, lite förenklat, en plats att lagra information som vi kan komma åt med hjälp av ett namn. Förutom argumenten finns det ett antal andra variabler och vi kan också skapa egna.
Vi har tidigare sett hur variabler fungerar i skalet. För att använda en variabel i ett skript använder man samma metod genom att skriva $
följt av variablens namn, t.ex. echo $PATH
för att skriva ut innehållet i variablen PATH
.
Det finns några specialvariabler som man kan använda i skript som innehåller värdena på de argument som skriptet anropats med, samt lite annan information. Se tabellen nedan.
Variabel | Värde |
---|---|
$1 till $9 |
Argumenten till skriptet, refererade till med index. (För fler argument än nio kan kommandot shift användas.) |
$0 |
Namnet på kommandot som körs just nu (dvs skriptet självt). |
$? |
Exitstatus för det senaste exekverade kommandot. Exitstatus är 0 om kommandot slutfördes utan problem, annars är det något annat värde. Om man t.ex. har utfört grep utan att ha hittat det man sökte efter returneras inte exitstatus 0. |
$$ |
Det här är skalets processnummer, det vill säga en unik "ID-bricka" som operativsystemet delar ut. Det kan vara bra att använda om man vill skapa filer med unika namn. |
$! |
Processnumret för det senaste kommandot som kördes i bakgrunden. |
$- |
Växlarna man gav vid anrop till skriptet. |
$* |
En sträng med alla argumenten till skriptet. |
De mest användbara variablerna är $1
till $9
. De innehåller de argument som gavs till skriptet vid anrop. I skriptet sallad.sh ser vi hur vi kan använda variablerna för att ändra det som skrivs ut. T.ex. i:
turte123@tlhw-3-1:~$ sallad.sh apelsin "vindruvor och blåbär" "riven vit choklad"
Hacka upp en apelsin i 2cm stora bitar och lägg i en skål.
Blanda in vindruvor och blåbär, hela.
Toppa med en matsked riven vit choklad.
Servera direkt.
turte123@tlhw-3-1:~$
så innehåller $1
apelsin, $2
innehåller strängen "vindruvor och blåbär" och $3
innehåller "riven vit choklad". Notera att man måste använda citattecken när man vill att en variabel ska innehålla mellanslag.
4. Inmatning
Istället för att ta emot argument kan man låta användaren få mata in värden under tiden som skriptet körs. På det sättet kan man meddela vilka värden man efterfrågar och behöver inte råka ut för fel som uppstår när man skrivit in argumenten i fel ordning. För att läsa in data från användaren finns kommandot read
.
read var1 var2 ... varN
Varje argument som matas in hamnar i respektive variabel i den ordning de skrivs in. Om man anger fler argument än det finns variabler så kommer de som blir över att läggas i den sista variabeln. När man sedan ska använda variablerna anges namnen med dollartecken framför.
echo $var1
Övning
Skriv ett skript som läser in namn, platser, etc till variabler och sedan använder dessa för att skriva en saga på skärmen.
Se lösningsförslag.
5. Tilldelning
Det går även bra att ha helt egna variabler i sina skript. Skriv helt enkelt på följande sätt:
var=value
Du kan också tilldela variabeln resultatet av ett kommando. I så fall skriver du kommandot mellan bakåtvända enkla citattecken som i exemplet nedan:
jag=`who am i`
Efter att ha tilldelat en variabel ett värde på detta sätt kommer man åt värdet genom att skriva $var
. Här är ett exempel på ett skript som både använder read och egna variabler:
#!/bin/sh
echo Skriv in ditt för- och efternamn.
read firstname lastname
funnyname=${firstname}1337
echo Hej på dig $funnyname.
Vi låter användaren mata in för- och efternamn och lagrar dessa i de angivna variablerna. Därefter skapar vi en egen variabel funnyname
vars värde består av förnamnet plus texten 1337. För att kommandotolken ska veta var variablenamnet slutar och texten börjar omger vi variabelnamnet med tecknen { och }.
Övning
Skriv ett skript som tar ett namn och ett godtyckligt kommentartecken (t.ex. #, ; eller //) och skriver ett filhuvud inom kommentartecknen, dvs några rader som börjar med kommentartecken och som innehåller namnet och dagens datum.
Se lösningsförslag.
Övning
Här följer en lite svårare uppgift. Skriv ett skript som skriver ut en lista över vilka som är inloggade på samma server som du själv.
Se lösningsförslag.
Sammanfattning
- Skript är korta textfiler som innehåller flera kommandon som ska köras i ett svep.
- Vissa skript behöver argument som man skickar in när de anropas.
- Variablerna
$1
till$9
refererar till argumenten som skickas till skriptet. - Man kan mata in värden under tiden som skriptet körs om det innehåller kommandot
read
. - Man kan skapa egna variabler i ett skript och tilldela dem värden med
=
.
Vi kommer inte fördjupa oss mer i skript just nu, men om du är nyfiken och vill veta mer kan du titta på till exempel Bash Programming Introduction, Advanced Bash-Scripting Guide eller Bash Pitfalls.
Diagnos
När du har läst detta kapitel är det dags att göra diagnos E3. Du kommer inte att behöva skriva skript under diagnosen, utan bara svara på frågor om skript.
Sidansvarig: Peter Dalenius
Senast uppdaterad: 2025-06-30