Tips en Trucs 2024

Opdrachten in variabelen

Nadat je een Linux-opdracht hebt opgeslagen als een variabele in een shell-script, kan je deze overal in het script gebruiken door de naam van de variabele in plaats van de opdracht te typen.

Je kunt de variabele bijvoorbeeld gebruiken om een opdracht op te slaan die een aangepaste datumnotatie afdrukt en deze vervolgens gebruiken wanneer dit in het script nodig is door de naam van de variabele te gebruiken.

Maar hoe kunnen we deze variabelen gebruiken om verschillende opdrachten in het script uit te voeren? Het antwoord is eenvoudig: we kunnen de functie opdrachtsvervanging (command substitution) en de variabelen gebruiken om opdrachten uit het script uit te voeren.

Laten we dus eens kijken hoe we opdrachtvervanging kunnen gebruiken om opdrachten uit te voeren in het script en de uitvoer van die opdrachten in de variabelen te gebruiken.

Opdrachtsvervanging (command substitution)

Met opdrachtsvervanging kunnen we een opdracht in een variabele opslaan en vervolgens in het script uitvoeren door simpelweg naar de variabele naam te verwijzen, en dit kan worden bereikt met behulp van een speciale syntaxis.

Met opdrachtsvervanging kunnen we dus de uitvoer van een opdracht in een variabele opslaan en deze later in het script gebruiken.

Voorbeelden

Om deze syntaxis te demonstreren, kunnen we een voorbeeld bekijken waarbij we het aangepaste tijdformaat in uur, minuten en seconden afdrukken en na de succesvolle uitvoering dezelfde opdracht kort daarna uitvoeren.

dany@pindabook:~$ now=$('date' '+%H:%M:%S')
dany@pindabook:~$ echo "Het is nu $now"
Het is nu 15:48:42

Maak nu een scriptbestand met jouw favoriete teksteditor (nano in het voorbeeld):

dany@pindabook:~$ nano voorbeeld.sh

En typ de volgende opdrachtregels in.

#!/bin/bash
now=$('date' '+%H:%M:%S')
echo "Het is nu $now"

Sla het script op en verlaat de teksteditor. Je maakt het script uitvoerbaar met:

dany@pindabook:~$ chmod +x voorbeeld.sh

En testen het door het uit te voeren:

dany@pindabook:~$ ./voorbeeld.sh 
Het is nu 15:56:55

Als je wat complexiteit wilt toevoegen aan de variabele gegevens, kan je de resultaten van een opdracht naar een andere opdracht doorsturen en het resultaat opslaan in een variabele.

Als je bijvoorbeeld de opdrachtuitvoer van de ls opdracht aan de grep opdracht wilt doorgeven om een telling van alle html-bestanden in een map te krijgen, kan je de volgende opdracht gebruiken:

dany@pindabook:~$ aantal_bestanden=$(ls ~/Documenten/Web | grep -c ".html")

Om de opdracht uit te voeren, kan je eenvoudig verwijzen naar de variabele aantal_bestanden, zoals:

dany@pindabook:~$ echo "Het totale aantal html-bestanden in deze map is $aantal_bestanden"
Het totale aantal html-bestanden in deze map is 4

Als je wilt, kan je ook variabele gegevens opslaan in meerdere regels door de gegevens met enkele of dubbele aanhalingstekens te omsluiten en elke regel te scheiden met een backslash teken.

#!/bin/bash
aantal_bestanden=$(ls ~/Documenten/Web |\
grep ".html" |\
wc -l)

echo "Het totale aantal html-bestanden in deze map is $aantal_bestanden"

Je kunt ook variabele gegevens opslaan in een array en deze gebruiken met behulp van indexnummers, dus om te demonstreren, heb ik een script gemaakt dat alle bestanden doorloopt en vermeld die eindigen met de extensie ".html" door witruimte tussen bestandsnamen te verwijderen met behulp van de sed opdracht.

#!/bin/bash
aantal_bestanden=$(ls ~/Documenten/Web/ | grep ".html" | sed  's/\s\+/-/g')
bestanden_array=($aantal_bestanden)
for i in ${!bestanden_array[@]}; do
 echo "HTML bestand $i is ${bestanden_array[$i]}"
done

De uitvoer van het bovenstaande script:

dany@pindabook:~$ ./voorbeeld.sh 
HTML bestand 0 is elo.html
HTML bestand 1 is google****************.html
HTML bestand 2 is index.html
HTML bestand 3 is ontvangen.html
Opdrachten in variabelen