Hur man korrekt kontrollerar om filen finns i Bash eller Shell (med exempel)
Innehållsförteckning
I denna handledning kommer jag att täcka olika attribut som du kan använda i bash- eller shell-skript för att kontrollera mot filer och kataloger. Du kan använda bash villkorliga uttryck med ]
eller använda test med för att kontrollera om filen finns.
Vi kommer använder bash if and else-operatören för alla exempel så jag skulle rekommendera dig att läsa: Bash if else användarhandbok för absoluta nybörjare
1. Bash / Shell: Kontrollera om filen finns och är en vanlig fil
Detta avsnitt visar exemplen för att kontrollera om den vanliga filen finns i bash.
1.1: Metod-1: Använda enkla eller dubbla parenteser
Använda dubbla parenteser ]
#!/bin/bashFILE="/etc/passwd"if ];then echo "$FILE exists"else echo "$FILE doesn"t exist"fi
Använda enstaka parentes
#!/bin/bashFILE="/etc/passwd"if ;then echo "$FILE exists"else echo "$FILE doesn"t exist"fi
1.2: Metod-2: Använd testkommando
test
-kommandot används för att kontrollera filtyper och jämföra värden.
#!/bin/bashFILE="/etc/passwd"if test -f $FILE; then echo "$FILE exists"else echo "$FILE missing"fi
1.3: Metod-3: Enstaka rad
Vi kan använda enstaka eller dubbla parenteser här i det här exemplet. Jag rekommenderar att du alltid använder dubbla parenteser när du skriver en linjekod i skal eftersom det minimerar risken för att få varningar på konsolen när orduppdelning sker.
#!/bin/bashFILE="/etc/passwd"] && echo "$FILE exists" || echo "$FILE missing"
Uttalandet efter &&
kommer att köras om SUCCESS. Om det första villkoret returnerar FALSE kommer uttalande med ||
att köras.
På samma sätt använder du testkommandot för att kontrollera om vanlig fil finns i bash eller shell-skript i en rad .
#!/bin/bashFILE="/etc/passwd"test -f $FILE && echo "$FILE exists" || echo "$FILE missing"
2. Bash / Shell: Kontrollera om filen finns (är tom eller inte tom)
Kontrollera om filen finns och om den är tom eller om den har något innehåll använder vi ”-s
” attribut
2.1: Metod-1: Använda enkla eller dubbla parenteser
Kontrollera om filen finns och är tom eller inte tom med dubbla parenteser ]
#!/bin/bashFILE="/etc/passwd"if ]; then echo "$FILE exists and not empty"else echo "$FILE doesn"t exist or is empty"fi
Kontrollera om filen finns och är tom eller inte tom med dubbla parenteser
if ; then echo "$FILE exists and not empty"else echo "$FILE doesn"t exist or is empty"fi
2.2: Metod-2: Använd testkommando
Med testkommando kombinerar vi -s
attribut för att kontrollera om filen finns och är tom eller har något innehåll:
2.3: Metod-3: Enstaka rad
Vi kan använda både dubbla eller enkla parenteser för en sådan liner men som jag sa tidigare skulle jag rekommendera att du använder dubbla parenteser.
#!/bin/bashFILE="/etc/passwd"test -s $FILE && echo "$FILE exists and not empty" || echo "$FILE doesn"t exist or is empty"
På samma sätt som testkommando kan vi använda &&
och ||
operatör för att kontrollera filen i enradskommando i vårt skalskript.
#!/bin/bashFILE="/etc/passwd"] && echo "$FILE exists and not empty" || echo "$FILE doesn"t exist or is empty"
3. Bash / Shell: Kontrollera om katalogen finns
Jag hoppas att du vet att i Linux är allt en fil. Så på det sättet anses en katalog också vara en fil. Vi kan använda attributet -d
”för att kontrollera om en katalog finns i skalprogrammering.
3.1: Metod-1: Använda dubbla eller enkla parenteser
Vi kan använda -d
attribut inom enstaka eller dubbla parenteser
]
om katalog finns.
#!/bin/bashDIR="/var/log"if ]; then echo "$DIR exists"else echo "$DIR doesn"t exist"fi
På samma sätt använder vi enstaka parenteser i detta exempel för att kontrollera om katalogen är förinställd i skalskriptet.
#!/bin/bashDIR="/var/log"if ; then echo "$DIR exists"else echo "$DIR doesn"t exist"fi
3.2: Metod-2: Använda testkommando
I det här exemplet använder vi testkommando för att se till om katalogen finns eller inte innan vi utför en viss uppgift.
#!/bin/bashDIR="/var/log"if test -d $DIR; then echo "$DIR exists"else echo "$DIR doesn"t exist"fi
3.3: Metod-3: Enstaka rad
I det här exemplet använder vi enstaka och dubbla parenteser i enradig form för att kontrollera för katalogen. Uttrycket efter &&
operatör kommer att köras om det första villkoret är SANT och om det är FALSK kommer ||
villkorets uttalande att köras .
#!/bin/bashDIR="/var/log"] && echo "$DIR exists" || echo "$DIR doesn"t exist"
Jag rekommenderar att du använder ]
istället för för sådana linjekoder i skalprogrammering.
På samma sätt med &&
och ||
kan vi använda testkommandot för att kontrollera om katalog finns
#!/bin/bashDIR="/var/log"test -d $DIR && echo "$DIR exists" || echo "$DIR doesn"t exist"
4. Bash / Shell: Kontrollera om katalog finns (tom eller inte tom)
Det finns inga skalattribut som jag har använt i alla andra exempel och scenarier i den här självstudien, men vi har några hack som vi kan använda för att kontrollera om katalogen är tom eller inte tom.
4.1: Metod-1: Lista kataloginnehållet och verifiera
I det här exemplet listar vi innehållet i katalogen, undertrycker utdata och kontrollerar sedan utgångskoden om katalogen är tom eller innehåller en del innehåll
#!/bin/bashDIR="/tmp"if ls -1qA $DIR | grep -q . ; then echo "$DIR is not -empty"else echo "$DIR is empty"fi
Vi kan också vända detta genom att sätta ett NOT (!
) villkor. Så det skulle se ut som:
#!/bin/bashDIR="/tmp"if ! ls -1qA $DIR | grep -q . ; then echo "$DIR is empty"else echo "$DIR is not-empty"fi
Utdata skulle vara densamma i båda exemplen på manus.
4.2: Metod-2: Användning hitta kommando
Vi kan använda find kommando och sedan undertrycka utdata för att kontrollera om målkatalogen har något innehåll eller inte.
#!/bin/bashDIR="/tmp"if find -- "$DIR" -prune -type d -empty | grep -q . ; then echo "$DIR is empty"else echo "$DIR is not-empty"fi
4.3: Metod-3: Lista innehållet
Återigen som jag sa eftersom det inte finns något enkelt sätt att kontrollera om en katalog är tom eller inte använder vissa attribut, kommer vi att lista innehållet i katalogen. Om du inte får utdata är katalogen tom eller annars tom
#!/bin/bashDIR="/tmp"if ] ; then echo "$DIR is empty"else echo "$DIR is not-empty"fi
5. Bash / Shell: Lista över attribut till testfil
På samma sätt finns det många fler attribut som du kan använda med skalskript för att söka efter olika filtyper, till exempel symboliska länkar, filbehörigheter etc.
Attribut | Vad gör det? |
---|---|
-a FILE |
Sant om FILE finns |
-b FILE |
Sant om FILE existerar och är en blockfil. |
-c FILE |
Sant om FILE finns och är en karaktärspecifik fil. |
-d FILE |
Sant om FILE finns och är en katalog. |
Sant om FILE existerar |
|
-f FILE |
Det är sant om FILE finns och är en vanlig fil |
-g FILE |
Sant om FILE finns och dess set-group-id-bit är inställd |
-h FILE |
Sant om FILE finns och är en symbolisk länk |
-k FILE |
Sant om FILE finns och dess ”klibbiga” bit är inställd |
-p FILE |
Sant om FILE finns och är en namngiven rör (FIFO) |
-r FILE |
Sant om FILE finns och är läsbar |
-s FILE |
Sant om FILE finns och har en storlek större än noll |
-u FILE |
Sant om FILE existerar och dess set-user-id-bit är inställd |
-w FILE |
Sant om FILE finns och är skrivbar |
-x FILE |
Sant om FILE finns och kan köras |
-G FILE |
Sant om FILE finns och ägs av det effektiva grupp-id |
-L FILE |
Sant om FILE finns och är en symbolisk länk |
-N FILE |
Sant om FILE finns och har ändrats sedan den senast lästes |
-o FILE |
Sant om FILE finns och ägs av den effektiva användar-id |
-S FILE |
Sant om FILE finns och är ett uttag |
|
Sant om FILE1 och FILE2 hänvisar till samma enhet och inodnummer |
FILE1 -nt FILE2 |
Sant om FILE1 är nyare (enligt modifieringsdatum) än FILE2 , eller om FILE1 finns och FILE2 inte |
FILE1 -ot FILE2 |
Sant om FILE1 är äldre än FILE2 , eller om FILE2 finns och FILE1 inte |