Meestal komen we een situatie tegen waarin we een actie moeten uitvoeren om te controleren of een bestand bestaat of niet.
In Bash kunnen we een 'testcommando' gebruiken om te controleren of een bestand bestaat en om het type van een bestand te bepalen.
Hieronder volgen de syntaxis van de testopdracht en we kunnen elk van deze opdrachten gebruiken:
test expression [ expression ] [[ expression ]]
We zijn verplicht om een enkel haakje '[' commando te gebruiken om ons script draagbaar te maken voor alle POSIX-shells. De geüpgradede versie van de testopdracht bevat dubbele haakjes '[[' die wordt ondersteund op de meeste moderne systemen die Bash, Zsh en Ksh als standaardshell gebruiken.
Controleer of het bestand bestaat
Bij het controleren of een bestand bestaat, zijn de meest gebruikte bestandsoperatoren -e en -f. De optie '-e' wordt gebruikt om te controleren of een bestand bestaat, ongeacht het type, terwijl de optie '-f' alleen wordt gebruikt om de echte waarde te retourneren als het bestand een gewoon bestand is (geen map of apparaat).
De meest gebruikelijke optie om te controleren of het bestand bestaat of niet, is door het testcommando te gebruiken met de 'if conditional statement'.
Hieronder volgen voorbeelden om te controleren of het bestand 'read_file.txt' bestaat:
Methode 1
#!/bin/bash File=read_file.txt if test -f '$File'; then echo '$File exist ' fi
Methode 2
#!/bin/bash File=read_file.txt if [ -f '$File' ]; then echo '$File exist ' fi
Methode 3
#!/bin/bash File=read_file.txt if [[ -f '$File' ]]; then echo '$File exist ' fi
Uitvoer
De uitvoer voor alle drie de methoden zal er als volgt uitzien, omdat er een bestand (read_file.txt) in de map aanwezig is:
b+ bomen
read_file.txt exist
Als we een actie willen uitvoeren die een resultaat oplevert op basis van het feit of het bestand al dan niet bestaat, kunnen we de if/then-constructie op de volgende manier gebruiken:
Voorbeeld
#!/bin/bash File=read_file.txt if [ -f '$File' ]; then echo '$File exist' else echo '$File does not exist' fi
Uitvoer
read_file.txt exist
We kunnen het testcommando ook gebruiken zonder de if-instructie. We kunnen een van de volgende methoden gebruiken:
Methode 1
#!/bin/bash File=read_file.txt test -f read_file.txt && echo '$File exist'
Methode 2
#!/bin/bash File=read_file.txt [ -f read_file.txt ] && echo '$File exist'
Methode 3
#!/bin/bash File=read_file.txt [[ -f read_file.txt ]] && echo '$File exist'
Uitvoer
De uitvoer voor alle drie de methoden zal er als volgt uitzien, omdat er een bestand (read_file.txt) in de map aanwezig is:
read_file.txt exist
Als er meerdere opdrachten moeten worden uitgevoerd na de &&-operator, plaatst u de opdrachten tussen accolades, gescheiden door puntkomma(;) of AND (&&), d.w.z.:
Voorbeeld
#!/bin/bash File=read_file.txt [ -f read_file.txt ] && { echo '$File exist'; echo 'Task Completed'; }
In tegenstelling tot && is de verklaring na de || operator wordt alleen uitgevoerd als de uitgangsstatus van het testcommando 'false' is.
probeer java te vangen
Voorbeeld
#!/bin/bash File=read_file.txt [ -f read_file.txt ] && echo '$File exist' || echo '$File does not exist'
Uitvoer
read_file.txt exist
Dit zijn de meest gebruikte methoden in Bash om te controleren of het bestand bestaat of niet.
Controleer of de map bestaat
Met de operator '-d' kunnen we testen of een bestand een directory is of niet.
Hieronder volgen de methoden om te controleren of de map 'Javatpoint' bestaat:
Methode 1
#!/bin/bash File=Javatpoint if [ -d '$File' ]; then echo '$File is a directory' fi
Methode 2
#!/bin/bash File=Javatpoint [ -d '$File' ] && echo '$File is a directory'
Opmerking:We kunnen ook dubbele haakjes '[[' gebruiken in plaats van een enkel haakje '['.
Uitvoer
De uitvoer voor beide bovenstaande methoden zal zijn zoals hieronder, aangezien we een map (genaamd Javatpoint) op de opgegeven locatie hebben:
Javatpoint is a directory
Controleer of het bestand niet bestaat
De testexpressie kan worden genegeerd door het uitroepteken te gebruiken (! -logische NOT-operator). Bekijk het volgende voorbeeld:
Voorbeeld
#!/bin/bash File=missing_read_file.txt if [ ! -f '$File' ]; then echo '$File does not exist' fi
Bovenstaand script kan ook als volgt worden geschreven:
#!/bin/bash File=missing_read_file.txt [ ! -f '$File' ] && echo '$File unavailable'
Uitvoer
missing_read_file.txt unavailable
Bestandtestoperators
De testopdrachten omvatten de volgende bestandsoperatoren waarmee we op bepaalde typen bestanden kunnen testen:
-b Bestandsretouren | 'Waar' als het BESTAND bestaat als een speciaal blokbestand. |
-c Bestandsretouren | 'Waar' als het BESTAND bestaat als een bestand met speciale tekens. |
-d Bestandsretouren | 'Waar' als het BESTAND als map bestaat. |
-e Bestandsretouren | 'Waar' als het BESTAND als bestand bestaat, ongeacht het type (knooppunt, map, socket, etc.). |
-f Bestandsretouren | 'Waar' als het BESTAND bestaat als een gewoon bestand (geen map of apparaat). |
-G Bestandsretouren | 'Waar' als het BESTAND bestaat en dezelfde groep bevat als de gebruiker die de opdracht uitvoert. |
-h Bestandsretouren | 'Waar' als het BESTAND bestaat als een symbolische link. |
-g Bestandsretouren | 'Waar' als het BESTAND bestaat en de vlagset set-group-id (sgid) bevat. |
-k Bestandsretouren | 'Waar' als het BESTAND bestaat en een sticky bit-vlagset bevat. |
-L Bestandsretouren | 'Waar' als het BESTAND bestaat als een symbolische link. |
-O Bestandsretouren | 'Waar' als het BESTAND bestaat en eigendom is van de gebruiker die de opdracht uitvoert. |
-p Bestandsretouren | 'True' als het BESTAND bestaat als een pipe. |
-r Bestandsretouren | 'Waar' als het BESTAND bestaat als een leesbaar bestand. |
-S Bestandsretouren | 'True' als het BESTAND als socket bestaat. |
-s Bestandsretouren | 'Waar' als het BESTAND bestaat en een grootte heeft die niet nul is. |
-u Bestandsretouren | 'True' als het BESTAND bestaat en de vlag set-user-id (suid) is ingesteld. |
-w Bestandsretouren | 'Waar' als het BESTAND bestaat als een beschrijfbaar bestand. |
-x Bestandsretouren | 'Waar' als het BESTAND bestaat als een uitvoerbaar bestand. |