Impara gli operatori di test dei file di Bash con esempi

Bash è incredibilmente flessibile e offre varie opzioni per testare i file. E se stai cercando un modo per testare i tuoi file, gli operatori di test dei file di Bash ti porteranno lontano.

In questo tutorial, imparerai diversi operatori di test dei file e come utilizzarli per verificare se un file esiste, se è leggibile, se è vuoto, e così via.

Continua a leggere e diventa amico degli operatori di test dei file di Bash!

Prerequisiti

Questo tutorial sarà una dimostrazione pratica. Se desideri seguirla, assicurati di avere quanto segue:

  • A Linux system with Bash installed – This tutorial uses Ubuntu 20.04.

La maggior parte delle distribuzioni Linux ha Bash installato di default. Ma se stai usando Windows, puoi installare il Sottosistema Windows per Linux (WSL) per ottenere una shell Bash.

  • 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.
  • Questo tutorial presuppone che tu abbia accesso SSH al tuo sistema Linux.

Cosa sono gli operatori di test dei file Bash?

Prima di mettere le mani sugli operatori di test, dai un’occhiata a come funzionano. Gli operatori di test dei file ti consentono di verificare vari aspetti di un file, come ad esempio se un file esiste, è leggibile/scrivibile, ecc.

L’utilizzo degli operatori di test dei file può aiutare a prevenire errori nei tuoi script Bash. Il codice qui sotto è uno scheletro per l’istruzione if. L’istruzione if-else è uno strumento potente che vedrai spesso negli script Bash.

Ricorda che le parti then ed else del blocco di codice sono opzionali. Puoi utilizzare un’istruzione if anche senza di esse.

# Rappresenta il file che desideri testare.
# Sostituisci file_name con il nome del file di destinazione da testare.
FILE="file_name"
# Operatore: L'operatore di test del file da utilizzare.
if [ Operator $FILE ]

then
 # Attività da eseguire se l'operatore restituisce true.
 do something

else
 # Attività da eseguire se l'operatore restituisce false.
 do something

fi

Verifica se un file esiste

Hai visto un’anteprima di come funzionano gli operatori di test, ma questo non è sufficiente per capirne a fondo l’uso. Cominciamo con un esempio di base, come verificare se un file esiste.

Nel mondo reale, potresti voler verificare se esiste un file di configurazione prima di crearne uno. Non vuoi perdere tempo a costruire un file di configurazione da zero solo per scoprire che ne esiste già uno simile.

Per verificare se un file esiste già:

1. Apri il tuo terminale e esegui il comando touch qui sotto per creare un nuovo file test.txt. Questo comando non fornisce un output, ma verificherai il file nel passo successivo.

touch test.txt

2. Successivamente, esegui il seguente comando ls per elencare il file appena creato (test.txt) nella tua directory di lavoro.

ls -al test.txt

L’output qui sotto verifica che hai creato con successo il file test.txt.

Ora che hai un file di test, puoi utilizzare il blocco di codice standard in uno script Bash per verificare se il file esiste nei passaggi seguenti.

Listing the newly-created file

3. Esegui il comando sottostante per creare (touch) e aprire un nuovo file di script shell (if_file_exists.sh) nel tuo editor di testo preferito (nano).

touch if_file_exists.sh && nano if_file_exists.sh

4. Adesso, inserisci il codice qui sotto nel tuo nuovo file if_file_exists.sh, salva il file e chiudi l’editor.

  • Esegue un’istruzione if-else per verificare se esiste un file specificato.
  • Se l’operatore restituisce vero, riceverai un messaggio che indica che il file esiste.
  • Se l’operatore restituisce vero, riceverai un messaggio che indica che il file non esiste. Ma questa volta, il file viene creato automaticamente, prendendo il nome che hai definito nella variabile FILE.

La riga #!/bin/bash in cima al file è conosciuta come shebang. Una shebang indica al tuo sistema quale interprete utilizzare per eseguire lo script, in questo caso, Bash. Se non includi una shebang, il sistema utilizza l’interprete predefinito, che potrebbe non essere Bash. L’assenza della shebang può causare il fallimento dello script.

#!/bin/bash
# FILE - Una variabile che contiene il valore del file che vuoi testare.
# Puoi riutilizzare lo stesso blocco di codice per testare file diversi 
  # cambiando il valore della variabile $FILE.
FILE="test.txt"

# L'operatore -e verifica l'esistenza del file
if [ -e $FILE ]
then
  # Se l'operatore restituisce vero, stampa un messaggio che indica che il file esiste.
  echo "$FILE exists"
else
  # Se l'operatore restituisce vero, stampa un messaggio che indica che il file non esiste,
    # quindi crea il file con il nome che hai definito nella variabile FILE.
  echo "$FILE does not exist, creating new file" && touch test.txt
fi

5. Esegui il comando sottostante per eseguire il tuo nuovo script (if_file_exists.sh)

bash if_file_exists.sh

Se tutto va bene, vedrai stampato il messaggio che indica che il file test.txt esiste nel tuo terminale, come mostrato di seguito.

test.txt exists

6. Successivamente, esegui i seguenti comandi per eliminare (rm -rf) il file di test (test.txt) e elencare tutti i file nella tua directory di lavoro.

rm -rf test.txt
ls test.txt

Qui sotto, puoi verificare che il file test.txt non è più elencato.

Deleting the test file

7. Riesegui il comando sottostante per eseguire lo script if_file_exists.sh.

Dato che il file test.txt non esiste più, lo script crea un nuovo file test.txt quando l’operatore -e restituisce false.

bash if_file_exists.sh
Rerun your if_file_exists.sh script

8. Infine, esegui il comando ls qui sotto per elencare il file test.txt nella tua directory di lavoro.

ls -al test.txt

La produzione qui sotto conferma che il tuo script ha creato un nuovo file test.txt.

Listing the new test.txt file

Verifica se un file è un file regolare o speciale

Prima di aprire o elaborare un file, potresti voler verificare prima se quel file è regolare o speciale. Perché? Un file speciale è un tipo di file memorizzato in un sistema di file, quindi fai attenzione a non pasticciare con questi file.

Ad esempio, un errore comune quando si apre un file speciale è l’errore “File o directory non esistente”. Questo errore si verifica quando il file che stai cercando di aprire non esiste. Ma lo stesso errore può verificarsi anche quando si apre un file speciale invece di uno regolare.

Apri un nuovo file special_file.sh nel tuo editor di testo, aggiungi il seguente codice e salva le modifiche.

Il codice qui sotto è simile a quello precedente. Ma questo codice utilizza l’operatore -f invece dell’operatore -e. L’operatore -f verifica se un file specificato (/dev/vmmon) è un file regolare.

#!/bin/bash
# Il file /dev/vmmon è un file speciale
  # usato per comunicare con dispositivi hardware in Linux.
FILE="/dev/vmmon"

# Verifica se il file 
if [ -f $FILE ]
then
  # Se l'operatore restituisce true, otterrai un messaggio che dice
    # che il file è un file regolare.
  echo "$FILE is a regular file"

else
  # Se l'operatore restituisce true, otterrai un messaggio che dice 
    # che il file non esiste o è un file regolare.
  echo "Either $FILE does not exist or is not a regular file"

fi

Ora, esegui il comando qui sotto per eseguire il tuo script special_file.sh.

bash special_file.sh

Dato che il file (/dev/vmmon) specificato nella variabile FILE è un file speciale, otterrai il messaggio seguente.

Checking if a file is a regular file

Verifica se una directory esiste

Fino ad ora, hai imparato come verificare se un file esiste. Ma lo stesso metodo si applica alle directory? Sì, utilizzando l’operatore di test -d. Questo operatore è utile se hai intenzione di agire in base all’esistenza o meno di una directory.

Forse vuoi copiare tutti i file da una directory a un’altra. Se la directory di destinazione non esiste, puoi crearla prima di copiare i file.

1. Esegui il comando ls di seguito per elencare l’esempio-dir dalla directory di lavoro.

ls -la example-dir

Otterrai un messaggio che dice “File o directory non esistente” poiché la directory non esiste. Se non vuoi che il flusso venga interrotto solo perché una directory non esiste, passa al passo successivo.

Listing the example-dir from the working directory

2. Successivamente, apri un nuovo file chiamato if_dir_exists.sh nel tuo editor di testo, aggiungi il codice di seguito e salva il file. Il codice seguente verifica se una directory specificata esiste ed esegue compiti a seconda del valore restituito dall’operatore -d.

Puoi ottenere lo stesso risultato invertendo le dichiarazioni if ed else utilizzando l’operatore di negazione (!). In situazioni reali, l’operatore ! può aiutare a scrivere uno script più pulito e più conciso.

#!/bin/bash
# Definisci il nome della directory nella variabile dir
dir=example_dir

# Verifica se la directory (dir) esiste
if [ ! -d $dir ]
then
  # Se l'operatore restituisce true, crea una directory con il valore della variabile dir
  mkdir $dir
  # Copia il file test.txt nella directory appena creata
  cp test.txt $dir
  # Stampa un messaggio riguardo ai compiti eseguiti sopra.
  echo "The directory has been created, and the test.txt file has been copied."
else
  # Se l'operatore restituisce false, 
    # il comando echo stampa un messaggio che dice che la directory esiste.
  echo "Directory $dir exists"
fi

3. Ora, esegui il comando di seguito per eseguire lo script (if_dir_exists.sh)

bash if_dir_exists.sh

Puoi vedere il messaggio che dice che la directory è stata creata e il file test.txt è stato copiato poiché l’example_dir non esiste.

Executing the if_dir_exists.sh to test if a directory exists

4. Infine, esegui il comando ls contro la directory example_dir per confermare che la directory esista e contenga il file test.txt.

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

Verifica se un file è vuoto

Già sai come utilizzare i tre operatori di test di file più utilizzati (-e, -f e -d) per migliorare le tue capacità di scripting. Ma ci sono ancora altri operatori che potresti voler esaminare.

Tipicamente, invece di evidenziare i contenuti di un file da copiare in un altro file, eseguiresti un comando per fare il lavoro al posto tuo. Ma aspetta un attimo, poiché il file di destinazione potrebbe non essere vuoto.

Perché non utilizzare l’operatore -s per verificare se un file esiste e non è vuoto? Questo operatore restituisce true se il file esiste e ha una dimensione maggiore di zero.

1. Apri un nuovo file chiamato empty_file.sh nel tuo editor di testo, aggiungi il seguente codice e salva il file.

Il seguente codice verifica se un file specificato è vuoto e stampa un messaggio a seconda del valore restituito dall’operatore -s.

#!/bin/bash
# Definisce il nome del file di destinazione
FILE=test.txt

# L'operatore -s verifica se il file di destinazione esiste e non è vuoto
if [ -s $FILE ]
then
  # Se l'operatore restituisce true, il comando echo stampa un messaggio
    # dicendo che il file esiste e non è vuoto.
  echo "$FILE exists and is not empty"
else
  # Se l'operatore restituisce false, il comando echo stampa un messaggio 
    # dicendo che il file non esiste o è vuoto.
  echo "$FILE either does not exist or is empty"
  # Aggiunge testo al file di destinazione
  echo "This is a test. This is not an empty file" > $FILE
fi

2. Ora, esegui il comando sottostante per eseguire lo script (empty_file.sh).

bash empty_file.sh

Qui sotto, puoi vedere il messaggio che dice che test.txt non esiste o è vuoto. Ma contemporaneamente, lo script aggiunge testo al file test.txt.

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

3. Esegui il comando cat qui sotto per verificare che il file test.txt contenga il testo aggiunto.

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

4. Infine, esegui nuovamente il comando bash qui sotto per eseguire lo script empty_file.sh.

bash empty_file.sh

Qui sotto, puoi vedere che l’output è cambiato in test.txt esiste e non è vuoto poiché il file test.txt contiene ora del testo e ha una dimensione maggiore di zero (0).

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

Verifica se un File Esiste ed è Leggibile

Forse la tua automazione coinvolge la lettura di file per eseguire compiti. Il successo di questi compiti dipenderà dalla leggibilità dei file. Scrivere uno script per verificare se un file esiste ed è leggibile sarà utile come soluzione.

Per dimostrare se un file esiste e può essere letto:

1. Esegui il seguente comando per accedere a un altro account utente (ata).

su - ata

Il prompt cambia ($) per indicare che hai eseguito l’accesso come altro utente.

Logging in to another user account

In alternativa, puoi modificare i permessi del file in leggibile, scrivibile o entrambi con il comando chmod.

2. Una volta effettuato l’accesso, crea un nuovo file chiamato readable_file.sh con il tuo editor di testo

Aggiungi il seguente codice al file readable_file.sh, e salva le modifiche. Questo codice verifica se un file chiamato test.txt nella directory /root esiste e può essere letto.

#!/bin/bash
# Definisci il file di destinazione
FILE=test.txt

# Verifica se il file di destinazione è leggibile.
# Puoi cambiare -r in -w per verificare se un file è scrivibile invece.
if [ -r $FILE ] 
then  
  # Se l'operatore restituisce true, stampa un messaggio che dice
    # che il file esiste e può essere letto.
  echo "$FILE exists and is readable" 
else  
  # Se l'operatore restituisce false, stampa un messaggio che dice
    # che il file non esiste o non può essere letto.
  echo "$FILE does not exist or is unreadable"
fi

3. Ora, esegui il seguente comando per eseguire lo script readable_file.sh.

bash readable_file.sh

Questa volta, vedrai un messaggio che dice che /root/test.txt non esiste o non è leggibile. Poiché il file text.test si trova nella directory /root, l’utente attuale (ata) non ha le autorizzazioni di lettura per il file text.txt.

Executing the readable_file.sh script

Infine, esegui i comandi seguenti per eseguire le seguenti operazioni:

  • Modifica il file sudoers per consentire all’utente attuale (ata) di utilizzare sudo per eseguire comandi elevati.
  • Esegui lo script readable_file.sh, che controlla se un determinato file è leggibile.
sudo bash
bash readable_file.sh

Puoi vedere qui sotto che l’output stampa test.txt esiste ed è leggibile perché l’utente ata ha ora il permesso di lettura per il file test.txt.

Changing the sudoers file and executing the readable_file.sh script

Conclusione

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.

Con queste nuove competenze, puoi decidere con fiducia quale azione intraprendere in base al risultato dei test. Ma ci sono molti altri modi in cui puoi utilizzare gli operatori di test dei file Bash.

Perché non provare a controllare l’estensione di un file? O forse controllare se esistono più file per vedere se tutti i file di cui hai bisogno sono disponibili?

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