Shell scripting (bash)
Ett shell script är en textfil med en lista över shell-kommandon som körs som ett program för att utföra en uppgift eller en uppsättning uppgifter. Det primära syftet med ett skalskript är att automatisera uppgifter och spara tid. Det är viktigt att förstå den grundläggande strukturen för ett skalskript, eftersom det är du som interagerar med ett datorkluster via skalskript (se nästa kapitel om Grid Engine)
Vad är Bash?
Det finns många olika skalskript tillgängliga i Unix-liknande system. Bourne Again Shell (Bash) är en av dem och är standardskalet i GNU/Linux-system. Det har vissa fördelar jämfört med andra skal och är i stort sett standardskalet, och vi kommer att visa hur man använder det för skript nedan.
Skriva ett enkelt bash-skalskript
Ett grundläggande skalskript är bara en serie kommandon. Det är vad vi kommer att visa härnäst.
Låt oss skriva ett enkelt skript som skriver ut ”hello world” på skärmen med hjälp av kommandot echo
. Vi sparar textfilen som myScript.sh
#!/bin/bash echo Hello World
Exekvering av ett skalskript syntax:bash your-script-name
. I vårt fall skriver vi:
$ bash myScript.sh Hello World
mer komplicerat exempel
Låt oss skriva ett lite mer komplicerat skript som använder fler av skalkommandona. Skriptet använder ls
för att lista filerna och använder kommandot wc -l
som räknar antalet rader i en viss fil eller standardinmatning. I det här fallet räknar wc -l
antalet rader i utdata från ls -l
. Allt detta uppnås genom att använda pipe |
.
innehållet i script.sh:
#!/bin/bash echo here are the list of files ls -l echo The number of files: ls -l | wc -l
Vi kan exekvera det på följande sätt:
$ bash script.sh
variabler i bash-skript
Du kan också använda variabler i bash-skript. Vilka är användbara för att fånga upp utdata från mellanliggande kommandon och använda dem för att köra andra kommandon.Det finns inga datatyper för variabler. En variabel i bash kan innehålla något av följande: ett nummer, ett tecken eller en teckensträng.
Du behöver inte deklarera en variabel, det räcker att tilldela ett värde till dess referens för att skapa den.
Nu ska vi skapa ett enkelt skript med en variabel. Vi kommer att tilldela Hello world
sträng till den variabeln och skriva ut variabeln med echo
.
#!/bin/bash VAR="Hello world" echo $VAR
När vi tilldelade variabeln använde vi inte $
tecknet, men när vi använde variabeln var vi tvungna att använda $
tecknet.
kommandoradsargument i bash-skript
Skriptet kan också ta emot kommandoradsargument. Här ändrar vi skriptet som listar filen för att ta emot ett kommandoradsargument. Argumentet kommer att vara en sökväg till en katalog.
innehållet i script2.sh:
#!/bin/bash VAR= echo here are the list of files ls -l $VAR echo The number of files: ls -l $VAR | wc -l
Här är hur du kör skriptet:
$ bash script2.sh /home/user/project
Argumenten lagras i variabler med ett nummer i argumentens ordning med början vid 1
- Första argumentet:
- Tvått argument: $2
- och så vidare…
I vårt fall motsvarar
/home/user/project
.
Aritmetiska operationer bash-skript
Aritmetiska operationer på heltal i bash görs i följande format:
#!/bin/bash x=6 y=2 $((10 - 5)) $((x-y)) echo $((x-y)) echo $((10-5))
Du kan också kopiera och klistra in dessa kommandon i konsolen för att se hur de fungerar. Kommandona echo
bör ge ut 4
och 5
.
Bash aritmetik har inte stöd för flyttal (t.ex. fungerar inte operationen 1,3 -1 i bash), du måste använda kommandot bc
. Se det här stackOverflow-exemplet för ett exempel på hur du använder bc
.
Looping over files
Om du försöker automatisera en uppgift med hjälp av bash-skript är det mycket troligt att du måste tillämpa vissa kommandon på varje fil i en katalog. Detta kan åstadkommas med vilda tecken*
och for
slingor. Följande skript lagrar alla ’.txt’-filer i katalogen /path/to
i variabeln FILES
. För varje fil beräknar det sedan antalet rader och matar ut det med kommandot wc -l
.
#!/bin/bash FILES=/path/to/*.txt for f in $FILES do echo "Processing $f file..." # count number of lines and output that for file $f wc -l $f done
Mer om bash-skript
Du kan skriva ännu mer komplicerade skalskript med hjälp av kontrollstrukturer (if/else-, for/while-slingor) och åstadkomma en hel del bara med hjälp av skalskriptet, men det ligger utanför dokumentets räckvidd. Se länkarna nedan om du vill bli bättre på att skriva skalskript.
- http://www.freeos.com/guides/lsst/
- http://www.tldp.org/LDP/Bash-Beginners-Guide/html/