web2 logo

Artikel Links Notities

Bash shell scripts maken

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. ./script 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.

naar boven

term zoeken

Notitieruimte