Am'am folosit următoarele script-ul pentru a vedea dacă există un fișier:
#!/bin/bash
FILE=$1
if [ -f $FILE ]; then
echo "File $FILE exists."
else
echo "File $FILE does not exist."
fi
Ce's sintaxa corectă pentru a utiliza dacă vreau doar să verificați dacă fișierul nu nu exista?
#!/bin/bash
FILE=$1
if [ $FILE does not exist ]; then
echo "File $FILE does not exist."
fi
Bash Fișier De Testare
-b filename
- Bloc fișier special
-c filename
- caractere Speciale fișier
-d directoryname
- Verifica pentru Existența director
-e nume
- Verificați fișierul existența, indiferent de tip (nod, director, socket, etc.)
-f filename
- Verificați regulat fișier existența nu un director
-G filename
- Verificați dacă fișierul există și este deținută de eficiente ID-ul de grup
-G filename set-group-id
- True dacă fișierul există și este set-group-id
-k filename
- Sticky bit
-L filename
- Simbolic link
-O în nume fișier - True dacă fișierul există și este deținută de eficiente id-ul de utilizator
-r filename- Verificați dacă fișierul este într-un ușor de citit
-S filename- Verificați dacă fișierul este socket
-s filename- Verificați dacă fișierul este nenul dimensiune
-u filename- Verificați dacă fișierul set-user-id-ul bit este setat
-w fisier- Verificați dacă fișierul este inscriptibil
-x filename` - Verifica daca fisierul este executabil
Cum să utilizați:
#!/bin/bash
file=./file
if [ -e "$file" ]; then
echo "File exists"
else
echo "File does not exist"
fi
O test de expresie pot fi anulate prin utilizarea !
operator
#!/bin/bash
file=./file
if [ ! -e "$file" ]; then
echo "File does not exist"
else
echo "File exists"
fi
Puteți anula o expresie cu "!":
#!/bin/bash
FILE=$1
if [ ! -f "$FILE" ]
then
echo "File $FILE does not exist"
fi
Relevante om pagină este om testsau, echivalent,
man [- sau
ajutor de test " sau " ajutor [` pentru built-in bash comanda.
[[ -f $FILE ]] || printf '%s does not exist!\n' "$FILE"
De asemenea, l's posibil ca fișierul este rupt legătura simbolică, sau un non-fișier obișnuit, cum ar fi de exemplu un soclu, dispozitiv sau fifo. De exemplu, pentru a adăuga un cec de rupt legăturile simbolice:
if [[ ! -f $FILE ]]; then
if [[ -L $FILE ]]; then
printf '%s is a broken symlink!\n' "$FILE"
else
printf '%s does not exist!\n' "$FILE"
fi
fi
Prefer să fac următoarele o-liner, în POSIX shell format compatibil:
$ [ -f "/$DIR/$FILE" ] || echo "$FILE NOT FOUND"
$ [ -f "/$DIR/$FILE" ] && echo "$FILE FOUND"
Pentru un cuplu de comenzi, ca mi-ar face într-un script:
$ [ -f "/$DIR/$FILE" ] || { echo "$FILE NOT FOUND" ; exit 1 ;}
Odată ce am început să fac asta, eu folosesc foarte rar pe deplin introduce sintaxa mai!!
Pentru a testa fișier existența, parametrul poate fi oricare dintre următoarele:
-e: Returns true if file exists (regular file, directory, or symlink)
-f: Returns true if file exists and is a regular file
-d: Returns true if file exists and is a directory
-h: Returns true if file exists and is a symlink
Toate testele de mai jos se aplică regulat fișierele, directoarele, și legături simbolice:
-r: Returns true if file exists and is readable
-w: Returns true if file exists and is writable
-x: Returns true if file exists and is executable
-s: Returns true if file exists and has a size > 0
Exemplu de script:
#!/bin/bash
FILE=$1
if [ -f "$FILE" ]; then
echo "File $FILE exists"
else
echo "File $FILE does not exist"
fi
Puteți face acest lucru:
[[ ! -f "$FILE" ]] && echo "File doesn't exist"
sau
if [[ ! -f "$FILE" ]]; then
echo "File doesn't exist"
fi
Dacă doriți să verificați pentru fișier și folder ambele, apoi utilizați "- e " opțiune în loc de -f
. -e
returnează true pentru regulat fișierele, directoarele, soclu, caracter fișiere speciale, bloc fișiere speciale etc.
Tu ar trebui să fie atent cu privire la rularea "test" pentru o necotate variabilă, pentru că s-ar putea produce rezultate neașteptate:
$ [ -f ]
$ echo $?
0
$ [ -f "" ]
$ echo $?
1
Recomandarea este, de obicei, pentru a fi testate variabilă înconjurate de ghilimele:
#!/bin/sh
FILE=$1
if [ ! -f "$FILE" ]
then
echo "File $FILE does not exist."
fi
Există trei moduri distincte de a face acest lucru:
dacă ! [ -e "$file" ]; apoi echo "fișier nu există" fi
Sau:
! [ -e "$file" ] && echo "fișier nu există"
[
(care este modul în cele mai multe răspunsuri înainte de a fi prezentate):dacă [ ! -e "$file" ]; apoi echo "fișier nu există" fi
Sau:
[ ! -e "$file" ] && echo "fișier nu există"
||
în loc de &&
):Numai:
[ -e "$file" ] || ecoul "fișier nu există"
Acest lucru pare o prostie (OMI), don't folosi decât dacă codul trebuie să fie portabil pentru the Bourne shell (ca /bin/sh
de Solaris 10 sau mai devreme) care nu aveau conducte de operator de negație (!
):
dacă [a-e "$file" ]; apoi |
---|
altceva |
echo "fișier nu există" |
fi |
În
[ -f "$file" ]
a [
comanda un stat()
(nu lstat()
) apel de sistem pe calea stocate în $de fișier și returnează _true_ cazul în care sistemul de reușitã și tipul de fișier ca a revenit de stat()
este "regulate".
Deci, daca [ -f "$file" ]
returnează true, vă pot spune fișierul există și este un fișier obișnuit sau o legătură simbolică în cele din urmă rezolvarea la un fișier obișnuit (sau, cel puțin, a fost la data de stat()
).
Cu toate acestea, dacă se întoarce false (sau dacă [ ! -f "$file" ] "sau"! [ -f "$file" ]
return true), există multe posibilități diferite:
stat()
apel de sistem poate să nu reușească.Pe scurt, ar trebui să fie:
if [ -f "$file" ]; then
printf '"%s" is a path to a regular file or symlink to regular file\n' "$file"
elif [ -e "$file" ]; then
printf '"%s" exists but is not a regular file\n' "$file"
elif [ -L "$file" ]; then
printf '"%s" exists, is a symlink but I cannot tell if it eventually resolves to an actual file, regular or not\n' "$file"
else
printf 'I cannot tell if "%s" exists, let alone whether it is a regular file or not\n' "$file"
fi
Să știi sigur că fișierul nu't există, ne-am'd nevoie de stat()
sistem de apel pentru a reveni cu un cod de eroare de ENOENT(
ENOTDIRne spune unul dintre calea componente nu este un director este un alt caz în care putem spune că fișierul nu't există prin această cale). Din păcate,
[`comanda nu't să ne spui asta. Se va întoarce false dacă codul de eroare este ENOENT, EACCESS (permission denied), ENAMETOOLONG sau orice altceva.
Pe [ -e "$file" ]
test poate fi, de asemenea, terminat cu ls-Ld -- "$file" > /dev/null
. În acest caz, " ls " să vă spun de ce stat()
nu a reușit, deși informațiile pot't fi ușor de folosit programatic:
$ file=/var/spool/cron/crontabs/root
$ if [ ! -e "$file" ]; then echo does not exist; fi
does not exist
$ if ! ls -Ld -- "$file" > /dev/null; then echo stat failed; fi
ls: cannot access '/var/spool/cron/crontabs/root': Permission denied
stat failed
Cel puțin " ls " spune-mi l's nu deoarece fișierul nu't există, că nu reușește. L's, deoarece se poate't spune dacă fișierul există sau nu. A [
comanda doar ignorat problema.
Cu zsh
shell, puteți interoga codul de eroare cu $errno va fi special variabilă după faptul că nu
[comandă, și decoda că numărul utilizând
$errnos special largă în anii `zsh/sistem de module:
zmodload zsh/system
ERRNO=0
if [ ! -f "$file" ]; then
err=$ERRNO
case $errnos[err] in
("") echo exists, not a regular file;;
(ENOENT|ENOTDIR)
if [ -L "$file" ]; then
echo broken link
else
echo does not exist
fi;;
(*) syserror -p "can't tell: " "$err"
esac
fi
(feriți-vă de $errnos de sprijin a fost rupt cu unele versiuni de zsh
atunci când a construit cu cele mai recente versiuni de gcc`).
Pentru a inversa un test, utilizați "!". Asta este echivalent cu "nu" operator logic în alte limbi. Încercați acest lucru:
if [ ! -f /tmp/foo.txt ];
then
echo "File not found!"
fi
Sau scrise într-un mod ușor diferit:
if [ ! -f /tmp/foo.txt ]
then echo "File not found!"
fi
Sau ai putea folosi:
if ! [ -f /tmp/foo.txt ]
then echo "File not found!"
fi
Sau, presing toate împreună:
if ! [ -f /tmp/foo.txt ]; then echo "File not found!"; fi
Care poate fi scris (folosind apoi "și" operator: &&) ca:
[ ! -f /tmp/foo.txt ] && echo "File not found!"
Care pare mai scurt, astfel:
[ -f /tmp/foo.txt ] || echo "File not found!"
La "test" lucru poate conta prea. Ea a lucrat pentru mine (pe baza Bash Shell: Verificați Fișierul Există sau Nu):
test -e FILENAME && echo "File exists" || echo "File doesn't exist"
Dacă doriți să utilizați testul "în loc de" [], atunci puteți folosi
!` pentru a obține negația:
if ! test "$FILE"; then
echo "does not exist"
fi
De asemenea, puteți grupa mai multe comenzi într-o linie
[ -f "nume" ] || ( echo test1 && echo test2 && echo test3 )
sau
[ -f "nume" ] || { echo test1 && echo test2 && echo test3 ;}
Dacă filename doesnt't de ieșire, de ieșire va fi
test1 test2 test3
Notă: ( ... ) se execută într-un subshell, { ... ;} se execută în același shell. La acolada de lucrări de notație în bash numai.