Göm menyn

Vad är skript?

I det här avsnittet introducerar vi skriptprogram för att automatisera skalet.

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.k. 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)

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:

	
#!/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.

Tips 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.

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 steg som behandlar olika kommandon, särskilt avsnitten om hur du hittar hjälp .

Rent konkret är skript som vi sett tidigare 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å skriptspråk. Skriptspråket består av alla kommandon, inklusive speciella kontrollsatser som if, for och while. Det skal som du normalt kör på IDA heter bash, men skripten i den här kursen är skrivna i ett lite enklare skal som heter sh.

Den första raden i show.sh med prefixet #! anger vilket skal som skriptet ska köras i. Vi har valt skalet sh som ligger i katalogen /bin på systemet. 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.

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.

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.

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. Lösningsförslag

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. 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. Lösningsförslag

Viktigt I det här steget går vi igenom skriptprogrammering i det enklare skalet sh. Om du istället vill fördjupa dig i skriptprogrammering i vårt standardskal bash kan du t.ex. titta på Bash Programming Introduction , Advanced Bash-scripting Guide eller Bash Pitfalls .

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 dom värden med =

Diagnos

Det finns ingen diagnos för detta avsnitt men det kan vara en bra idé att repetera och testa det som tas upp så att det sätter sig på minnet!


Sidansvarig: Peter Dalenius
Senast uppdaterad: 2023-08-21