Tips en Trucs 2024

Bash Script Loops

Loops in Bash bieden een krachtige en flexibele manier om lijsten te doorlopen, berekeningen uit te voeren en opdrachten uit te voeren op basis van specifieke voorwaarden. Door Bash-scriptlussen te gebruiken, kun je efficiënte en leesbare scripts schrijven die tijd en moeite besparen bij het beheren van complexe systemen en processen.

Loops zijn handig in Bash-scripts voor het automatiseren van repetitieve taken en het stroomlijnen van workflows. Een for lus kan bijvoorbeeld worden gebruikt om meerdere bestanden tegelijk te hernoemen, terwijl een while lus kan worden gebruikt om de status van een proces te controleren en te blijven controleren totdat deze is voltooid. Een until lus kan worden gebruikt om een taak herhaaldelijk uit te voeren totdat aan een specifieke voorwaarde is voldaan, zoals het instellen van een internetverbinding.

Voorwaardelijke instructies kunnen worden gebruikt met lussen om meer controle aan Bash-scripts toe te voegen. Een for lus kan bijvoorbeeld worden gebruikt om een lijst met bestanden te doorlopen en te controleren of elk bestand een specifieke tekenreeks bevat. Als de tekenreeks wordt gevonden, kan het script een taak op het bestand uitvoeren. Door taken met lussen te automatiseren, kunnen ontwikkelaars tijd besparen, de efficiëntie verbeteren en de kans op fouten verkleinen.

Hier is een voorbeeld van een Bash script dat voorwaardelijke instructies met lussen gebruikt om tekst in een bestand te zoeken en te vervangen:

#!/bin/bash

# Vraag de gebruiker naar de bestandsnaam en de zoekterm
read -p "Voer de bestandsnaam in: " file_name
read -p "Voer de zoekterm in: " search_term

# Controleer of het bestand bestaat.
if [ ! -f $file_name ]; then
    echo "Bestand niet gevonden"
    exit 1
fi

# Loop door het bestand en vervang de zoekterm door een nieuwe waarde
while read line
do
    if [[ $line == *"$search_term"* ]]; then
        # Vervang de zoekterm door een nieuwe waarde
        new_line=${line//$search_term/nieuwe_waarde}
        echo $new_line
    else
        echo $line
    fi
done < $file_name

In dit script wordt de gebruiker gevraagd om de naam van een bestand en een zoekterm in te voeren. Het script controleert of het bestand bestaat en doorloopt dan elke regel van het bestand. Voor elke regel controleert het script of de regel de zoekterm bevat met behulp van een if-instructie. Als de regel de zoekterm bevat, vervangt het script de zoekterm door een nieuwe waarde en wordt de nieuwe regel afgedrukt. Als de regel de zoekterm niet bevat, drukt het script de originele regel af.

Om het script te testen, gebruiken we een testbestand test.txt met de volgende vier woorden:

dany@pindabook:~$ cat test.txt 
linux
bash
script
niets

En voeren het script uit:

dany@pindabook:~$ bash zoek.sh 
Voer de bestandsnaam in: test.txt
Voer de zoekterm in: niets
linux
bash
script
nieuwe_waarde
loops

Dit is slechts één voorbeeld van hoe voorwaardelijke instructies gebruikt kunnen worden met lussen in Bash scripts om krachtigere en flexibelere scripts te maken.

For-lussen zijn handig voor het doorlopen van een lijst met items. Een voorbeeld van hoe for-lussen kunnen worden gebruikt, is om het verwerken van bestanden te automatiseren. Je hebt bijvoorbeeld een map met verschillende bestanden die verwerkt moeten worden. Met een for-lus kun je elk bestand itereren en op elk bestand dezelfde taak uitvoeren.

for file in *.txt; do
  cp "$file" "${file%.txt}.doc"
done

In dit voorbeeld itereert de for-lus alle bestanden met de extensie .txt en kopieert (cp) (om te hernoemen gebruik je mv) elk bestand door de extensie te wijzigen in .doc.

While-lussen zijn handig als je een specifieke taak herhaaldelijk moet uitvoeren totdat aan een bepaalde voorwaarde is voldaan. Het kan bijvoorbeeld nodig zijn om de status van een proces te monitoren en door te gaan met monitoren totdat het voltooid is.

while ps -p 1234 >/dev/null; do
    sleep 1
done

In dit voorbeeld blijft de while-lus de sleep opdracht uitvoeren totdat het proces met ID 1234 is voltooid.

Until-lussen zijn handig als je een taak herhaaldelijk moet uitvoeren totdat aan een specifieke voorwaarde is voldaan. Een voorbeeld van hoe until loops kunnen worden gebruikt, is om te controleren of er een internetverbinding is.

until ping -c 1 google.com; do
  sleep 5
done

In dit voorbeeld blijft de until lus de ping opdracht uitvoeren totdat er een internetverbinding tot stand is gebracht.

Bash-lussen kunnen worden gebruikt in combinatie met andere opdrachten om krachtige en complexe scripts te maken. Hier zijn enkele voorbeelden van hoe Bash-lussen kunnen worden gebruikt in combinatie met andere opdrachten.

Sed is een krachtige teksteditor die kan worden gebruikt om tekstverwerkingstaken uit te voeren, zoals het zoeken en vervangen van tekst in bestanden. Bash loops kunnen met sed gebruikt worden om dezelfde taak op meerdere bestanden uit te voeren.

for file in *.txt; do
  sed -i 's/zoek/vervang/g' "$file"
done

In dit voorbeeld wordt de for-lus gebruikt om alle bestanden met de extensie .txt te doorlopen en wordt de sed opdracht gebruikt om alle instanties van zoek te vervangen door vervang.

Awk is een tekstverwerkingsprogramma dat gebruikt kan worden om gegevens uit bestanden te halen en te manipuleren. Bash loops kunnen met awk gebruikt worden om meerdere bestanden te verwerken.

for file in *.txt; do
  awk '{ print $1 }' "$file" > "$file.out"
done

In dit voorbeeld wordt de for-lus gebruikt om alle bestanden met de extensie .txt te doorlopen en wordt de awk opdracht gebruikt om de eerste kolom uit elk bestand te halen en deze uit te voeren naar een nieuw bestand.

Grep is een opdracht dat kan worden gebruikt om naar specifieke tekst in bestanden te zoeken. Bash loops kunnen gebruikt worden met grep om te zoeken naar tekst in meerdere bestanden.

for file in *.log; do
  grep "error" "$file"
done

In dit voorbeeld wordt de for-lus gebruikt om alle bestanden met de extensie .log te doorlopen en wordt de grep opdracht gebruikt om in elk bestand naar het woord error te zoeken.

Opruimen

Enkel de voor deze tip gebruikte testbestanden en scripts, verwijderen we met:

dany@pindabook:~$ rm test.doc test.txt test.txt.out voorbeeld.sh zoek.sh