Introduktion

Det finns en stor variation av skalprogram. Den här minimala handboken behandlar Bourne shell. Det är ett väl beprövat skalprogram då det släpptes redan år 1977 fristående, och år 1979 med Seventh Edition Unix. Skripten i handboken har testats med sh på FreeBSD. Handboken är för en som skriver skript som skall kunna köras i en standardiserad UNIX-miljö, utan att förlita sig på de tillägg som finns i diverse andra skalprogram. Syntaxen som presenteras här fungerar dock även med skalprogram som exempelvis dash och bash.

Handboken förutsätter viss grundläggande kunskap inom programmering. Du behöver veta vad variabler, if-satser och slingor är. Handboken är dock skriven på ett förenklat sätt och kan fungera som en referens där en person som skriver skript snabbt kan slå upp viss funktionalitet.

Jag hoppas att du finner nöje i att lära dig sh med den här handboken. Jag välkomnar återkoppling om det är något du saknar i den.

Variabler & uträkingar

Variabler tillgås på två sätt. Dels genom tilldelning med = och dels genom avläsning genom $. Det är viktigt att inte omge vardera sida om = med mellanslag vid tilldelning, eftersom att det skulle bli ett syntaxfel.

Siffror och tal skrivs rakt av. Strängar citeras med ett par " eller ett par '.

#!/bin/sh

ettTal=999
ettOrd="hallon"

echo $ettTal $ettOrd

Det går att skriva tecknet " i en sträng citerad med ett par " genom att skriva \" för att markera att tecknet skall användas utan att avsluta strängen.

#!/bin/sh

enMening="Jag sade: \"Vilket underbart väder vi har idag.\""

echo $enMening

Uträkningar med heltal kan behandlas via inbyggd funktionalitet i sh. Beräkningsuttrycket har formen $((UTTRYCK)).

#!/bin/sh

echo $((8+2*4))

tal1=12
tal2=46
resultat=$(($tal2-$tal1))

echo $resultat

Uträkningar med flyttal tillhandahålls inte av sh. För att ge en komplett referens följer dock en lösning på hur en sådan uträkning kan ske med hjälp av standard UNIX-verktyget bc. I sh är det möjligt att omge en rad kommandon med ett par `-tecken, liknande en sträng. Detta innebär att utmatningen från angivna kommandon returneras. I exemplet som följer skriver echo ut värdena tal1 och tal2 tillsammans med * för multiplikation. Utmatningen skickas via en pipe till bc som i sin tur uträknar.

#!/bin/sh

tal1=3.14
tal2=7
resultat=`echo "$tal1 * $tal2" | bc`

echo $resultat

Satser

Vid formatering av if-satser är det viktigt att använda mellanslag mellan varje argument och de omslutande hakparenteserna.

#!/bin/sh

tal1=23

if [ $tal1 = 23 ]; then
	echo "ja!"
fi

I sh tolkas if-satser annorlunda än av kompileringsverktyg till programmeringsspråk. Eftersom att skript tolkas annorlunda så kan den vänstra hakparentesen [ i en if-sats egentligen vara ett inbyggt program vid namn test. Det går bra att skriva [ för att formatera en if-sats med test, eftersom att både [ och test pekar på samma funktion i skalprogrammet. När test körs som [ avslutas argumentlistan med en höger hakparentes ] precis som i föregående exempel. Nedan följer dock ett exempel som visar hur test kan användas.

#!/bin/sh

tal1=23

test $tal1 = 23 && echo "ja!"

Det går att utveckla en if-sats till en if/else-sats genom att skriva else på en ny rad.

#!/bin/sh

verktyg="dir"

echo -n "strängarna är: "

if [ $verktyg = "ls" ]; then
	echo "lika"
else
	echo "olika"
fi

Funktioner

Funktioner deklareras med ett namn följt av ett par parenteser ( ) samt ett block definierat av ett par klammerparenteser { }. Funktioner anropas genom att skriva funktionsnamnet.

#!/bin/sh

visaFiler() {
	echo "testar ls -l"
	ls -l
}

visaFiler

En funktion som anropas med argument tar emot argument som parametrar (märk skillnad i ordvalet). Parametrar läses via $parameterNummer (börjar med 1). Argument till funktionen anges efter funktionsnamnet vid anrop. Ett exempel följer som anropar en funktion (två gånger) med ett utgående argument där den inkommande parametern används på båda raderna i funktionen.

#!/bin/sh

visaFilerFiltrerat() {
	echo "visar eventuella .$1-filers rättigheter:"
	ls -l | grep ".$1"
}

visaFilerFiltrerat "sh"
visaFilerFiltrerat "txt"

Slingor (for och while)

#!/bin/sh

for ord in "brons" "silver" "guld"; do
	echo "delar ut ett $ord"
done
#!/bin/sh

i=0

while [ $i -lt 10 ]; do
	echo $i
	i=$(($i+1))
done

Filer

while true; do
	if ! read -r rad; then
		test -z $rad && break
	fi

	radNummer=$(($radNummer+1))

	echo "$radNummer: $rad"
done < $1 #första argumentet till sh är filen vars rader avläses i slingan

Utvalda exempel

Nyckelord

Nyckelorden som reserveras av sh följer. Utöver dessa är andra räckvidder att ha i åtanke, såsom de program vars belägenhet är hänvisade av $PATH.

!, {, }, case, do, done, elif, else, esac, fi, for, if, in, then, until, while

Källa: IEEE Std 1003.1, 2013 Edition, Shell & Utilities, 2.4 Reserved Words