Bash shell scripts maken

Op deze pagina:

Je kan scripts maken om dingen te automatiseren, of om moeilijke opdrachten te kunnen uitvoeren zonder dat je alle parameters hoeft in te typen of te houden.

In een script kan je ook commentaarregels toevoegen als documentatie over de werking van het script.

Een bestand uitvoerbaar maken

Om een tekstbestand als script te kunnen uitvoeren, moet je het uitvoerbaar maken:


# een nieuw bestand maken met de naam: mijnscript.sh
touch mijnscript.sh

# eXecute aanzetten op het bestand om het uitvoerbaar te maken: 
chmod +x mijnscript.sh

Het script kan uitgevoerd worden als je in de directory van het script bent door de naam van het script vooraf te laten gaan door ./ om te zorgen dat er in de huidige directory naar het script gezocht wordt.


./mijnscript.sh

Zolang het script nog leeg is, zal het niets doen.

Commentaar toevoegen in een script

Commentaar in een script is een opmerking ter verduidelijking van wat het script doet. Het commentaar wordt niet uitgevoerd. Commentaar is ook voor jezelf bedoeld, als je later het script wil aanpassen, helpt het commentaar je te begrijpen wat het script precies doet.

Je maakt een regel een commentaar regel door er een hekje (#) voor te zetten.


#!/bin/bash
# dit is een commentaar regel
tekst="Hallo Wereld"
echo $tekst

Shebang #! regel als eerste regel in het script

De #!/bin/bash is commentaar, maar het heeft ook een andere functie als het in de eerste regel van een script staat. Het vertelt de computer welke shell gebruikt moet worden.

Bash is de meeste gebruikte shell, maar er zijn ook andere:


#!/bin/sh

#!/bin/ksh

#!/bin/dash

Als het script voor meerdere shells geschikt moet zijn, dan kan je dit gebruiken:


# voor een algemene shell:

#!/usr/bin/env sh


# voor alleen bash:

#!/usr/bin/env bash

Uitvoer naar het scherm met echo en printf

Gegevens op het scherm zetten kan met echo en met printf.

Het verschil tussen echo en printf is dat je met printf ook tekst kunt formatteren, vandaar de f.


# gewoon iets achter elkaar op het scherm zetten:
echo hallo wereld

# hetzelfde, maar nu geformatteerd met \n voor nieuwe regels
printf "hallo\nwereld\n"
# hallo en wereld komen nu op afzonderlijke regels te staan

Variabelen

Ja kan variabelen maken door een naam van een variabele via een = teken een waarde te geven. Er mag net voor en net na het = teken geen spatie staan.


MIJN_VARIABELE="mijn waarde"

Om de waarde van een variabele te gebruiken, moet je een dollarteken voor de naam van de variabele plaatsen:


MIJN_KLEUR="rood"
echo $MIJN_KLEUR
# geeft: rood

echo "Mijn kleur is $MIJN_KLEUR"
# geeft: Mijn kleur is rood

# een variabele in een variabele:
KLEUR="Mijn kleur is $MIJN_KLEUR"
echo $KLEUR
# geeft: Mijn kleur is rood

Je mag de naam van de variabele ook tussen accolades plaatsen:


KLEUR="Mijn kleur is ${MIJN_KLEUR}"
echo $KLEUR
# geeft: Mijn kleur is rood

Als je accolades gebruikt, dan mag je ook defaultwaarden meegeven:


PEN_KLEUR=""
PEN="${PEN_KLEUR:-rood}"
echo $PEN
# geeft: rood

Ook dit kan weer genest worden:


PEN_KLEUR=""
STANDAARD_PEN="rood"
MIJN_PEN_KLEUR="De kleur van mijn pen is ${PEN_KLEUR:-$STANDAARD_PEN}"
echo $MIJN_PEN_KLEUR

# geeft: De kleur van mijn pen is rood

Environment variabelen kunnen in een script op dezelfde manier gebruikt worden als gewone scriptvariabelen. Op deze manier kan je buiten een script om al een variabele instellen en die dan gebruiken in je script.

Strings samenvoegen

Je kan variabelen samenvoegen door ze simpelweg achter elkaar te plaatsen:


VAR1="Hallo,"
VAR2=" Wereld"
VAR3="$VAR1$VAR2"
echo "$VAR3"

Resultaat:


Hallo, Wereld

Je kan variabelen ook samenvoegen in een tekst:


VAR1="Hallo,"
VAR2="${VAR1}Wereld"
echo "$VAR2"

Resultaat:


Hallo, Wereld

In bovenstaand voorbeeld staat de variabele VAR1 tussen dollarteken en gekrulde haken om deze af te scheiden van de omliggende letters.

Om te zorgen dat een variabele vervangen wordt door de waarde van de variabele, moet je deze tussen dubbele aanhalingstekens plaatsen. Als je juist niet wilt dat de variabele wordt vervangen door de waarde van de variabele, maar de variabelenaam in je uitvoer wil hebben, dan kan je enkele aanhalingstekens gebruiken.

Bash maakt geen onderscheid tussen types variabelen, variabelen die alleen cijfers bevatten kunnen ook met tekst worden samengevoegd.

Strings samenvoegen met +=

Met += kan je ook strings aan elkaar plakken:


VAR1="Hallo, "
VAR1+=" Wereld"
echo "$VAR1"

Resultaat:


Hallo, Wereld

Je kan ook een loop gebruiken om meerdere strings aan elkaar te plakken met +=:


VAR=""
for KLEUR in 'Rood' 'Groen' 'Blauw' 'Geel'; do
  VAR+="${KLEUR} "
done

echo "$VAR"

Resultaat:


Rood Groen Blauw Geel

Letters tellen van een string variabele

Het aantal tekens tellen van een variabele die een string bevat kan met # voor de naam van de variabele:


KLEUR=blauw
echo ${#KLEUR}
# dit geeft: 5

KLEUR=rood
echo ${#KLEUR}
# dit geeft: 4

KLEUR="groen en geel"
echo ${#KLEUR}
# dit geeft: 13

Beslissingen nemen met if then else elif

Een conditie testen en op basis daarvan een aantal opdrachten wel of niet uitvoeren kan met if-blokken. De algemene syntax hiervan:


#if then
if [[ conditie ]]
then
  opdrachten
fi

#if else
if [[ conditie ]]
then
  opdrachten
else
  opdrachten
fi

#if elseif else
if [[ conditie ]]
then
  opdrachten
elif [[ conditie ]]
then
  opdrachten
else
  opdrachten
fi

De condities bestaan uit vergelijkingen:

groter dan

In veel programmeertalen wordt > gebruikt, maar dat is in Bash een redirect teken, in Bash wordt -gt gebruikt:


if [[ ${#KLEUR} -gt 3 ]] 
then
echo "$KLEUR heeft meer als 3 letters"
fi

groter of gelijk aan

Groter of gelijk aan kan met -ge worden getest:


if [[ ${#KLEUR} -ge 3 ]] 
then
echo "$KLEUR heeft minstens 3 letters"
fi

kleiner dan

Voor kleiner dan wordt -lt gebruikt:


if [[ ${#KLEUR} -lt 3 ]] 
then
echo "$KLEUR heeft minder als 3 letters"
fi

kleiner of gelijk aan

Voor kleiner of gelijk aan wordt -le


if [[ ${#KLEUR} -le 3 ]] 
then
echo "$KLEUR heeft maximaal 3 letters"
fi

gelijk aan

Gelijk aan wordt getest met = gebruikt voor het vergelijken van tekst:


if [[ $KLEUR = "rood" ]]
then
echo "rood is de kleur"
fi

Voor het vergelijken van getallen wordt eq gebruikt:


if [[ ${#KLEUR} = 4 ]]
then
echo "$KLEUR heeft 4 letters"
fi

ongelijk aan

Ongelijk aan wordt getest met !=:


if [[ $KLEUR != "rood" ]]
then
echo "rood is niet de kleur"
fi

bevat

Via het wildcard karakter * kan je testen of een string een andere string bevat:


if [[ "blauw" = *"auw"* ]]
then
echo "auw zit in blauw" 
fi

groter dan nul

Testen op groter dan nul kan met -n:


if [[ -n $KLEUR ]]
then
echo "$KLEUR heeft meer letters als 0"
fi

gelijk aan nul

Testen op gelijk aan nul kan met -z:


if [[ -z $KLEUR ]]
then
echo "KLEUR is leeg"
else
echo "$KLEUR heeft meer letters als 0"
fi

Parameters via de commandline

Als je een script aanroept, dan kan je via de opdrachtregel parameters meegeven die het script als invoer kan gebruiken.

De variabele die het aantal parameters bevat dat is meegegeven bij het aanroepen van het script is $#.

De parameters zelf kan je opvragen via $ met een volgnummer, zoals $1, $2, $3 etc.

Met de opdracht shift kan je de paramaters laten opschuiven zodat $2 naar $1 gaat, $3 naar $2, etc.

Als je een cijfer meegeeft aan shift, dan schuiven de parameters meerdere plaatsen op, afhankelijk van dat meegegeven cijfer.


#!/bin/bash
# dit script somt de argumenten op die je meegeeft op de commandline

echo "het aantal argumenten is: $#"

while [[ $# -gt 0 ]]
do
    argument="$1"
    echo ": $argument"
    shift
done

Voorbeeld uitvoer:


$ argumenten.sh kees 129,7 "rood en blauw"
het aantal argumenten is: 6
: kees
: 129,7
: rood en blauw

Benoemde parameters gebruiken

Als je meerdere parameters kan meegeven is het handig als ze benoemd zijn, dan maakt de volgorde waarin ze worden meegegeven niet meer uit.


#!/bin/bash
# voorbeeld met benoemde parameters

echo "het aantal argumenten is: $#"

# benoemde parameters toekennen aan variabelen
# naam meegeven met -n of --naam
# kleur meegeven met -k of --kleur
# leeftijd meegeven met -l of --leeftijd

while [[ $# -gt 0 ]]
do
argument="$1"
case $argument in
    # -n of --naam
    -n|--naam)
        NAAM="$2"   # de waarde is het volgende argument
        shift 2
    ;;
    # -k of --kleur
    -k|--kleur)
        KLEUR="$2"   # de waarde is het volgende argument
        shift 2
    ;;
     # -l of --leeftijd
    -l|--leeftijd)
        LEEFTIJD="$2"   # de waarde is het volgende argument
        shift 2
    ;;   
    # onbekende optie
    *)
        echo "Onbekend argument: $argument"
        shift # overslaan
    ;;
esac
done

echo "Naam: $NAAM"
echo "Kleur: $KLEUR"
echo "Leeftijd: $LEEFTIJD"

Voorbeeld uitvoer:


$ argumenten.sh -n kees -l 129,7 -k "rood en blauw"
het aantal argumenten is: 6
Naam: kees
Kleur: rood en blauw
Leeftijd: 129,7

String uitvoeren als opdracht met eval

Net zoals in veel andere programmeertalen, kan je ook in Bash de gevaarlijke opdracht eval gebruiken om een string uit te voeren als opdracht.


BESTAND="voorbeeld.txt"
DOEL="~/test/"
OPDRACHT="cp $BESTAND $DOEL"
eval $OPDRACHT

Bash shell scripts zelf functies maken

De inhoud van een functie wordt tussen accolades geplaatst. De parameters worden opvraagbaar via het dollarteken met een volgnummer. Het aantal meegegeven parameters is op te vragen met $#.

Met shift schuif je de argumenten een plaats op, $2 wordt $1, $3 wordt $2, etc.


#!/bin/bash

# functie argumentenlijst:
argumentenlijst(){
    echo "het aantal argumenten is: $#"
    while [[ $# -gt 0 ]]
    do
        argument="$1"
        echo ": $argument"
        shift
    done
}

# functie argumentenlijst uitvoeren
argumentenlijst rood blauw groen geel

Voorbeeld uitvoer:


$ functie.sh
het aantal argumenten is: 4
: rood
: blauw
: groen
: geel

Bash opdracht gebruiken in een functie met command

Via command kan je ook Bash opdrachten in je functie gebruiken:


#!/bin/bash
# Bash command in een functie gebruiken

datum(){
    command date +"%d %b %Y"
}

datum

Bash scripts aanvullen met Python en Perl

In Bash scripts kan je ook andere scripttalen gebruiken, waaronder Python en Perl.Voor Python is de algemene formule:


python3 -c ""

Voor Perl is de algemene formule:


perl -e ""

Tussen de dubbele aanhalingstekens komt dan het stukje Python of Perl dat uitgevoerd moet worden. Hierbij moeten eventuele dubbele quotes die hierin voorkomen (en bijvoorbeeld ook dollartekens) ge-escaped worden met backslashes.

Voorbeelden:


# Voor Python3 gebruik je de -c parameter
python3 -c "print( \"Hallo wereld.\")"

# resultaat:
Hallo wereld.

# Voor Perl gebruik je de -e paramater
perl -e "print \"Hallo wereld.\n\""

# resultaat:                                                     
Hallo wereld.

# de uitvoer kan ook naar een bestand worden gestuurd:
python3 -c "print( \"Hallo wereld.\")" > tekst.txt

# of eerst nog via een pipe naar een andere Bash-opdracht:
python3 -c "print( \"Hallo wereld.\")" | cat > tekst.txt

# je kunt de uitvoer ook toewijzen aan een Bash-variabele:
BOODSCHAP=$(python3 -c "print( \"Hallo wereld.\")")
echo $BOODSCHAP

# resultaat:
Hallo wereld.

# de variabele weer gebruiken in Python3:
export BOODSCHAP
python3 -c "print(\"$BOODSCHAP\")"

# resultaat:
Hallo wereld.

 

Verwante artikelen