Shell scripting (bash)
Een shell script is een tekst bestand met een lijst van shell commando’s en het wordt uitgevoerd als een programma om een taak of een set van taken uit te voeren. Het primaire doel van een shellscript is om taken te automatiseren en tijd te besparen. Het is belangrijk om de basisstructuur van een shellscript te begrijpen, omdat je met een computercluster communiceert via shellscripts (zie het volgende hoofdstuk over Grid Engine)
wat is Bash ?
Er zijn veel verschillende shells beschikbaar in Unix-achtige systemen. De Bourne Again Shell (Bash) is er een van, het is de standaard shell op GNU/Linux systemen. Het heeft enkele voordelen ten opzichte van andere shells en is zo’n beetje de standaard shell, en we zullen hieronder laten zien hoe je hem kunt gebruiken voor scripting.
Het schrijven van een eenvoudig bash shell script
Een basis shell script is gewoon een serie commando’s. Dat is wat we nu zullen laten zien.
Laten we een eenvoudig script schrijven dat “hello world” op het scherm weergeeft met behulp van het echo
commando. We zullen het tekstbestand opslaan als myScript.sh
#!/bin/bash echo Hello World
het uitvoeren van een shellscript syntaxis:bash your-script-name
. In ons geval schrijven we:
$ bash myScript.sh Hello World
meer gecompliceerd voorbeeld
Laten we een wat gecompliceerder script schrijven waarbij we meer van de shell commando’s gebruiken. Het script gebruikt ls
om een lijst met bestanden te maken en het wc -l
commando telt het aantal regels in een bepaald bestand of standaard input. In dit geval telt wc -l
het aantal regels in de uitvoer van ls -l
. Dit alles wordt bereikt door gebruik te maken van pipe |
.
inhoud van script.sh:
#!/bin/bash echo here are the list of files ls -l echo The number of files: ls -l | wc -l
We kunnen het als volgt uitvoeren:
$ bash script.sh
variabelen in bash scripts
Je kunt ook variabelen gebruiken in bash scripts. Die zijn handig om de uitvoer van tussenliggende commando’s op te vangen en te gebruiken om andere commando’s uit te voeren.Er zijn geen datatypes voor variabelen. Een variabele in bash kan het volgende bevatten: een getal, een teken of een tekenreeks.
U hoeft een variabele niet te declareren, alleen maar een waarde toewijzen aan de referentie zal deze creëren.
Nu zullen we een eenvoudig script maken met één variabele. We zullen een string Hello world
toewijzen aan die variabele en die variabele afdrukken met echo
.
#!/bin/bash VAR="Hello world" echo $VAR
Bij het toewijzen van de variabele hebben we het $
teken niet gebruikt, maar bij het gebruik van de variabele moesten we het $
teken gebruiken.
command line argumenten in bash scripts
Het script kan ook command line argumenten aannemen. Hier wijzigen we het script dat het bestand opsomt om een commandoregel argument te nemen. Het argument zal een pad naar een directory zijn.
inhoud van 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
Hier ziet u hoe u het script uitvoert:
$ bash script2.sh /home/user/project
De argumenten worden opgeslagen in variabelen met een nummer in de volgorde van het argument, beginnend bij 1
- Eerste Argument: $1
- Tweede Argument: $2
- enzovoort…
In ons geval komt overeen met
/home/user/project
.
Aritmetische bewerkingen bash scripts
Aritmetische bewerkingen op gehele getallen in bash worden gedaan in het volgende formaat:
#!/bin/bash x=6 y=2 $((10 - 5)) $((x-y)) echo $((x-y)) echo $((10-5))
U kunt deze commando’s ook kopiëren en in de console plakken om te zien hoe ze werken. De echo
commando’s zouden 4
en 5
moeten uitvoeren.
Bash rekenkunde ondersteunt geen drijvende punten (bijvoorbeeld 1.3 -1 operatie zal niet werken in bash), u moet bc
commando gebruiken. Zie dit stackOverflow voorbeeld voor een voorbeeld van hoe bc
te gebruiken.
Looping over bestanden
Als u een taak probeert te automatiseren met bash scripting, is het zeer waarschijnlijk dat u bepaalde commando’s moet toepassen op elk bestand in een directory. Dit kan worden bereikt met wild character*
en for
loops. Het volgende script slaat alle ‘.txt’ bestanden in /path/to
directory op in FILES
variabele. Vervolgens berekent het voor elk bestand het aantal regels en voert dat uit met wc -l
commando.
#!/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
Meer over bash scripts
Je kunt nog meer ingewikkelde shell scripts schrijven door gebruik te maken van controle structuren (if/else, for/while loops) en veel bereiken met shell scripting, maar dat valt buiten het bereik van dit document. Zie de links hieronder als u beter wilt worden in het schrijven van shell scripts.
- http://www.freeos.com/guides/lsst/
- http://www.tldp.org/LDP/Bash-Beginners-Guide/html/