# 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
1

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:

Mappen & Bestanden

  • /
    • bin/
      • bash
    • home/
      • pi/
        • sh/
          • hello__1.sh
          • hello__2.sh
$ mkdir sh
$ cd sh
$ nano hello__1.sh
#!/bin/bash
# ./sh/hello__1.sh
Hello='hello, world'
echo $Hello
1
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
1
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.'
1
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.'
1
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
1
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
1
2
3
4
5
6
$ ./for.sh 
0
1
2
3
4
5
$ _

# Voorbeeld

Mappen & Bestanden

  • /
    • mijn_project/
      • _data/
      • _includes/
      • css/
        • fonts/
      • docs/
      • 404.md
      • index.md
      • README.md
#!/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
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24

Opmerking

Het new line-teken (\n) wordt in een string pas een echte new line als er een $ voor de string literal staat.

$ ./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
$ _
© 2024 Arteveldehogeschool Laatst bijgewerkt: 14/2/2020, 11:07:52