# Shell Scripting
# Bestand
# Extensie
De bestandsextensie doet er eigenlijk niet toe, maar de extensie .sh
is gebruikelijk en zorgt ervoor dat je teksteditor de juiste codehighlighting toepast.
# Rechten
Een bestand is pas uitvoerbaar als de bestandsmodus rechten voor uitvoeren (Eng. execute) heeft.
Bijvoorbeeld: chmod +x «bestandsnaam»
zorgt ervoor dat iedereen het bestand kan uitvoeren.
# Interpreter
Op de eerste lijn van het scriptbestand moet je de shebang (#!
) zetten waarmee je de interpreter instelt.
#!«pad-naar-interpreter»
Voorbeeld:
#!/bin/bash
In het bovenstaand voorbeeld werd de shell bash
ingesteld, die zich bevindt in de map /bin
.
# Variabelen
# Definiëren
«variabelenaam»='«variabelewaarde»'
# Aanroepen
Je kan een variabele aanroepen door een dollarteken ($
) voor de naam te zetten.
$«variabelenaam»
Voorbeeld:
$ mkdir sh
$ cd sh
$ nano hello__1.sh
#!/bin/bash
# ./sh/hello__1.sh
Hello='hello, world'
echo $Hello
2
3
4
$ chmod +x ./hello__1.sh
$ ./hello__1.sh
hello, world
$ _
# Argumenten
Je kan argumenten meegeven bij het uitvoeren van het script.
Variabele | Betekenis |
---|---|
$0 | De naam van het bestand. |
$1 | Het eerste argument. |
$2 | Het tweede argument. |
… | … |
#!/bin/bash
# ./sh/hello__2.sh
Hello="hello, $1"
echo $Hello
2
3
4
$ chmod +x ./hello__2.sh
$ ./hello__2.sh Olivier
hello, Olivier
$ _
# Conditionals
Expressie | Betekenis |
---|---|
«expressie» && «expressie» | De tweede expressie wordt enkel uitgevoerd als de eerste true is. |
«expressie» || «expressie» | De tweede expressie wordt enkel uitgevoerd als de eerste false is. |
Een conditional wordt tussen vierkante haken ([
en ]
) geschreven.
# Waarden
Expressie | Betekenis |
---|---|
[ -n «string» ] | Is niet leeg (string heeft lengte die groter is dan 0 ). |
[ -z «string» ] | Is leeg (string heeft een lengte van 0 ). |
[ «string-a» = «string-b» ] | Is gelijk aan. |
[ «string-a» != «string-b» ] | Is niet gelijk aan. |
[ «integer-a» -lt «integer-b» ] | Is kleiner dan (Eng. less than). |
[ «integer-a» -eq «integer-b» ] | Is gelijk aan (Eng. equal). |
[ «integer-a» -gt «integer-b» ] | Is groter dan (Eng. greater than). |
# Mappen en Bestanden
Expressie | Betekenis |
---|---|
[ -d «bestand» ] | Bestaat en is een map (Eng. directory). |
[ -e «bestand» ] | Bestaat (Eng. exists). |
[ -s «bestand» ] | Bestand bestaat en is niet leeg. |
[ -r «bestand» ] | Bestand bestaat en heeft leesrechten (Eng. read persmission) |
[ -w «bestand» ] | Bestand bestaat en heeft schrijfrechten (Eng. write permission) |
[ -x «bestand» ] | Bestand bestaat en heeft uitvoerrechten (Eng. execute permission) |
# And
#!/bin/bash
# ./sh/and.sh
echo '1. Test with falsy expression:'
[ 0 = 1 ] && echo $'\tThe expression was falsy.'
echo '2. Test with truthy expression:'
[ 1 = 1 ] && echo $'\tThe expression was truthy.'
2
3
4
5
6
$ ./and.sh
1. Test with falsy expression:
2. Test with truthy expression:
The expression was truthy.
$ _
# Or
#!/bin/bash
# ./sh/or.sh
echo '1. Test with falsy expression:'
[ 0 = 1 ] || echo $'\tThe expression was falsy.'
echo '2. Test with truthy expression:'
[ 1 = 1 ] || echo $'\tThe expression was truthy.'
2
3
4
5
6
$ ./or.sh
1. Test with falsy expression:
The expression was falsy.
2. Test with truthy expression:
$ _
# If-Else
#!/bin/bash
# ./sh/if-else.sh
expression=true
if [ expression ]
then
echo True
else
echo False
fi
2
3
4
5
6
7
8
9
$ ./if-else.sh
True
$ _
# For
#!/bin/bash
# ./sh/for.sh
for i in 0 1 2 3 4 5
do
echo $i
done
2
3
4
5
6
$ ./for.sh
0
1
2
3
4
5
$ _
# Voorbeeld
#!/bin/bash
# ./sh/web_project.sh
echo "Making project $1"
my_working_dir=$PWD
[ -d $1 ] || mkdir $1
cd $1
for d in '_data' '_includes' 'css' 'docs'
do
[ -d $d ] || (echo "Making directory $d" && mkdir $d)
if [ $d = 'css' ]
then
cd $d
my_dir='fonts'
[ -d $my_dir ] || (echo "Making directory $my_dir" && mkdir $my_dir)
cd ..
fi
done
for f in '404.md' 'index.md' 'README.md'
do
echo "Making file $f"
echo $'---\n---' > $f
done
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
$ ./web_project.sh mijn_project
Making project mijn_project
Making directory _data
Making directory _includes
Making directory css
Making directory fonts
Making directory docs
Making file 404.md
Making file index.md
Making file README.md
$ _