Principen är enkel. I stället för att du matar in en serie kommandon, skriver ett kommando med en stor mängd parametrar eller utför ett jobb som bearbetar information på flera olika sätt skriver du in sekvensen i en textfil. Den utgör själva skriptet.
För flera olika tolkar
Skript kan skrivas för ett flertal kommandotolkar. Den vanligaste Unix-/Linux-tolken är /bin/sh eller /bin/bash. Det är god sed att börja skriptet med att specificera vilken tolk som ska exekvera den följande texten, även om det är standardtolken. Följande rad talar om att texten i skriptet ska tolkas av /bin/bash:
#!/bin/bash
Andra alternativ är /usr/bin/perl, om du skriver ett Perlskript, och /usr/bin/python om du skriver ett Pythonskript.
Nästa steg är att göra skriptet körbart genom att sätta x-flaggan, där x står för executable. Det gör du genom att skriva ”chmod +x ditt-skript”. Linux och Unix bryr sig inte om filändelser, skriptet kan heta i stort sett vad som helst.
Så hanteras indata
En del skript är helt statiska, men många behöver indata från administratören. Om du exempelvis skapar ett skript för att lägga upp en ny användare behöver du ett sätt att ange användarnamn som parameter till det. Användarnamnet kan du sedan använda för att lägga in en post i en databas, skapa en hemkatalog och ange rätt rättigheter.
Följande kodsnutt låter dig ange ett användarnamn som argument och returnerar ett felmeddelande om inget namn har angivits:
#!/bin/bash
NAME=$1
if [ -z $NAME ]; then
echo ”Syntax: $0 användar-namn”
exit
fi
echo ”Skapar konto $NAME”
Variabeln $1 är första argumentet till skriptet. Vi byter till det bättre förklarande variabelnamnet $NAME. I if-raden känner vi av om variabeln är noll med flaggan -z (zero value). I så fall ekar vi ut ett syntaxmeddelande på skärmen och avbryter skriptet.
Bash har en uppsjö tester du kan utföra inom hakparanteser för att bygga den här typen av säkra skript. Du hittar dem på manualsidan för kommandot test genom att skriva ”man test”.
Ibland är det extremt viktigt att kontrollera indata, speciellt om skriptet raderar filer och kataloger. En oinitierad variabel kan leda till att en hel katalogstruktur plötsligt raderas, i stället för en enskild katalog.

Enkelt men kraftfullt. Här har vi byggt ett skript som låter oss ange ett användarnamn som parameter. Det lagras i en My SQL-databas. Skriptet kan byggas på med fler variabler och bättre felkontroll. Behöver du ännu mer kraftfulla funktioner kan vi rekommendera skriptspråket Python.
Så används parametrar
Ibland kan det vara användbart att ange parametrar till ett skript. Det kan vara debug-flaggor, användartyp, kompilatorflaggor och så vidare. Nedanstående kodsnutt går igenom alla argument till skriptet och ser om flaggorna -d och -v är satta.
DEBUG=off
VISIBLE=off
while [ $# -gt 0 ];
do
case ”$1” in
-d ) DEBUG=on;;
-v ) VISIBLE=on;;
-* ) echo >2& ”Error: Okänd parameter $1”; exit 1;;
* ) break;; # Här bryter vi case-loopen
esac
shift
done
Skriptet börjar med att definiera två variabler, DEBUG och VISIBLE. While-slingan använder den interna variabeln $# som innehåller det sista argumentet du angav till ditt skript. Argumentet testas i case-slingan, om det är -d, -v eller ett okänt argument. Om argumentet är okänt ekas ett felmeddelande ut på STDERR genom att vi omdirigerar output till >2&. Efter slingan skiftar vi argumenten till vänster med ”shift” för att kunna testa nästa argument.
En Unixguru skiljer på kod och indata. Om du vill definiera standardvariabler för ditt skript ska du inte ange dem i skriptet. Det blir också snabbt tröttsamt att ange dem som parametrar eller argument till skriptet. Du behöver en konfigurationsfil.
En enkel historia
En konfigurationsfil är en simpel historia, i stort sett bara ett annat skript som definierar en serie variabler. Om ditt skript exempelvis behöver veta rotkatalogen för dina användare och användarnamn, lösenord samt databasnamn för en My SQL-databas, kan du definiera variablerna i filen /etc/default/mitt-skript.conf. Se nedanstående rader:
# Standardvariabler för mitt skript
HEMKATALOG=/home
MYSQL_USER=minanvandare
MYSQL_PASSWORD=mittlosen
MYSQL_DATABASE=mindatabas
Konfigurationsfilen använder du sedan i ditt skript så här:
#!/bin/bash
. /etc/default/mitt-skript.conf
echo ”Hemkatalog: $HEMKATALOG”
echo ”Min Mysql-användare: $MYSQL_USER”
...
Att anropa ett annat skript är inte svårare än att börja med en punkt och sedan ange sökvägen till det. När du använder separata konfigurationsfiler är det än viktigare att lägga in felkontroll i dina skript. Du måste kontrollera att filer existerar, att kataloger är skrivbara och så vidare.

Genom att definiera variabler i en separat fil snyggar du till din kod ytterligare. Du kan även använda samma metod för att definiera funktioner eller exekvera kod i andra skript.
Så skriver du My SQL
Om du vill komma igång med att skripta databasen My SQL kan du pröva följande exempel. Det bygger vidare på föregående exempel, där du har lagrat variabler som användare, lösenord och databas.
Starta My SQL, skapa databasen, ange rättigheter och skapa en testtabell med följande rader:
mysql>CREATE DATABASE mindatabas;
mysql>GRANT ALL PRIVILEGES ON mindatabas.* TO minanvandare@localhost IDENTIFIED BY ’mittlosen’;
mysql>use mindatabas;
mysql>CREATE TABLE profile (fname varchar(64));
Så här ska det sedan se ut i ditt skript. Följande rad lägger in det värde du har sparat i variabeln $NAME i den nyskapade tabellen profile:
echo ”INSERT INTO profile (fname) values (’$NAME’);” | mysql –user=$MYSQL_USER –password=$MYSQL_PASSWORD –database=$MYSQL_DATABASE;
Principen är inte svår. Du börjar med att bygga ett sql-uttryck som du sedan ekar till programmet My SQL. My SQL ansluter sig till den databas du har specificerat i $MYSQL_DATABASE, med tillhörande användaruppgifter. Det är enkelt, men väldigt kraftfullt.

Så här skapar du en My SQL-databas med tillhörande användare och en enkel tabell, direkt från kommandoraden.
Operationer på andra servrar
Det absolut vanligaste verktyget för att administrera andra servrar över kommandoraden är Secure Shell eller ssh. Ssh kan du också använda i dina skript för att starta andra skript eller köra kommandon på dina servrar.
Det du måste lösa är inloggningsförfarandet, eftersom skriptet inte automatiskt kan skicka med användarnamn och lösenord. Bästa lösningen är att använda delade nycklar, som inte är behäftade med något lösenord.
Om du inte har några nycklar börjar du med att generera ett nyckelpar för din användare. Det gör du med kommandot ssh-keygen. Nu ska du ha filerna ~/.ssh/id_rsa och ~/.ssh/id_rsa.pub (~ är Unixspråk för användarens hemmakatalog). Filen id_rsa ska du skydda med ditt liv, eftersom det är den privata nyckeln. Filen id_rsa.pub ska du distribuera ut till alla servrar du tänker administrera. Det är den publika nyckeln.
Ska finnas med i filen
På dina servrar ska id_rsa.pub finns med som en rad i filen ~/.ssh/authorized_keys. Finns inte filen authorized_keys skapar du den enklast genom att skriva ”cat id_rsa.pub >> authorized_keys”. Då skriver du ut innehållet i id_rsa.pub och lägger det sist i filen authorized_keys. Tänk bara på att utföra kommandot i katalogen ~/.ssh/ och se till att din id_rsa.pub finns där.
Nu ska du se till att raden ”PubkeyAuthentication yes” i filen /etc/ssh/sshd_config inte är kommenterad. Behöver du ändra i filen ska du också starta om sshd med kommandot ”/etc/init.d/ssh restart” för att den nya konfigurationen ska börja gälla.
Nu ska du kunna komma åt dina servrar enbart genom att skriva ”ssh ditt-server-namn” från kommandoprompten. Du behöver inte något användarnamn och lösenord, inloggningen sköts med hjälp av ett nyckelutbyte.
Med ”ssh server-namn ditt-kommando” kan du nu starta en process på din server och även använda utdata från kommandot i ditt skript. Det är mycket användbart.
"Demonisera" ditt skript
Ett program eller skript du startar i terminalfönstret kommer automatiskt att dödas i samma ögonblick du stänger av terminalen. Ibland är det inte önskvärt. Det kan handla om när ett stort beräkningsjobb ska köras över natten eller när en större filkopiering från en server till en annan ska göras. I de fallen måste du se till att ditt program fortsätter att köra även efter det att du har stängt terminalfönstret eller har loggat ut från servern där du startade skriptet.
Lösningen finns i kommandot ”nohup”, som står för ”no hangup”. Nohup är enkelt att använda. Skriv ”nohup ditt-skript&” och logga ut från terminalen. Öppnar du ett nytt terminalfönster och slår en ”ps -aux | grep ditt-skript” kommer du att se att processen fortfarande är aktiv.
Nohup fungerar bra, men när ditt skript har nått sista raden kommer det att avslutas. Om du behöver ett skript som alltid är aktivt och alltid utför samma operation kan du lösa det med en while-slinga.
while true
do
echo ”Utför operation”
sleep 5
done
Ovanstående rader startar en oändlig loop som skriver ut ”Utför operation” på bildskärmen. Första raden ”while true” kommer alltid att vara sann och därför kommer loopen inte att sluta förrän processen dödas.
Raden ”echo ”Utför operation”” byter du ut mot det du vill att skriptet ska utföra. Raden ”sleep 5” väntar fem sekunder tills loopen fortsätter och din operation körs på nytt. Det är vettigt att stoppa in ”sleep” för att inte belasta processorn för hårt. Skriptet dödar du genom att skriva ”kill ditt-process-id”.
Vill du registrera vilket process-id ditt skript har fått för att veta vilken process du ska döda kan du lägga in den här raden i skriptet strax innan du startar slingan:
echo $$ > /var/run/$0
Raden ekar ut skriptets process-id taget från variabeln $$ och lagrar det i filen /var/run/ditt-skript, eftersom variabeln $0 byts ut mot det aktuella kommandot. Det är bara användaren root som har rättighet att skriva i katalogen /var/run. Vill du köra ditt skript som en annan användare (rekommenderas) och lagra process-id bör du skapa en katalog under /var/run för ditt skript, där den användaren har skrivrättigheter.

Ett skript med en oändlig slinga är användbart om vi vill slippa använda schemaläggaren cron. Det kan vara bra om tiden skriptet tar att exekvera varierar kraftigt. Här har vi lagt vårt batch-jobb i en separat funktion för att snygga till koden lite.
Titta på andra skript
Ingen blir Unixguru över en natt. Ett tips är att börja bygga mindre skript som du bygger på efter hand. Titta också på hur existerande bash-skript är uppbyggda.
Är du osäker på om en fil är ett skript eller inte har du stor nytta av file-kommandot. Skriver du kommandot ”file fil-du-vill-testa” får du veta vilken typ av fil det är. Du hittar också mängder av små exempel i manualsidan för bash, som du när med ”man bash”.
Bash är extremt kraftfullt och räcker väldigt långt, men när du slår i taket är det dags att titta på skriptspråk som Python.
Illustration: Jonas Englund




















































skript? - (Supportavdelningen) 2010-01-29 15:08
skript? - (gip) 2010-01-29 15:15
skript? - (Supportavdelningen) 2010-01-29 15:18
Basic - (gonace) 2010-01-29 15:26
Mycket läsvärt - (Knappelhoeffen) 2010-01-29 15:43
skript? - (lang999) 2010-01-29 15:45
Äntligen! - (BoP) 2010-01-29 16:01
Guldgruva - (0x90) 2010-01-29 16:07
Äntligen! - (Chucky) 2010-01-29 16:17
äntligen - (7®0//) 2010-01-29 16:38