HTML.it logo
Learn
  • Design
    • Grafica
    • User Interface Design
    • Adobe Creative Suite
    Guide
    Approfondimenti
    Faq
    Notizie
    Tutto in Design >
  • Development
    • .NET
    • ASP
    • CMS
    • Flash
    • Java
    • JavaScript
    • PHP
    • Essentials
    • Ruby
    • XML
    • Editor
    • CSS
    • HTML
    Guide
    Approfondimenti
    Script
    Faq
    Notizie
    Tutto in Development >
  • Mobile
    • Android Studio
    • Cordova
    • Eclipse
    • Objective C
    • Swift
    Guide
    Approfondimenti
    Script
    Faq
    Notizie
    Tutto in Mobile >
  • Server
    • Cloud
    • Database
    • OS
    • Sicurezza
    • Network
    Tutto in Server >
  • Digital Marketing
    • SEO
    • Affiliate Marketing
    • Social Media Marketing
    Tutto in Digital Marketing >
  • Makers
    • Arduino
    • RaspberryPi
    • Stampa 3D
    Guide
    Approfondimenti
    Notizie
    Tutto in Makers >
  • Game Design
    • Unity
    Guide
    Approfondimenti
    Notizie
    Tutto in Game Design >
Download
  • Audio e Video
    • Player Audio Video
    • Codec audio
    • Editor audio video
    • Masterizzazione
    • Ripper e Convertitori
    • Speech
    Tutto in Audio e Video >
  • Educazione
    • Bambini
    • Cucina
    • Salute e Benessere
    • Istruzione
    Tutto in Educazione >
  • Giochi
    • Arcade
    • Avventura
    • Azione
    • Board
    • Carte
    • Giochi di ruolo
    • Giochi Online
    • Puzzle e Enigmistica
    • Simulazione
    • Sparatutto
    • Sport
    • Strategia e Giochi di Guerra
    • Tempo Libero
    Tutto in Giochi >
  • Grafica
    • Accessori & Mappe
    • Animazione
    • CAD – 3D
    • Cattura schermo
    • Convertitori e ridimensionatori
    • Editor
    • Flash
    • Font
    • Fotoritocco
    • Gallerie e album
    • Icone e loghi
    • Visualizzatori
    Tutto in Grafica >
  • Internet
    • Browser
    • Chat e IM
    • eMail
    • Estensioni & Temi
    • FTP
    • Network
    • News e RSS
    • Peer to Peer
    • Webcam
    Tutto in Internet >
  • Programmazione
    • Accessori
    • CMS e E-Commerce
    • Editor e Compilatori
    • Editor e strumenti Web
    • Linguaggi
    Tutto in Programmazione >
  • Sicurezza
    • Antispam
    • Antispyware
    • Antivirus
    • Server
    Tutto in Sicurezza >
  • Produttività
    • Backup
    • Compressione
    • Connettività
    • Database
    • Fax e Telefonia
    • Gestione disco
    • Ottimizzazione
    • Ufficio
    • Utilità di Sistema
    Tutto in Produttività >
Notizie
Video
Forum
in  
Trend
JavaScriptPHPHTMLLinguaggio CPythonDigital MarketingProgrammazioneWordPressJavaGame Design
INDICE DELLA GUIDA
Introduzione
  1. 1 Introduzione allo Shell Scripting

Shell Scripting di Base
  1. 2 Hello World: il primo script

  2. 3 Utilizzare le variabili

  3. 4 Variabili built-in

  4. 5 Array

  5. 6 Operatori aritmetici e logici

  6. 7 Il comando test

  7. 8 Costrutti condizionali: if e case

  8. 9 Iterazioni: i cicli for, while ed until

  9. 10 Funzioni

Scripting avanzato
  1. 11 Quoting: differenze tra apici e virgolette

  2. 12 Redirezione dell'I/O

  3. 13 Espressioni regolari e caratteri speciali

  4. 14 Exit: terminare uno script

Appendice
  1. 15 Debugging: consigli utili

  2. lezione
    16 di 16

    Shell Script, un esempio completo

  • Learn
  • Shell Scripting e Bash: la Guida
  • Shell Script, un esempio completo
lezione
16 di 16

Shell Script, un esempio completo

  • di Tommaso Turchi
  • 19 Novembre 2015

In quest’ultima lezione vedremo un esempio di applicazione dei costrutti introdotti nelle sezioni precedenti, realizzando uno script Bash completo. Lo script si occuperà di cercare ricorsivamente, in una directory, file contenenti un determinato pattern, salvandone il percorso in un file di testo e stampando a schermo il numero di file individuati.

Questo ci permetterà di mettere insieme diversi costrutti visti separatamente finora, e scoprire come Bash possa essere usato per portare a termine attività ripetitive ma semplici, che ci occuperebbero altrimenti moltissimo tempo.

Lo script che analizzeremo nel dettaglio è il seguente:


#!/bin/bash
	 	

cerca()
{
  local CONT=0
    for elem in `ls -d $1/*`
    do
    if [[ -f $elem ]]; then
      grep -Fxq $2 $elem
      if [[ $? == 0 ]]; then
        echo $elem >> $3
        ((CONT++))
      fi
    elif [[ -d $elem ]]; then
      cerca $elem $2 $3
      local SUB=$?
      CONT=$((SUB + CONT))
    fi
    done
  return $CONT
}
if [[ -z "$1" || -z "$2" || -z "$3" ]]; then
  echo "ERRORE: Parametri non corretti!" >&2
  exit 1
elif [[ ! -d $1 ]]; then
  echo "ERRORE: Directory $1 non esistente!" >&2
  exit 1
else
  cerca $1 $2 $3
  echo "Trovati $? file in $1 contenenti il pattern $2 e salvati in $3."
fi

Si possono distinguere subito diversi comandi che abbiamo visto precedentemente: il costrutto condizionale if, una dichiarazione di funzione, comandi aritmetici, un ciclo for, il comando exit, l’operatore di redirezione dell’I/O.

Come abbiamo visto nella lezione 10, una funzione viene registrata dal sistema, ma i comandi in essa contenuti non vengono eseguiti finché la funzione stessa non viene richiamata. Iniziamo perciò dal corpo dello script, che consiste in un solo comando if:


if [[ -z "$1" || -z "$2" || -z "$3" ]]; then
  echo "ERRORE: Parametri non corretti!" >&2
  exit 1
elif [[ ! -d $1 ]]; then
  echo "ERRORE: Directory $1 non esistente!" >&2
  exit 1
else
  cerca $1 $2 $3
  echo "Trovati $? file in $1 contenenti il pattern $2 e salvati in $3."
fi

Questa porzione di script si occupa di controllare che i parametri forniti siano corretti e richiamare la funzione cerca, stampando un errore nel file descriptor di errore (stderr) in caso contrario.

La prima condizione -z controlla che la stringa seguente non sia vuota. Viene utilizzata in questo caso per controllare che l’utente abbia indicato i tre parametri richiesti dallo script: il primo è la directory nella quale iniziare la ricerca, il secondo il pattern da individuare e l’ultimo rappresenta il nome del file in cui sarà salvato il risultato. Le tre condizioni vengono concatenate dall’operatore ||, che permette all’intera guardia dell’if di essere verificata nel caso in cui almeno una di esse risulti vera (in altre parole, se anche uno solo dei parametri è mancante, viene prodotto il messaggio di errore).

Il messaggio di errore viene reindirizzato verso il file descriptor stderr mediante l’operatore >&2. L’intero script viene perciò interrotto e il codice di uscita sarà quello di errore (1).

Se tutti i parametri sono presenti, la seconda guardia dell’if si occupa di controllare che il primo parametro fornito sia davvero una directory esistente tramite l’operatore -d; in caso contrario viene stampato un messaggio di errore e si esce dallo script come nel caso di mancanza di un parametro.

Infine, se i parametri inseriti sono corretti e la directory fornita esiste, lo script richiama la funzione cerca fornendole i tre parametri, ed infine stampa il conteggio dei file trovati memorizzato nel valore di ritorno della funzione ($?).

Veniamo adesso al corpo della funzione:


cerca()
{
  local CONT=0
    for elem in `ls -d $1/*`
    do
    if [[ -f $elem ]]; then
      grep -Fxq $2 $elem
      if [[ $? == 0 ]]; then
        echo $elem >> $3
        ((CONT++))
      fi
    elif [[ -d $elem ]]; then
      cerca $elem $2 $3
      local SUB=$?
      CONT=$((SUB + CONT))
    fi
    done
  return $CONT
}

Lo scopo di questa funzione è quello di contare il numero di file contenenti il pattern nella directory fornita, e sommarlo a quello relativo alle sottodirectory in essa contenute.

Iniziamo col definire la variabile (locale, altrimenti le diverse chiamate ricorsive utilizzerebbero risultati errati) CONT, che riporta il numero di file contenenti il pattern nella directory corrente (inizialmente 0). Il ciclo for passa in rassegna tutti gli elementi della directory corrente (ritornati come risultato del comando ls -d $1/*, che riporta il loro percorso completo) e ne analizza il tipo: nel caso di un file (operatore -f nel comando if) si controlla se quest’ultimo contiene il pattern specificato attraverso il comando grep, il cui codice di ritorno vale 0 in caso affermativo, 1 altrimenti. Nel primo caso ($? == 0) il percorso del file viene aggiunto al file risultato tramite l’operatore di redirezione dell’output >>, e si aumenta il numero di file trovati nella directory corrente. Nel caso di una directory, invece (operatore -d nel comando if), viene effettuata la chiamata ricorsiva alla stessa funzione cerca, passando la directory stessa come parametro di ricerca (e stesso pattern e file di output). Il risultato della chiamata ricorsiva (cioè il numero di file contenuti nella sottodirectory) viene poi aggiunto al conteggio dei file in quella corrente (SUB + CONT). Infine, si ritorna il numero di file totale utilizzando il comando return.

Quello appena analizzato era solo un semplice esempio di come utilizzare i costrutti forniti da Bash per rendere automatica un’attività che, altrimenti, ci avrebbe portato via molto più tempo. In questo risiede la potenza di Bash: con semplici istruzioni è possibile manipolare i componenti del sistema operativo per svolgere automaticamente attività ripetitive e tediose in maniera semplice, intuitiva e portabile su diverse piattaforme.

Se vuoi aggiornamenti su Linux inserisci la tua e-mail nel box qui sotto:

Se vuoi ricevere informazioni personalizzate compila anche i seguenti campi:

Ultime notizie

ThisPersonDoesNotExist: generatore automatico di volti realistici

Microsoft: disattivare Windows Defender non risolve i problemi di WSL

Python 3.8 su Fedora 31?

Copyright: cosa prevede (veramente) la Direttiva

Red Hat: basta con MongoDB, largo a PostgreSQL

I Video di HTML.it

Realizzare un ritratto formato da una serie di font

Percorsi formativi correlati
Android Mobile Developer

Android Mobile Developer

5
guide
250 ore

Tutti i linguaggi per diventare uno sviluppatore di app per Android.

DB Administrator

DB Administrator

4
guide
80 ore

Come creare applicazioni per il Web con PHP e MySQL per il DBMS.

iOS Mobile Developer

iOS Mobile Developer

4
guide
180 ore

Tutte le principali tecnologie per diventare uno sviluppatore mobile per iOS.

Java Developer

Java Developer

7
guide
300 ore

I fondamentali per lo sviluppo di applicazioni multi piattaforma con Java.

Java Security Expert

Java Security Expert

5
guide
120 ore

Diventare degli esperti in tema di sicurezza delle applicazioni Java.

Maker

Maker

2
guide
50 ore

Usare Raspberry Pi e Arduino per avvicinarsi al mondo dei Maker e dell’IoT.

NoSQL DB Expert

NoSQL DB Expert

5
guide
200 ore

Le principali guide di HTML.it per diventare un esperto dei database NoSQL.

PHP Cloud Developer

PHP Cloud Developer

7
guide
80 ore

Ecco come i professionisti creano applicazioni per il Cloud con PHP.

PHP Developer

PHP Developer

5
guide
100 ore

Lo sviluppo professionale di applicazioni in PHP alla portata di tutti.

PHP e JavaScript Developer

PHP e JavaScript Developer

6
guide
100 ore

Come sviluppare applicazioni Web dinamiche con PHP e JavaScript.

PHP Framework Expert

PHP Framework Expert

6
guide
120 ore

Realizzare applicazioni per il Web utilizzando i framework PHP.

PHP SysAdmin

PHP SysAdmin

6
guide
80 ore

Creare applicazioni PHP e gestire l’ambiente di sviluppo come un pro.

Sviluppare un eCommerce con PHP

Sviluppare un eCommerce con PHP

5
guide
120 ore

Fare gli eCommerce developer con Magento, Prestashop e WooCommerce.

Web & Mobile Designer

Web & Mobile Designer

5
guide
300 ore

Percorso base per avvicinarsi al web design con un occhio al mobile.

WordPress Developer

WordPress Developer

5
guide
150 ore

Realizzare siti Web e Web application con WordPress a livello professionale.

Ti consigliamo anche

Shell Scripting e Bash: la Guida

  • 16 Lezioni
  • Moderata

Bash è la Shell di Linux più utilizzata e diffusa. Essa permette di interagire con il sistema operativo, sia tramite i comandi di base, che combinando questi ultimi in script più complessi. Questa guida completa e pratica offre le basi per imparare a programmare con Bash, partendo dalla sintassi fino alle funzionalità più avanzate, con tanti esempi di codice.

  • Bash su Windows: la guida
  • Bash 5.0, tutte le novità

10 comandi utili e divertenti per Linux

Una carrellata con 10 comandi insoliti, che possono tornare utili ma soprattutto rendere più divertente l'interazione con il terminale di Linux.

  • ThisPersonDoesNotExist: generatore automatico di volti realistici
  • Microsoft: disattivare Windows Defender non risolve i problemi di WSL

Azure API Management: primo supporto alle OpenAPI Specification v3

Slax Linux: il Pinguino in tasca

Linux e la bufala dei sorgenti rimossi dal Kernel

  • Guide
  • Approfondimenti
  • Script
  • Q&A
  • Software
  • Tutorial
  • Videogiochi
  • Tag Software
  • News
  • Video
  • Forum
  • Chi siamo
  • Pubblicità
  • Contatti
  • Cookie policy
  • Privacy policy
  • Privacy Policy Newsletter
© HTML.it 1997-2019 | Triboo Media – P. IVA 06933670967 | HTML.it è un periodico telematico reg. Trib. Roma n. 309/2008 | 2.9.5