Shell scripting (bash)
Et shell-script er en tekstfil med en liste over shell-kommandoer, og det udføres som et program for at udføre en opgave eller et sæt opgaver. Det primære formål med et shellscript er at automatisere opgaver og spare tid. Det er vigtigt at forstå den grundlæggende struktur af et shellscript, da det er du interagerer med en computerklynge via shellscripts (Se næste kapitel om Grid Engine)
Hvad er Bash?
Der er mange forskellige shells til rådighed i Unix-lignende systemer. Bourne Again Shell (Bash) er en af dem, og det er standardshell på GNU/Linux-systemer. Den har nogle fordele i forhold til andre shells og er stort set standardshell, og vi vil nedenfor vise, hvordan man bruger den til scripting.
Skrivning af et simpelt bash-shell-script
Et grundlæggende shell-script er blot en række kommandoer. Det er det, vi vil vise næste gang.
Lad os skrive et simpelt script, der udsender “hello world” på skærmen ved hjælp af kommandoen echo
. Vi gemmer tekstfilen som myScript.sh
#!/bin/bash echo Hello World
udførelse af et shellscript syntaks:bash your-script-name
. I vores tilfælde skriver vi:
$ bash myScript.sh Hello World
mere kompliceret eksempel
Lad os skrive et lidt mere kompliceret script ved hjælp af flere af shell-kommandoerne. Scriptet bruger ls
til at liste filerne og bruger wc -l
-kommandoen, som tæller antallet af linjer i en given fil eller standardinput. I dette tilfælde tæller wc -l
antallet af linjer i output fra ls -l
. Alt dette opnås ved at bruge pipe |
.
Indholdet af script.sh:
#!/bin/bash echo here are the list of files ls -l echo The number of files: ls -l | wc -l
Vi kan udføre det på følgende måde:
$ bash script.sh
Variabler i bash-scripts
Du kan også bruge variabler i bash-scripts. Som er nyttige til at opfange output af mellemliggende kommandoer og bruge dem til at køre andre kommandoer.Der er ingen datatyper for variabler. En variabel i bash kan indeholde et af følgende: et tal, et tegn eller en streng af tegn.
Du behøver ikke at deklarere en variabel, det er blot at tildele en værdi til dens reference, så oprettes den.
Nu vil vi oprette et simpelt script med én variabel. Vi tildeler Hello world
strengen til denne variabel og udskriver denne variabel med echo
.
#!/bin/bash VAR="Hello world" echo $VAR
Ved tildelingen af variablen brugte vi ikke $
tegnet, men ved brugen af variablen skulle vi bruge $
tegnet.
Kommandolinjeargumenter i bash-scripts
Scriptet kan også tage imod kommandolinjeargumenter. Her ændrer vi scriptet, der oplister filen, til at tage et kommandolinjeargument. Argumentet vil være en sti til en mappe.
Indholdet af 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
Sådan kører du scriptet:
$ bash script2.sh /home/user/project
Argumenterne gemmes i variabler med et nummer i argumentets rækkefølge begyndende ved 1
- Første argument: $1
- Næste argument: $2
- og så videre…
I vores tilfælde svarer til
/home/user/project
.
Aritmetiske operationer bash-scripts
Aritmetiske operationer på hele tal i bash udføres i følgende format:
#!/bin/bash x=6 y=2 $((10 - 5)) $((x-y)) echo $((x-y)) echo $((10-5))
Du kan også kopiere og indsætte disse kommandoer i konsollen for at se, hvordan de virker. echo
-kommandoerne bør output 4
og 5
.
Bash-aritmetik understøtter ikke flydende punkter (f.eks. vil operationen 1,3 -1 ikke fungere i bash), du skal bruge bc
-kommandoen. Se dette stackOverflow-eksempel for et eksempel på, hvordan du bruger bc
.
Looping over filer
Hvis du forsøger at automatisere en opgave ved hjælp af bash-scripting, er det meget sandsynligt, at du skal anvende visse kommandoer på hver enkelt fil i en mappe. Dette kan opnås med wild character*
og for
loops. Følgende script gemmer alle ‘.txt’-filer i /path/to
-mappen i FILES
-variablen. Derefter beregner det for hver fil antallet af linjer og udsender det med kommandoen 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
Mere om bash-scripts
Du kan skrive endnu mere komplicerede shell-scripts ved hjælp af kontrolstrukturer (if/else, for/while-sløjfer) og opnå meget bare ved hjælp af shell-scripting, men det ligger uden for dokumentets rækkevidde. Se nedenstående links, hvis du vil blive bedre til at skrive shell-scripts.
- http://www.freeos.com/guides/lsst/
- http://www.tldp.org/LDP/Bash-Beginners-Guide/html/