Bash is ongelooflijk flexibel en biedt verschillende opties voor het testen van bestanden. En als je op zoek bent naar een manier om je bestanden te testen, zullen de Bash-bestandstestoperatoren je overal naartoe brengen.
In deze tutorial leer je verschillende bestandstestoperatoren en hoe je ze kunt gebruiken om te testen of een bestand bestaat, leesbaar is, leeg is, enzovoort.
Lees verder en word vrienden met de Bash-bestandstestoperatoren!
Vereisten
Deze tutorial zal een praktische demonstratie zijn. Als je wilt meedoen, zorg er dan voor dat je het volgende hebt:
- A Linux system with Bash installed – This tutorial uses Ubuntu 20.04.
De meeste Linux-distributies hebben standaard Bash geïnstalleerd. Maar als je Windows gebruikt, kun je het Windows Subsysteem voor Linux (WSL) installeren om een Bash-shell te krijgen.
- A user account with sudo privileges to run commands as root – This tutorial uses a root account for simplicity. But using a non-root user with sudo access is always recommended.
- Deze tutorial gaat ervan uit dat je SSH-toegang hebt tot je Linux-systeem.
Wat zijn Bash-bestandstestoperators?
Voordat je je handen vuil maakt met de testoperators, werp een blik op hoe ze werken. Bestandstestoperators stellen je in staat verschillende aspecten van een bestand te testen, zoals of een bestand bestaat, leesbaar/schrijfbaar is, enzovoort.
Het gebruik van bestandstestoperators kan helpen bij het voorkomen van fouten in je Bash-scripts. De onderstaande code is een sjabloon voor de if-verklaring. De if-else-verklaring is een krachtig instrument dat je vaak zult zien in Bash-scripts.
Onthoud dat de then- en else-delen van de code optioneel zijn. Je kunt een if-verklaring zonder hen gebruiken.
Controleren of een bestand bestaat
Je hebt een glimp opgevangen van hoe de testoperators werken, maar dat is niet genoeg om de ins en outs van het gebruik ervan beter te begrijpen. Begin dus met een eenvoudig voorbeeld, zoals het controleren of een bestand bestaat.
In de echte wereld wil je misschien controleren of een configuratiebestand bestaat voordat je er een maakt. Je wilt geen tijd verspillen met het opbouwen van een configuratiebestand vanaf nul om er vervolgens achter te komen dat hetzelfde bestand al bestaat.
Om te controleren of een bestand al bestaat:
1. Open je terminal en voer het touch commando hieronder uit om een nieuw test.txt bestand te maken. Dit commando geeft geen uitvoer, maar je zult het bestand in de volgende stap verifiëren.
2. Voer vervolgens het volgende ls-commando uit om het zojuist aangemaakte bestand (test.txt) in je werkmap weer te geven.
De uitvoer hieronder bevestigt dat je succesvol het test.txt-bestand hebt aangemaakt.
Nu je een testbestand hebt, kun je de standaard codeblok in een Bash-script gebruiken om te controleren of het bestand bestaat in de volgende stappen.

3. Voer het onderstaande commando uit om een (touch) te maken, en open een nieuw shellscriptbestand (if_file_exists.sh) in je voorkeursteksteditor (nano).
4. Vul nu de onderstaande code in in je nieuwe if_file_exists.sh bestand, sla het bestand op en sluit de editor.
- Voert een if-else verklaring uit om te testen of een opgegeven bestand bestaat.
- Als de operator waar retourneert, krijg je een bericht dat het bestand bestaat.
- Als de operator waar retourneert, krijg je een bericht dat het bestand niet bestaat. Maar deze keer wordt het bestand automatisch aangemaakt, met de naam die je hebt gedefinieerd in de FILE variabele.
De #!/bin/bash regel aan het begin van het bestand staat bekend als een shebang. Een shebang vertelt je systeem welke interpreter moet worden gebruikt om het script uit te voeren, in dit geval Bash. Als je geen shebang opneemt, gebruikt je systeem de standaardinterpreter, die mogelijk niet Bash is. Het ontbreken van de shebang kan ervoor zorgen dat je script mislukt.
5. Voer de onderstaande opdracht uit om je nieuwe script uit te voeren (if_file_exists.sh)
Als alles goed gaat, zie je de boodschap “test.txt bestaat” afgedrukt op je terminal, zoals hieronder weergegeven.

6. Voer vervolgens de volgende opdrachten uit om het testbestand (test.txt) te verwijderen (rm -rf) en alle bestanden in je werkdirectory op te sommen.
Hieronder kun je verifiëren dat het bestand test.txt niet langer wordt vermeld.

7. Voer de onderstaande opdracht opnieuw uit om je if_file_exists.sh-script uit te voeren.
Omdat het bestand test.txt niet meer bestaat, maakt het script een nieuw test.txt-bestand aan wanneer de -e-operator onwaar retourneert.

8. Voer tot slot de ls-opdracht hieronder uit om het test.txt-bestand in je werkdirectory op te sommen.
De uitvoer bevestigt dat je script een nieuw test.txt-bestand heeft aangemaakt.

Controleren of een bestand een regulier of speciaal bestand is
Voordat je een bestand opent of verwerkt, wil je misschien eerst controleren of dat bestand regulier of speciaal is. Waarom? Een speciaal bestand is een type bestand dat is opgeslagen in eenbestandssysteem, dus wees voorzichtig om niet te rommelen met deze bestanden.
Bijvoorbeeld, een veelvoorkomende fout bij het openen van een speciaal bestand is de fout “Bestand of map bestaat niet”. Deze fout treedt op wanneer het bestand dat je probeert te openen niet bestaat. Maar dezelfde fout kan ook optreden bij het openen van een speciaal bestand in plaats van een regulier bestand.
Open een nieuw special_file.sh-bestand in je teksteditor, voeg de onderstaande code toe en sla de wijzigingen op.
De code hieronder is vergelijkbaar met de vorige. Maar deze code gebruikt de -f
-operator in plaats van de -e
-operator. De -f
-operator test of een opgegeven bestand (/dev/vmmon
) een regulier bestand is.
Voer nu de onderstaande opdracht uit om uw special_file.sh
-script uit te voeren.
Aangezien het bestand (/dev/vmmon) dat is opgegeven in de FILE
-variabele een speciaal bestand is, ontvangt u het onderstaande bericht.

Controleren of een map bestaat
Tot nu toe heb je geleerd hoe je kunt controleren of een bestand bestaat. Maar geldt dezelfde methode voor mappen? Ja, door de -d
-testoperator te gebruiken. Deze operator komt goed van pas als je actie wilt ondernemen op basis van het wel of niet bestaan van een map.
Misschien wil je alle bestanden van de ene map naar de andere kopiëren. Als de doelmap niet bestaat, kun je deze aanmaken voordat je de bestanden kopieert.
1. Voer de ls-opdracht hieronder uit om de voorbeeld-map vanuit de werkmap op te sommen.
Je krijgt een bericht dat er geen bestand of map bestaat omdat de map niet bestaat. Als je niet wilt dat je flow onderbroken wordt alleen omdat een map niet bestaat, ga dan naar de volgende stap.

2. Open vervolgens een nieuw bestand met de naam if_dir_exists.sh in je teksteditor, voeg de onderstaande code toe en sla het bestand op. De volgende code test of een opgegeven map bestaat en voert taken uit, afhankelijk van de waarde die de -d operator retourneert.
Je kunt hetzelfde resultaat bereiken door de if- en else-statements om te draaien met behulp van de negatie-operator (!). In situaties in de echte wereld kan de ! operator helpen bij het schrijven van een schonere en beknoptere script.
3. Voer nu de onderstaande opdracht uit om je script uit te voeren (if_dir_exists.sh)
Je kunt het bericht zien waarin staat dat de map is aangemaakt en het bestand test.txt is gekopieerd omdat de map example_dir niet bestaat.

4. Voer tot slot het ls-commando uit tegen de map example_dir om te bevestigen dat de map bestaat en het bestand test.txt bevat.

Het controleren of een bestand leeg is
Je weet al hoe je de drie meest gebruikte bestandstestoperators (-e
, -f
en -d
) moet gebruiken om je scriptingvaardigheden te verbeteren. Maar er zijn nog andere operators waar je naar zou willen kijken.
Meestal zou je in plaats van de inhoud van een bestand te markeren om naar een ander bestand te kopiëren, een opdracht uitvoeren om het werk voor je te doen. Maar wacht even, want je doelbestand kan leeg zijn.
Waarom gebruik je niet de -s
operator om te controleren of een bestand bestaat en niet leeg is? Deze operator retourneert true als het bestand bestaat en een grootte groter dan nul heeft.
1. Open een nieuw bestand met de naam empty_file.sh in je teksteditor, voeg de volgende code toe en sla het bestand op.
De volgende code test of een opgegeven bestand leeg is en print een bericht afhankelijk van de waarde die de -s operator retourneert.
2. Voer nu het onderstaande commando uit om je script uit te voeren (empty_file.sh).
Hieronder zie je het bericht waarin staat dat test.txt ofwel niet bestaat of leeg is. Maar tegelijkertijd voegt het script tekst toe aan het test.txt bestand.

3. Voer het cat-commando hieronder uit om te verifiëren of het test.txt-bestand de toegevoegde tekst bevat.

4. Tenslotte, voer het bash-commando hieronder opnieuw uit om het empty_file.sh script uit te voeren.
Hieronder zie je de uitvoer veranderd naar test.txt bestaat en is niet leeg omdat het test.txt bestand nu wat tekst bevat en een grootte heeft groter dan nul (0).

Het controleren of een bestand bestaat en leesbaar is
Misschien houdt uw automatisering in dat bestanden worden gelezen om taken uit te voeren. Het succes van die taken zal afhangen van of de bestanden leesbaar zijn. Het schrijven van een script om te controleren of een bestand bestaat en leesbaar is, zal handig zijn als oplossing.
Om te demonstreren of een bestand bestaat en leesbaar is:
1. Voer de volgende opdracht uit om in te loggen op een andere gebruikersaccount (ata).
Uw prompt verandert ($) om aan te geven dat u bent ingelogd als de andere gebruiker.

Als alternatief kunt u de toestemming van het bestand wijzigen naar leesbaar, schrijfbaar of beide met het chmod-commando.
2. Zodra u bent ingelogd, maakt u een nieuw bestand genaamd readable_file.sh met uw teksteditor
Voeg de volgende code toe aan het bestand readable_file.sh en sla de wijzigingen op. Deze code controleert of een bestand genaamd test.txt in de /root-map bestaat en leesbaar is.
3. Voer nu de onderstaande opdracht uit om het script readable_file.sh uit te voeren.
Deze keer ziet u een bericht waarin staat dat /root/test.txt niet bestaat of niet leesbaar is. Omdat het bestand text.test zich in de map /root bevindt, heeft de huidige gebruiker (ata) geen leesrechten voor het bestand text.txt.

4. Voer ten slotte de onderstaande commando’s uit om het volgende uit te voeren:
- Wijzig het sudoers-bestand om de huidige gebruiker (ata) toe te staan
sudo
te gebruiken om verhoogde commando’s uit te voeren.
- Voer het script readable_file.sh uit, dat controleert of een specifiek bestand leesbaar is.
U kunt hieronder zien dat de uitvoer test.txt bestaat en leesbaar is omdat de gebruiker ata nu leesrechten heeft voor het bestand test.txt.

Conclusie
A testing phase is always a priority before making drastic changes, whether on files or directories on your system. And in this tutorial, you’ve learned about the Bash file test operators and how to use them to test if a file (regular or special) or directory exists or if a file is readable or not.
Met deze nieuwe vaardigheden kunt u met vertrouwen beslissen welke actie u moet ondernemen op basis van de resultaten van de tests. Maar er zijn nog veel andere manieren waarop u Bash-bestandstestoperatoren kunt gebruiken.
Waarom probeert u niet om de extensie van een bestand te controleren? Of misschien controleren of meerdere bestanden bestaan om te zien of alle benodigde bestanden beschikbaar zijn?