Het leren van Bash-bestandstestoperators met voorbeelden

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.

# Vertegenwoordigt het bestand dat je wilt testen.
# Vervang file_name door de naam van het doelbestand om te testen.
FILE="file_name"
# Operator - De bestandstestoperator om te gebruiken.
if [ Operator $FILE ]

then
 # Taken uit te voeren als de operator waar retourneert.
 do something

else
 # Taken uit te voeren als de operator onwaar retourneert.
 do something

fi

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.

touch test.txt

2. Voer vervolgens het volgende ls-commando uit om het zojuist aangemaakte bestand (test.txt) in je werkmap weer te geven.

ls -al test.txt

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.

Listing the newly-created file

3. Voer het onderstaande commando uit om een (touch) te maken, en open een nieuw shellscriptbestand (if_file_exists.sh) in je voorkeursteksteditor (nano).

touch if_file_exists.sh && nano if_file_exists.sh

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.

#!/bin/bash
# FILE - Een variabele die de waarde van het bestand dat je wilt testen, bevat.
# Je kunt ditzelfde codeblok hergebruiken om verschillende bestanden te testen 
  # door de waarde van de $FILE variabele te wijzigen.
FILE="test.txt"

# De -e operator test op het bestaan van het bestand
if [ -e $FILE ]
then
  # Als de operator waar retourneert, wordt een bericht afgedrukt dat het bestand bestaat.
  echo "$FILE exists"
else
  # Als de operator waar retourneert, wordt een bericht afgedrukt dat het bestand niet bestaat,
    # en maakt dan het bestand aan met de naam die je hebt gedefinieerd in de FILE variabele.
  echo "$FILE does not exist, creating new file" && touch test.txt
fi

5. Voer de onderstaande opdracht uit om je nieuwe script uit te voeren (if_file_exists.sh)

bash if_file_exists.sh

Als alles goed gaat, zie je de boodschap “test.txt bestaat” afgedrukt op je terminal, zoals hieronder weergegeven.

test.txt exists

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.

rm -rf test.txt
ls test.txt

Hieronder kun je verifiëren dat het bestand test.txt niet langer wordt vermeld.

Deleting the test file

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.

bash if_file_exists.sh
Rerun your if_file_exists.sh script

8. Voer tot slot de ls-opdracht hieronder uit om het test.txt-bestand in je werkdirectory op te sommen.

ls -al test.txt

De uitvoer bevestigt dat je script een nieuw test.txt-bestand heeft aangemaakt.

Listing the new test.txt file

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.

#!/bin/bash
# Het bestand /dev/vmmon is een speciaal bestand
  # dat wordt gebruikt voor communicatie met hardwareapparaten in Linux.
FILE="/dev/vmmon"

# Test of het bestand 
if [ -f $FILE ]
then
  # Als de operator waar is, ontvangt u een bericht dat zegt
    # het bestand een regulier bestand is.
  echo "$FILE is a regular file"

else
  # Als de operator waar is, ontvangt u een bericht dat zegt 
    # het bestand ofwel niet bestaat of een regulier bestand is.
  echo "Either $FILE does not exist or is not a regular file"

fi

Voer nu de onderstaande opdracht uit om uw special_file.sh-script uit te voeren.

bash special_file.sh

Aangezien het bestand (/dev/vmmon) dat is opgegeven in de FILE-variabele een speciaal bestand is, ontvangt u het onderstaande bericht.

Checking if a file is a regular file

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.

ls -la example-dir

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.

Listing the example-dir from the working directory

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.

#!/bin/bash
# Definieer de mapnaam in de dir-variabele
dir=example_dir

# Test of de map (dir) bestaat
if [ ! -d $dir ]
then
  # Als de operator true retourneert, maak dan een map aan tegen de waarde van de dir-variabele
  mkdir $dir
  # Kopieer het bestand test.txt naar de nieuw aangemaakte map
  cp test.txt $dir
  # Print een bericht over de uitgevoerde taken hierboven.
  echo "The directory has been created, and the test.txt file has been copied."
else
  # Als de operator false retourneert, 
    # de echo-opdracht geeft een bericht weer dat de map bestaat.
  echo "Directory $dir exists"
fi

3. Voer nu de onderstaande opdracht uit om je script uit te voeren (if_dir_exists.sh)

bash 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.

Executing the if_dir_exists.sh to test if a directory exists

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.

ls -la example_dir
Confirming the example_dir directory exists and contains the test.txt file

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.

#!/bin/bash
# Definieert de naam van het doelbestand
FILE=test.txt

# De -s-operator test of het doelbestand bestaat en niet leeg is
if [ -s $FILE ]
then
  # Als de operator waar teruggeeft, drukt het echo-commando een bericht af
    # waarin staat dat het bestand bestaat en niet leeg is.
  echo "$FILE exists and is not empty"
else
  # Als de operator onwaar teruggeeft, drukt het echo-commando een bericht af 
    # waarin staat dat het bestand ofwel niet bestaat of leeg is.
  echo "$FILE either does not exist or is empty"
  # Voeg tekst toe aan het doelbestand
  echo "This is a test. This is not an empty file" > $FILE
fi

2. Voer nu het onderstaande commando uit om je script uit te voeren (empty_file.sh).

bash 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.

Executing the empty_file.sh file to test if the text.txt file is empty

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

cat test.text
Verifying the text.txt file’s content

4. Tenslotte, voer het bash-commando hieronder opnieuw uit om het empty_file.sh script uit te voeren.

bash empty_file.sh

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).

Rerunning the empty_file.sh script to check if the test.txt file is empty

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).

su - ata

Uw prompt verandert ($) om aan te geven dat u bent ingelogd als de andere gebruiker.

Logging in to another user account

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.

#!/bin/bash
# Definieer het doelbestand
FILE=test.txt

# Test of het doelbestand leesbaar is. 
# U kunt -r veranderen in -w om te testen of een bestand beschrijfbaar is in plaats daarvan.
if [ -r $FILE ] 
then  
  # Als de operator waar teruggeeft, druk dan een bericht af dat zegt
    # het bestand bestaat en leesbaar is.
  echo "$FILE exists and is readable" 
else  
  # Als de operator onwaar teruggeeft, druk dan een bericht af dat zegt
    # het bestand bestaat niet of is onleesbaar.  
  echo "$FILE does not exist or is unreadable"
fi

3. Voer nu de onderstaande opdracht uit om het script readable_file.sh uit te voeren.

bash readable_file.sh

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.

Executing the readable_file.sh script

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.
sudo bash
bash readable_file.sh

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.

Changing the sudoers file and executing the readable_file.sh script

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?

Source:
https://adamtheautomator.com/bash-file-test/