Ti sei mai trovato a voler imparare di più sullo scripting della shell di Linux, ma non eri sicuro da dove cominciare? Sei relativamente nuovo nel mondo dei sistemi operativi basati su Unix e vuoi estendere le tue competenze per fare della programmazione di base della shell? Questo tutorial per principianti esaminerà le basi dello scripting della shell di Linux con Bash, compresa la creazione e l’esecuzione di uno script, nonché il lavoro con stringhe e cicli.
Lo scripting della shell è utilizzato per automatizzare compiti amministrativi comuni
Indipendentemente dal sistema operativo, gli script della shell sono utilizzati per automatizzare compiti amministrativi ripetitivi. Ad esempio, in Windows è possibile rinominare file utilizzando Esplora file. Ma se hai bisogno di rinominare molti file, sarebbe un compito che richiederebbe molto tempo utilizzare la shell grafica. PowerShell ti consente di automatizzare il compito e ripeterlo in modo affidabile.
Nei sistemi operativi basati su Linux, Bash e altre shell vengono utilizzate per automatizzare compiti come lavorare con file, modificare la configurazione di sistema e molti altri compiti che altrimenti potrebbero essere eseguiti digitando comandi singoli.
Cosa devi imparare dello scripting della shell Bash
Per scrivere ed eseguire uno script Bash, hai bisogno solo di tre cose:
- Qualsiasi editor di testo semplice, come Notepad, Text Editor, TextEdit, vi, emacs o Visual Studio Code.
- A terminal emulator, an application that comes preinstalled with most operating systems and is often called Terminal, Console, or Command Prompt.
- Bash stesso.
Il terminale emulatore è dove digitherai i comandi e li eseguirai premendo Invio o Return. Per quanto riguarda Bash, se lo hai già installato dipenderà dalla tua piattaforma:
- Su macOS, Bash è preinstallato. Nelle versioni più recenti, la Z shell (zsh) è la shell predefinita, e questo è perfetto. Finché Bash è installato, puoi eseguire script Bash da zsh anche.
- Linux distribuzioni generalmente hanno Bash installato. (Puoi controllare guardando se il tuo sistema include il file /bin/bash.) Android è un caso particolare che non viene fornito con Bash. Ci sono passaggi per installare Bash su Android, che questo articolo non tratterà.
- Windows non viene fornito con Bash. PowerShell è la shell della riga di comando predefinita in Windows. Dovrai installare una distribuzione Linux sotto il Sottosistema Windows per Linux (WSL) per eseguire Bash.
Per trovare la versione di Bash, esegui il comando bash –version. Anche le versioni precedenti di Bash ti offrono molta potenza, ma Bash 3 e 4 introducono entrambe delle belle notazioni di comando ridotte per determinati comandi di base. Se un comando richiede una di queste versioni di Bash, verrà menzionato di seguito.
Cosa è una shell?
Nel mondo informatico, una shell è un programma che funge da interfaccia per il sistema operativo sottostante. Una shell può essere un’interfaccia utente grafica (GUI), come la shell di Windows.
Linguaggi di scripting della shell
Tuttavia, le persone in genere utilizzano il termine per fare riferimento specificatamente a un’interfaccia a riga di comando (CLI) — un’interfaccia composta da righe di testo con cui interagisci utilizzando solo la tastiera. Ecco alcuni esempi di linguaggi di scripting shell per sistemi operativi *nix:
- la shell Bash (abbreviazione di “Bourne Again Shell”)
- la shell C
- la shell Korn
Qui ci concentreremo sulla shell Bash. È una popolare shell Unix gratuita preinstallata sulla maggior parte delle distribuzioni Linux e su macOS.
Cosa è uno script shell?
Le shell hanno il proprio linguaggio di programmazione. Utilizzi questo linguaggio per inviare comandi alla shell, che poi esegue. Puoi digitare direttamente questi comandi nella shell, oppure puoi salvarli in un file — uno script — e poi eseguire tale file dalla shell. La sintassi per scrivere comandi è la stessa in entrambi i casi.
Questo articolo tratterà i concetti di base dello scripting shell per creare questo file.
Basics dello scripting shell
Iniziamo con alcuni concetti basilari dello scripting shell. Per scrivere uno script semplice, impareremo alcuni comandi di base dello scripting shell in Linux:
- Creare un nuovo file di testo vuoto in un editor di testo.
- Scrivere
#!/bin/bash
come prima riga. - Inserire i comandi sotto questa riga.
- Salvare il file, preferibilmente con estensione “.sh” o senza estensione affatto.
La riga #!/bin/bash
è chiamata “shebang”. Indica al tuo shell che questo script deve essere eseguito in Bash e dovrebbe essere la prima riga nello script. Se passi a un shell diverso, lo script verrà comunque eseguito in Bash.
Per provare questo processo da soli, creare un file chiamato ‘hello_world’ nella tua directory home:
#!/bin/bash echo "hello world"
È tutto qui – hai creato uno script Bash!

Prima di poterlo eseguire, probabilmente dovrai modificare i permessi del file.
Impostare i permessi per eseguire uno script shell usando chmod
Per modificare i permessi sul nostro file ‘hello_world’, esegui questo comando specifico nel tuo emulatore di terminale. Questo conferisce all’utente che possiede il file il permesso di eseguire il file.:
chmod u+x 'hello_world'

Se vuoi solo eseguire il tuo script shell, puoi saltare alla sezione successiva. Per chi è curioso riguardo il comando chmod
, chmod
sta per “cambiare il modo”, e serve a cambiare i “modi” (o permessi) dei file in Unix. In sistemi operativi Unix-like, puoi impostare i permessi dei file per 3 classi di utenti:
- L’utente che possiede il file (rappresentato da
u
in chmod). - Il gruppo che possiede il file (
g
). - Gli altri (
o
).
Con il comando chmod
, puoi anche usare a
per fare riferimento a tutti questi.
Ogni file ha 3 tipi di permessi (o “modi”):
- Lettura (
r
) - Scrittura (
w
) - Esecuzione (
x
)
E puoi anche aggiungere (+
) o rimuovere (-
) permessi.
Il primo parametro in chmod è una combinazione di questi tre – utente per primo, azione per secondo e modo per terzo. Ecco alcuni esempi di comandi:
chmod gu+rw 'hello_world'
aggiungerebbe i permessi di lettura e scrittura per il proprietario e il gruppo proprietario.chmod a-x 'hello_world'
rimuoverebbe i permessi eseguibili per tutti.chmod u+rwx 'hello_world' 'hello_world_2'
darebbe al proprietario il permesso di leggere, scrivere ed eseguire i file “hello_world” e “hello_world_2”.
Abbiamo coperto solo i concetti di base del comando chmod
qui. Esiste anche un modo più complicato, ma meno verboso, per definire queste modalità (la “notazione numerica”), così come un comando diverso che puoi usare per vedere quali autorizzazioni hanno i tuoi file (ls -l
). Non approfondiremo questi argomenti qui.
Eseguire uno script shell
È ora di eseguire il nostro primo script. In generale, per eseguire uno script, basta digitare il percorso nel terminale e premere Invio.
./hello_world
Puoi utilizzare il percorso relativo o assoluto. Quando si utilizza il percorso relativo, usa sempre ./
all’inizio del comando: Questo indica al terminale di cercare nella cartella corrente (rappresentata da '.'
), piuttosto che nelle directory definite nella variabile di ambiente PATH
.

Usare commenti per annotare lo script
Tutto ciò che segue un #
su una singola riga in uno script Bash è considerato un commento. Questi possono essere utili per comunicare cosa fa una riga complessa o per dare una panoramica di cosa fanno parti più grandi del tuo script.
Per esempio:
#!/bin/bash # # This shell script prints "hello world". # echo "hello world" # This line prints "hello world".
Un’introduzione alle variabili
Quando si scrivono script, può essere utile definire variabili. In Bash, si fa ciò digitando il nome della variabile e il valore, separati da un segno di uguale: VARIABLENAME='VALORE'
.
Non bisogna mettere spazi accanto al segno di uguale, altrimenti Bash penserà che si voglia eseguire un processo invece.
Usa gli apici singoli per racchiudere il valore e evitare che Bash lo interpreti come qualcos’altro. In Bash, le variabili non hanno tipi — sono fondamentalmente dei stringhe. Spetta ai programmi Bash analizzare la stringa come un tipo diverso, ad esempio un numero.
Per fare riferimento al valore di una variabile, usa il nome della variabile preceduto dal segno di dollaro: $VARIABLENAME
.
Per provare questo nella pratica, puoi modificare lo script in questo modo:
#!/bin/bash HELLO="hello variable world" echo $HELLO # should print "hello variable world"
Ricezione di argomenti
Le singole parole che si scrivono quando si digita un comando sono chiamate argomenti. Nel nostro esempio chmod u+x 'hello_world'
, chmod
, u+x
e 'hello_world'
sono tre argomenti differenti. chmod
è il nome del comando mentre u+x
e hello_world
sono chiamati parametri — argomenti che forniscono informazioni aggiuntive al comando.
Nel tuo script, puoi accedere a questi argomenti attraverso variabili. Per evitare conflitti con le variabili locali, queste variabili sono nominate utilizzando numeri — $0
si riferisce al nome del comando, $1
è l’argomento successivo, $2
quello dopo, e così via.
Proviamo così:
#!/bin/bash HELLO="hello $1 world" echo $HELLO
Ora, esegui questo script con questi parametri:
./hello_world bash script
L’output dovrebbe essere hello bash world
, con il primo parametro utilizzato e il secondo ignorato.
Se volessi che bash script
fossero considerati come un unico parametro, dovresti metterli tra virgolette:
./hello_world 'bash script'

Utilizzo dell’istruzione if per eseguire codice condizionalmente
Una delle cose fondamentali che i programmatori vogliono fare all’interno di uno script è eseguire un pezzo di codice solo se viene soddisfatta una determinata condizione. Bash ha l’istruzione if
per questo:
NUM=$RANDOM if (( $NUM % 2 )) # if CONDITION then echo "$NUM is odd" fi # this is how you end an if statement
Suggerimento: Da questo punto in poi, si assume che questi esempi facciano parte di uno script più ampio e omettono il #!/bin/bash
all’inizio. Non dimenticarlo come prima riga del tuo script, però!
Puoi anche utilizzare else
all’interno di un’istruzione if per specificare cosa fare se una condizione non viene soddisfatta, o un’istruzione elif
(abbreviazione di “altrimenti se”) per specificare un’altra condizione se la prima condizione non è stata soddisfatta:
NUM=$RANDOM if [ $NUM -eq 12 ] then echo "$NUM is my favorite number" elif (( $NUM % 2 )) then echo "$NUM is odd" else echo "$NUM is even"fi
‘fi‘ è utilizzato per chiudere l’istruzione if.
Suggerimento: Se non sei sicuro di come scrivere la condizione stessa, guarda la prova
, le parentesi singole ([]
), e la notazione delle doppie parentesi ((())
).

Ripetere una serie di comandi utilizzando un ciclo for
Ora che abbiamo visto come eseguire il codice condizionalmente, vediamo come eseguire il codice un certo numero di volte finché una condizione è soddisfatta.
Il for
loop è perfetto per questo compito — in particolare la sua sintassi “a tre espressioni”. L’idea alla base è assegnare una variabile specifica del ciclo e cambiarla gradualmente finché una certa condizione è soddisfatta. Ecco come è strutturato:
for (( ASSIGNMENT_EXPRESSION ; CONDITION_EXPRESSION ; UPDATE_EXPRESSION )) do COMMANDS done
Ad esempio, se vuoi che un ciclo venga eseguito 10 volte con valori per i che vanno da 0 a 9, il tuo for
loop potrebbe apparire così:
for (( i=0; i<10; i++ )) do echo $i done
Analizziamolo:
i=0
is the assignment expression here. It’s run only once before the loop is executed, which is why it’s useful for initializing a variable.i<10
is our condition expression. This expression is evaluated before each iteration of a loop. If it is equal to zero (which means the same as “true” in Bash), the next iteration is not run.i++
is our update expression. It’s run after each iteration of a loop.

Scorrere gli elementi in una lista
Oltre alla sintassi a tre espressioni, puoi anche utilizzare la in
parola chiave per definire un for
loop. Questa sintassi alternativa è utilizzata per iterare attraverso una serie di elementi.
L’esempio più basilare è semplicemente elencare il set di elementi attraverso i quali vuoi iterare dopo la parola chiave in
, separati da spazi. Per esempio:
for i in 0 1 2 3 4 5 6 7 8 9 # space-separated list items do echo $i done
Puoi anche iterare attraverso gli elementi prodotti da un comando:
for i in $(seq 0 1 9)
La notazione $()
è utilizzata per la sostituzione di comandi in generale — esegue un comando e il suo output viene utilizzato come input per il comando principale che lo circonda.
Se stai iterando attraverso numeri interi, è meglio utilizzare la sintassi di intervallo integrata di Bash, che è più efficiente del comando seq
. Tuttavia, questa sintassi è disponibile solo nelle versioni più recenti di Bash:
for i in {0..9}
, disponibile in Bash 3.for i in {0..9..1}
, disponibile in Bash 4, dove l’ultimo numero rappresenta l’incremento.
Allo stesso modo, puoi iterare anche attraverso le stringhe:
for s in 'item1' 'item2' 'item3'
Utilizzando il globbing per ottenere file corrispondenti a un motivo
Uno dei casi d’uso più comuni per i cicli for discussi nella sezione precedente è iterare attraverso file individuali.
Per affrontare questo, dobbiamo prima parlare delle cosiddette “espansioni glob”. Questa è una funzionalità di Bash che ti consente di specificare i nomi dei file utilizzando il pattern matching. Ci sono caratteri speciali chiamati caratteri jolly che puoi usare per definire quei pattern.
Prima di approfondire questo argomento, diamo un’occhiata a qualche esempio specifico:
echo *
: Un comando che restituisce i nomi di tutti i file nella tua directory corrente, escludendo quelli nascostiecho *.txt
: Un comando che restituisce i nomi di tutti i file non nascosti con estensionetxt
nella tua directory correnteecho ????
: Un comando che restituisce tutti i nomi di file di quattro caratteri nella tua directory corrente
I
- L’asterisco (
*
) rappresenta un qualsiasi numero di caratteri (anche 0) in un nome di file o directory - Il punto interrogativo (
?
) rappresenta un singolo carattere in un nome di file o directory - Il doppio asterisco (
**
) rappresenta un qualsiasi numero di caratteri in un percorso completo di file. È una funzionalità in Bash 4 e versioni successive e deve essere abilitata eseguendoshopt -s globstar
- Le parentesi quadre (
[]
) sono utilizzate per rappresentare un carattere all’interno di un insieme di simboli in un nome di file o directory. Ad esempio[st]ake
troverebbe i file chiamatisake
otake
, ma nonstake
Si noti che tutti i file nascosti (ovvero i file con nomi che iniziano con un punto .
) vengono ignorati quando si utilizza l’espansione delle glob
La notazione delle parentesi quadre consente una maggiore complessità, inclusa:
- Intervalli definiti dal primo e dall’ultimo valore – ad es.
[1-8]
- Eliminazione di determinati caratteri utilizzando ! come primo carattere all’interno delle parentesi quadre – ad es.
[!3]
Per trattare uno di questi caratteri speciali come un normale carattere senza alcun significato, basta mettere una barra rovesciata prima di esso – ad es. \?
.

Iterazione dei file utilizzando un ciclo for
Ora che abbiamo coperto le basi dell’espansione glob, vediamo come usarla per iterare tra i file.
Possiamo semplicemente utilizzare gli operatori glob nel ciclo for stesso. Ecco un semplice esempio di un ciclo che stampa il nome di ogni file nella directory corrente:
for f in * do echo $f done
Per stampare i nomi di ogni file nella directory corrente e nelle relative sottodirectory, controlla di essere in esecuzione Bash 4.0 o superiore eseguendo bash --version
, e poi puoi eseguire il seguente comando:
shopt -s globstar # enables using ** for f in ** do echo $f done
Suggerimento: Se stai utilizzando una versione più vecchia di Bash, non potrai utilizzare la globbing con un ciclo for per questo. La tua migliore azione sarebbe il comando find
, ma non ne parleremo in questo articolo.
Questi sono, naturalmente, solo alcuni dei cicli più semplici che puoi eseguire, ma c’è molto di più che puoi fare. Ad esempio, per rinominare tutti i file JPG in una cartella per dare loro un nome di file sequenziale coerente, potresti eseguire:
i=1 for f in *.jpg do mv -i -- "$f" "image_$i.jpg" let i=i+1 done

Eseguire il codice mentre una condizione è vera
Il ciclo for non è l’unico tipo di ciclo che possiamo usare in Bash — abbiamo anche il tipo while
: Questo tipo di ciclo viene eseguito finché una specifica condizione è vera.
La sintassi è simile alla sintassi del ciclo for:
while CONDITION do COMMANDS done
Per un esempio pratico, ecco come potresti leggere un file riga per riga (senza spazi vuoti iniziali o finali) fino a quando raggiungi la fine del file:
while read -r line do echo "$line" done < FILENAME # Replace FILENAME with the path to a text file you'd like to read

Puoi anche sostituire un ciclo for con un ciclo while, ad esempio per iterare da 0 a 9:
i=0 while [ $i -lt 10 ] do echo $i let i=i+1 done
E potresti anche teoricamente eseguire un ciclo all’infinito. Ecco un esempio di comando:
while true do echo "running forever" done
Suggerimento: Per interrompere lo script, premi semplicemente Ctrl+C.
Sebbene questo ciclo infinito possa sembrare inutile a prima vista, in realtà può essere piuttosto utile, specialmente se combinato con l’istruzione break
.
Uscire da un ciclo
L’istruzione break
viene utilizzata per uscire da un ciclo.
Questo ti consente di eseguire un ciclo infinito e uscirne quando si verificano eventuali condizioni di uscita.
Per vedere un esempio semplice, possiamo replicare il nostro ciclo che va da 0 a 9 con un ciclo infinito come questo:
i=0while true do if [ $i -eq 10 ] then break fi echo $i let i=i+1 done
Se hai diversi cicli while annidati, puoi aggiungere un numero dopo l’istruzione break per specificare da quale livello di ciclo uscire: break 1
è lo stesso di break
e uscirà dal ciclo più vicino, break 2
uscirà dal ciclo un livello sopra, ecc.
Diamo un’occhiata a un esempio rapido, questa volta con cicli for, iterando attraverso ogni combinazione di parole di quattro lettere fino a quando non si raggiunge la parola “bash”:
for l4 in {a..z} do for l3 in {a..z} do for l2 in {a..z} do for l1 in {a..z} do echo "$l4$l3$l2$l1" if [ $l4 = "b" -a $l3 = "a" -a $l2 = "s" -a $l1 = "h" ] then break 4 fi done done done done
A related keyword that’s also worth a mention is continue
, which skips to the next iteration of the loop. Just like break
, it also takes an optional numeric argument that corresponds to the loop level.
Ecco un esempio sciocco in cui saltiamo tutte le parole con la lettera E nella nostra lista di parole di quattro lettere abbreviate:
for l4 in {a..z} do if [ $l4 = "e" ] then continue fi for l3 in {a..z} do if [ $l3 = "e" ] then continue fi for l2 in {a..z} do if [ $l2 = "e" ] then continue fi for l1 in {a..z} do if [ $l1 = "e" ] then continue fi echo "$l4$l3$l2$l1" if [ $l4 = "b" -a $l3 = "a" -a $l2 = "s" -a $l1 = "h" ] then break 4 fi done done done done
Potremmo anche eseguire tutte queste istruzioni continue
al livello più profondo del ciclo:
for l4 in {a..z} do for l3 in {a..z} do for l2 in {a..z} do for l1 in {a..z} do if [ $l4 = "e" ] then continue 4 fi if [ $l3 = "e" ] then continue 3 fi if [ $l2 = "e" ] then continue 2 fi if [ $l1 = "e" ] then continue fi echo "$l4$l3$l2$l1" if [ $l4 = "b" -a $l3 = "a" -a $l2 = "s" -a $l1 = "h" ] then break 4 fi done done done done

Come ottenere l’input dell’utente in uno script shell
A volte, vuoi che l’utente interagisca direttamente con il tuo script anziché utilizzare solo gli argomenti iniziali dello script. Ecco dove entra in gioco il comando read
.
Per ottenere l’input dell’utente e salvarlo in una variabile chiamata NAME
, useresti questo comando:
read NAME
Questa è la forma più semplice del comando, composta solo dal nome del comando e dalla variabile in cui desideri salvare l’input.
Più frequentemente, però, vorrai chiedere all’utente in modo che sappia cosa scrivere. Puoi farlo con l’argomento -p
, dopo il quale scrivi il prompt preferito.
Ecco come potresti chiedere un nome, assegnandolo a una variabile chiamata NOME
:
read -p "Your name: " NAME echo "Your name is $NAME." # this line is here just to show that the name has been saved to the NAME variable

Stampa dei caratteri speciali in una stringa
Ci sono diversi caratteri in Bash di cui devi prestare attenzione nell’uso. Ad esempio, spazi all’interno dei nomi dei file, virgolette all’interno delle stringhe, o backslash praticamente ovunque.
Per dire a Bash di ignorare il loro significato speciale in certi contesti, puoi o “escapare” i caratteri o racchiuderli in virgolette letterali.
““Escapare” un carattere speciale significa dire a Bash di trattarlo come un semplice carattere senza alcun significato speciale. Per farlo, scrivi un backslash prima di quel carattere.
Immaginiamo di avere un file chiamato img \ 01 *DRAFT*, ad esempio. In Bash, potremmo far riferimento ad esso in questo modo:
img\ \\\ 01\ \*DRAFT\*
Ecco un elenco non esaustivo dei caratteri speciali in Bash:
- Spazi bianchi: spazio, tabulazione, riga vuota
- Virgolette: ”, “”
- Parentesi, graffe e parentesi quadre: ( ), { }, [ ]
- Tubature e reindirizzamenti: |, <, >
- Caratteri jolly: *, ?
- Diversi: !, #, ;, =, &, ~, `
- Il carattere di escape stesso: \
Se sei nuovo in Bash, potrebbe essere complicato ricordare quali caratteri abbiano un significato speciale. Perciò, in molte situazioni, potrebbe essere più semplice utilizzare una virgoletta letterale: Semplicemente racchiudi il testo contenente eventuali caratteri speciali tra virgolette singole, e tutti i caratteri speciali all’interno di esse verranno ignorati.
Ecco come apparirebbe per il nostro esempio:
'img \ 01 *DRAFT*'
E se vuoi utilizzare un carattere speciale, ma fare l’escape degli altri? Potresti fare l’escape di ogni altro carattere usando un backslash, ma puoi anche risparmiarti il problema e circondare tutto tranne quel carattere speciale con virgolette letterali.
Ad esempio, diciamo che hai diversi file chiamati img \ 01 *v1 DRAFT*, img \ 01 *v2 DRAFT*, img \ 01 *ROUGH DRAFT*, ecc., e vuoi utilizzare una glob expansion per corrispondere a tutti quei nomi file. Ecco cosa potresti scrivere:
'img \ 01 *'*' DRAFT*'

Se ciò che devi scrivere contiene un singolo apostrofo – ad es. img \ 01 *’FINAL’* – puoi usare una strategia simile, combinando stringhe letterali e escape:
'img \ 01 '\''FINAL'\'
Come concatenare stringhe in Bash
Diciamo che hai due o più variabili stringa – ad esempio un nome e un cognome:
FIRST_NAME="Johnny"LAST_NAME="Appleseed"
Per combinare queste variabili in una stringa, forse con un delimitatore personalizzato, crea semplicemente una nuova stringa composta da queste due variabili:
NAME="$LAST_NAME"', '"$FIRST_NAME"
Puoi anche utilizzare virgolette doppie con variabili inline per questo, utilizzando parentesi graffe per separare i nomi delle variabili dal testo circostante:
NAME="${LAST_NAME}, ${FIRST_NAME}"
Bash consente anche l’uso dell’operatore += per aggiungere testo a una stringa, così:
NAME='Appleseed'NAME+=', 'NAME+='Johnny'

Eseguire comandi all’interno di una stringa
Bash ti permette anche di utilizzare l’output di un comando all’interno di una stringa, noto anche come sostituzione di comando. Basta circondare il tuo comando con $()
. Ad esempio, per stampare un timestamp corrente, puoi eseguire:
echo "Current timestamp: $(date)"

Potresti anche ricordare questa sintassi da un esempio precedente di ciclo for, quando abbiamo iterato attraverso una sequenza di interi da 0 a 9:
for i in $(seq 0 1 9) do echo $i done
Il comando sostituito viene eseguito in una subshell. Ciò significa che, ad esempio, le variabili create durante il comando non influenzeranno l’ambiente in cui stai eseguendo il tuo script.
Impostazione e restituzione dei codici di uscita in uno script shell
Per uno script più complesso, è consuetudine far restituire un codice di uscita – un numero compreso tra 0 e 255 che dice alle persone se lo script è stato eseguito correttamente o ha riscontrato un errore.
Per quanto riguarda quali numeri utilizzare, il manuale ufficiale di Bash specifica i seguenti:
- 0: Programma eseguito correttamente.
- 2: Programma usato in modo errato (ad esempio a causa di argomenti non validi o mancanti).
- 1 e 3-124: Errori definiti dall’utente.
- 126: Comando non eseguibile.
- 127: Comando non trovato.
- 125 e 128-255: Stati di errore utilizzati dallo shell. Se un processo viene interrotto da un segnale
N
, lo stato di uscita è 128 + N.
Come puoi vedere, tutti i numeri diversi da 0 indicano un tipo di errore. Il codice di uscita 1
è comunemente usato per errori generali. Nella maggior parte dei casi, non avrai bisogno di utilizzare alcun codice di uscita superiore a 2
.
Per restituire un codice di uscita dal tuo script, basta usare il comando exit
. Ad esempio, per uscire con un codice 2, scriveresti exit 2
.
Se non usi il comando exit
nel tuo script o usi il comando senza specificare un codice, sarà restituito lo stato di uscita dell’ultimo comando eseguito nel tuo script.
Per ottenere il codice di uscita dell’ultimo comando eseguito nel tuo shell, utilizza la variabile $?: echo $?
.
Come chiamare una funzione
Nel caso in cui stai scrivendo uno script più lungo o con porzioni di codice ripetitive, potresti voler separare parte del codice in funzioni. Esistono due formati che puoi usare per definire le funzioni: In entrambi i casi, tutto il codice della funzione è contenuto all’interno delle parentesi graffe e si differenzia solo la dichiarazione della funzione.
Il formato più compatto utilizza parentesi che seguono il nome della funzione per dichiarare una funzione:
function_name () { echo "This is where your function code goes" }
L’altro formato utilizza la parola chiave function
davanti a un nome di funzione:
function function_name { echo "This is where your function code goes" }
Le funzioni devono essere dichiarate prima di essere chiamate nello script. Si chiama una funzione esattamente come si esegue un comando regolare, utilizzando il nome della funzione come comando:
function_name
Passaggio di dati a una funzione utilizzando variabili
Nel Bash, le funzioni non possono accettare argomenti. Per inviare informazioni a una funzione, è necessario utilizzare variabili globali nello script.
Per esempio:
is_your_name_defined () { if [ -z "$YOUR_NAME" ] then echo "It doesn't seem like I have your name." else echo "Is this your name: ${YOUR_NAME}?" fi } read -p "Your name: " YOUR_NAME is_your_name_defined
A differenza di quanto potresti essere abituato in altre lingue, le variabili che definisci all’interno della tua funzione sono globali e visibili al codice al di fuori del tuo script. Per definire una variabile con ambito locale solo alla tua funzione (quindi non accessibile a tutto il codice esterno ad essa), utilizza la parola chiave local
: ad esempio local i=0
.
Se desideri restituire valori da una funzione, è necessario utilizzare anche variabili globali. Nel Bash, le funzioni possono solo restituire codici di uscita, utilizzando la parola chiave return
. Vediamo un esempio:
is_your_name_defined () { if [ -z "$YOUR_NAME" ] then MESSAGE="It doesn't seem like I have your name." else MESSAGE="Is this your name: ${YOUR_NAME}?" fi } read -p "Your name: " YOUR_NAME is_your_name_defined echo $MESSAGE

Riepilogo
Lo scripting Bash consente di fare molte cose su un sistema operativo basato su UNIX. Questo articolo ha toccato alcuni concetti di base dello scripting Bash, inclusa la creazione e l’esecuzione di script, il lavoro con le stringhe e l’uso dei cicli nel tuo codice. Ci auguriamo che possa essere un buon punto di partenza per il tuo viaggio nello scrivere potenti script Bash che soddisfino le tue esigenze.
C’è molto altro da imparare riguardo al Bash, inclusi alcuni dei comandi più utili, la navigazione nel filesystem e altro ancora. Facci sapere nei commenti quali argomenti dovremmo trattare in seguito.
Articolo correlato: