Cum să verificați dacă un fișier există în scripturile Linux Bash
Publicat: 2022-08-18Dacă un script Linux Bash se bazează pe anumite fișiere sau directoare prezente, nu poate să presupună că o fac. Trebuie să verifice dacă sunt cu siguranță prezenți. Iată cum să faci asta.
Nu presupune nimic
Când scrieți un scenariu, nu puteți face presupuneri despre ceea ce este și ce nu este prezent pe un computer. Acest lucru este de două ori adevărat dacă scriptul va fi distribuit și rulat pe mai multe computere diferite. Mai devreme sau mai târziu, scriptul va rula pe un computer care nu corespunde ipotezelor tale, iar scriptul va eșua sau va rula imprevizibil.
Tot ceea ce prețuim sau creăm pe un computer este stocat într-un fișier de un anumit format și toate aceste fișiere se află într-un director. Scripturile pot citi, scrie, redenumi, șterge și muta fișiere și directoare — toate lucrurile pe care le puteți face pe linia de comandă.
Avantajul pe care îl ai ca om este că poți vedea conținutul unui director și știi dacă un fișier există sau nu - sau chiar dacă directorul așteptat există. Dacă un script se defectează atunci când manipulează fișiere, poate avea rezultate grave și dăunătoare.
Bash oferă un set cuprinzător de teste pe care le puteți utiliza pentru a detecta fișiere și directoare și pentru a testa multe dintre atributele acestora. Încorporarea acestora în scripturi este ușoară, dar beneficiile în ceea ce privește robustețea și controlul fin sunt considerabile.
LEGATE: Cum să utilizați testele condiționate cu paranteze duble în Linux
Gama de teste
Combinând instrucțiunea if cu testul adecvat dintr-o colecție mare de teste de fișiere și directoare, putem determina cu ușurință dacă un fișier există, dacă este executabil sau inscriptibil și multe altele.
- -b : Returnează adevărat dacă fișierul este un fișier special bloc.
- -c : Returnează adevărat dacă fișierul are caracter special.
- -d : Returnează adevărat dacă „fișierul” este un director.
- -e : Returnează adevărat dacă fișierul există.
- -f : Returnează adevărat dacă fișierul există și este un fișier obișnuit.
- -g : Returnează adevărat dacă fișierul are setul de permisiuni
setgid
(chmod g+
). - -h : Returnează adevărat dacă fișierul este o legătură simbolică.
- -L : Returnează adevărat dacă fișierul este o legătură simbolică.
- -k : Returnează adevărat dacă are bitul lipicios setat (
chmod +t
). - -p : Returnează adevărat dacă fișierul este o conductă numită.
- -r : Returnează adevărat dacă fișierul este lizibil.
- -s : Returnează adevărat dacă fișierele există și nu sunt goale.
- -S : Returnează adevărat dacă fișierul este un socket.
- -t : Returnează adevărat dacă descriptorul de fișier este deschis într-un terminal.
- -u : Returnează adevărat dacă fișierul are setul de permisiuni
setuid
(chmod u+
). - -w : Returnează adevărat dacă fișierul poate fi scris.
- -x : Returnează adevărat dacă fișierul este executabil.
- -O : Returnează adevărat dacă este deținut de dvs.
- -G : Returnează adevărat dacă este deținut de grupul dvs.
- -N : Returnează adevărat dacă fișierul a fost modificat de la ultima citire.
- ! : Operatorul logic NOT.
- && : operatorul logic AND.
- || : Operatorul logic SAU.
Lista începe cu -b
deoarece testul -a
a fost depreciat și înlocuit cu testul -e
.
RELATE: Cum să utilizați SUID, SGID și Sticky Bits pe Linux
Utilizarea Testelor în Scripturi
Fișierul generic testează instrucțiunea if
este o construcție simplă de scripting. Comparația dintre parantezele duble ” [[ ]]
” folosește testul -f
pentru a determina dacă există un fișier obișnuit cu acest nume.
Copiați textul acestui script într-un editor și salvați-l într-un fișier numit „script1.sh” și utilizați chmod
pentru a-l face executabil.
#!/bin/bash dacă [[ -f $1 ]] apoi echo "Fișierul $1 există." altfel echo "Fișierul $1 nu poate fi găsit." fi
Trebuie să treceți numele fișierului scriptului de pe linia de comandă.
chmod +x script1.sh
Va trebui să faceți acest lucru cu fiecare script dacă doriți să încercați celelalte exemple din articol.
Să încercăm scriptul pe un fișier text simplu.
./script1.sh test-file.txt
Fișierul există și scriptul raportează corect acest fapt. Dacă ștergem fișierul și încercăm din nou, testul ar trebui să eșueze, iar scriptul ar trebui să ne raporteze acest lucru.
./script1.sh test-file.txt
Într-o situație reală, scenariul dvs. ar trebui să ia orice acțiune este adecvată. Poate semnalează eroarea și se oprește. Poate creează fișierul și continuă. Poate copia ceva dintr-un director de rezervă pentru a înlocui fișierul lipsă. Totul depinde de scopul scenariului. Dar cel puțin acum scriptul este capabil să ia decizia pe baza știrii dacă fișierul este prezent sau nu.
Indicatorul -f
testează dacă fișierul este prezent și este un fișier „obișnuit”. Cu alte cuvinte, nu este ceva care pare a fi un fișier, dar nu este, cum ar fi un fișier de dispozitiv.
Vom folosi ls pentru a verifica dacă fișierul „/dev/random” există și apoi vom vedea ce face scriptul din el.
ls -lh /dev/random
./script /dev/random
Deoarece scriptul nostru testează fișiere obișnuite și „/dev/random” este un fișier de dispozitiv, testul eșuează. Foarte des, pentru a afla dacă un fișier există, trebuie să alegeți cu atenție ce test utilizați sau trebuie să utilizați mai multe teste.
Acesta este „script2.sh”, care testează fișierele obișnuite și fișierele dispozitivului de caractere.
#!/bin/bash dacă [[ -f $1 ]] apoi echo "Fișierul $1 există." altfel echo "Fișierul $1 lipsește sau nu este un fișier obișnuit." fi dacă [[ -c $1 ]] apoi echo "Fișierul $1 este un fișier de dispozitiv cu caractere." altfel echo "Fișierul $1 lipsește sau nu este un fișier special." fi
Dacă rulăm acest script pe fișierul dispozitivului „/dev/random”, primul test eșuează, ceea ce ne așteptăm, iar al doilea test reușește. Recunoaște fișierul ca fișier al dispozitivului.
./script2.sh /dev/random
De fapt, îl recunoaște ca un fișier de dispozitiv de caractere . Unele fișiere de dispozitiv sunt fișiere de blocare a dispozitivului. Așa cum stau lucrurile, scenariul nostru nu le va face față.
./script2.sh /dev/sda
Putem folosi operatorul logic OR
și include un alt test în a doua instrucțiune if. De data aceasta, indiferent dacă fișierul este un fișier de dispozitiv cu caractere sau un fișier de dispozitiv bloc, testul va returna adevărat. Acesta este „script3.sh”.
#!/bin/bash dacă [[ -f $1 ]] apoi echo "Fișierul $1 există." altfel echo "Fișierul $1 lipsește sau nu este un fișier obișnuit." fi dacă [[ -c $1 || -b $1 ]] apoi echo „Fișierul $1 este un fișier cu caractere sau dispozitiv bloc”. altfel echo "Fișierul $1 lipsește sau nu este un fișier special." fi
Acest script recunoaște atât fișierele dispozitiv de caractere, cât și fișierele dispozitiv bloc.
./script3.sh /dev/random
./script3.sh /dev/sda
Dacă este important pentru dvs. să faceți diferența între diferitele tipuri de fișiere de dispozitiv, puteți utiliza instrucțiuni imbricate if
. Acesta este „script4.sh”.
#!/bin/bash dacă [[ -f $1 ]] apoi echo "Fișierul $1 există." altfel echo "Fișierul $1 lipsește sau nu este un fișier obișnuit." fi dacă [[ -c $1 ]] apoi echo "Fișierul $1 este un fișier de dispozitiv cu caractere." altfel dacă [[ -b $1 ]] apoi echo „Fișierul $1 este un fișier de dispozitiv bloc”. altfel echo „Fișierul $1 lipsește sau nu este un fișier de dispozitiv.” fi fi
Acest script recunoaște și clasifică atât fișierele dispozitivului de caractere, cât și fișierele dispozitivului bloc.
./script4.sh /dev/random
./script4.sh /dev/sda
Folosind operatorul logic AND putem testa mai multe caracteristici simultan. Acesta este „script5.sh”. Verifică dacă un fișier există și scriptul are permisiuni de citire și scriere pentru el.
#!/bin/bash dacă [[ -f $1 && -r $1 && -w $1 ]] apoi echo "Fișierul $1 există și avem permisiuni de citire/scriere." altfel echo "Fișierul $1 lipsește, nu este un fișier obișnuit sau nu putem citi/scrie în el." fi
Vom rula scriptul pe un fișier care ne aparține și unul care aparține root
.
./script5.sh .bashrc
./script5.sh /etc/fstab
Pentru a testa existența unui director, utilizați testul -d
. Acesta este „script6.sh”. Face parte dintr-un script de rezervă. Primul lucru pe care îl face este să verifice dacă directorul transmis pe linia de comandă există sau nu. Utilizează operatorul logic NOT
!
în testul declarației if
.
#!/bin/bash dacă [[ ! -d $1 ]] apoi echo „Se creează un director de rezervă:” $1 mkdir $1 dacă [[ ! $? -eq 0 ]] apoi echo „Nu s-a putut crea directorul de rezervă:” $1 Ieșire fi altfel echo „Directorul de rezervă există”. fi # continuați cu copierea de rezervă a fișierului echo „Se face backup la: „$1
Dacă directorul nu există, îl creează. Dacă fișierele de creare a directorului, scriptul se iese. Dacă crearea directorului reușește sau directorul există deja, scriptul continuă cu acțiunile sale de rezervă.
Vom rula scriptul și apoi vom verifica cu ls
și opțiunea -d
(director) dacă directorul de rezervă există.
./script6.sh Documente/proiect-backup
ls -d Documente/proiect-backup
Directorul de rezervă a fost creat. Dacă rulăm din nou scriptul, ar trebui să raporteze că directorul este deja prezent.
./script6.sh
Scriptul găsește directorul și trece la efectuarea copiei de rezervă.
Testează, nu presupune
Mai devreme sau mai târziu, presupunerile vor duce la lucruri rele. Testați mai întâi și reacționați în consecință.
Cunoașterea este putere. Utilizați teste pentru a oferi scripturilor cunoștințele de care au nevoie.
LEGATE: Cum să permiteți scripturilor Linux să detecteze că rulează în mașinile virtuale