Problemi in questa pagina? Segnalali in questa discussione

Introduzione

Bash (acronimo per bourne again shell) è una shell del progetto GNU usata nei sistemi operativi Unix-like e specialmente in GNU/Linux.
Si tratta di un interprete di comandi che permette all'utente di comunicare col sistema operativo attraverso una serie di funzioni predefinite e di eseguire programmi.

Tecnicamente bash è un clone evoluto della shell standard di Unix (/bin/sh), chiamata anche Bourne Shell da Stephen Bourne, nome del suo autore originario. Il nome esteso Bourne again shellun'altra shell Bourne») contiene un gioco di parole in quanto la sua pronuncia in lingua inglese risulta simile a «Born again shell» («shell rinata»).

In pratica Bash può essere considerata come un processore di macro. Alcune delle sue principali caratteristiche sono le seguenti:

Bash è qindi uno strumento ricco di funzionalità, che tuttavia potrebbero essere poco note agli utenti novizi. Per questo la guida si propone come una raccolta (non esaustiva) di consigli e "trucchi" relativi all'utilizzo dello scripting in Bash.

Variabili

Le variabili in bash scripting non hanno bisogno di inizializzazione. L'assegnazione avviene usando la forma:

VAR=valore

È molto importante che il valore sia scritto subito dopo l'uguale senza nessuno spazio. I riferimenti a tutte le variabili si scrivono anteponendo il carattere $ al nome della variabile:

VAR=world
echo hello $VAR!

Variabili speciali

Esecuzione comandi

Dato che non è un vero linguaggio di programmazione, molte funzionalità non sono incluse nel bash scripting ma sono comunque usabili tramite dei programmi esterni.

Per prima cosa è utile sapere che per leggere l'output di un programma e, per esempio, inserirlo in una variabile si usa la forma:

VAR=`uname -r`
echo `pwd`

oppure:

VAR=$(uname -r)
echo $(pwd)

Tramite i caratteri di back-quote (ALT GR + ' ) o il carattere dollaro (Shift + 4) l'interprete bash esegue il comando e sostituisce con l'output tutta la chiamata. In questo caso, al posto di `uname -r` o $(uname -r), è equivalente una scrittura del tipo:

VAR=5.13.0-28
echo /usr/src/linux

Programmi utili

Per maggiori informazioni sui singoli comandi si rimanda ai manuali dei relativi programmi.

Manipolazione delle stringhe

Tradizionalmente, nelle shell Unix-like, la manipolazione delle stringhe viene fatta attraverso programmi esterni alla shell come sed, awk e perl.

Questi programmi vengono ancora usati quando si vuole mantenere la compatibilità con la shell sh. Tuttavia imparare anche il solo sed (il più semplice dei tre) non è cosa immediata.

Se si usa Bash non è necessario usare nessun programma esterno, ma basta imparare i tre operatori fondamentali e alcuni concetti di base per poter eseguire tutte le manipolazioni più comuni.

In Bash una stringa non è altro che una variabile. Dunque si indica con ${nome} oppure con la forma abbreviata $nome. Il nome dentro le graffe può essere seguito da un modificatore che manipola la variabile, ad esempio:

 VAR="stringa-di-esempio"
 echo ${VAR#stringa-}

elimina "stringa-" dall'inizio della variabile.

I modificatori sono molti, ma possono essere facilmente ricordati se si imparano i tre fondamentali:

Questi operatori sono minimali. Ciò vuol dire che se si usano le espressioni regolari per indicare la sotto-stringa (da eliminare o sostituire) verrà individuata in caso di ambiguità la sotto-stringa più piccola (o solo la prima nel caso della sostituzione).

Per ottenere gli operatori massimali basta raddoppiare il simbolo:

Gli operatori massimali cercano di individuare la sotto-stringa più grande che corrisponde all'espressione regolare (nel caso del modificatore // tutte le sotto-stringhe vengono sostituite). Gli operatori di questo tipo vengono comunemente detti anche greedy («ingordi»).

Per ulteriori informazioni più dettagliate su tutti i modificatori e le altre modalità di manipolazione delle stringhe in Bash consultare questa guida.

Esempio: Manipolazione delle stringhe

 VAR="questa.è.una.stringa.di.esempio"
 
                                    # Risultato:
 
 echo ${VAR#*.}      # --> è.una.stringa.di.esempio
 echo ${VAR##*.}     # --> esempio
 
 echo ${VAR%.*}      # --> questa.è.una.stringa.di
 echo ${VAR%%.*}     # --> questa
 
 echo ${VAR/st/ST}   # --> queSTa.è.una.stringa.di.esempio
 echo ${VAR//st/ST}  # --> queSTa.è.una.STringa.di.esempio

Alternativa a basename

Quando in uno script occorre fare riferimento al nome dello script stesso, è usuale utilizzare il comando basename (esterno a Bash). Tuttavia, tramite i modificatori del paragrafo precedente, Bash stessa è in grado di fornire questa funzionalità. Basta usare l'espressione ${0##*/}.

Ad esempio:

usage () {
        echo "usage: ${0##*/} "
        exit 1
}

Esempio: cambiare l'estensione ai file

Rinomina tutti i file *.txt della directory corrente in *.log:

for f in *.txt; do mv "$f" "${f/%txt/log}"; done

Condizioni

Le operazioni condizionali in bash possono essere eseguite in due modi: tramite il blocco if..then..else (simile al suo omonimo in linguaggio c), oppure tramite il blocco case..in (simile allo switch).

If..Then..Else

Tutto il lavoro di questo blocco è svolto dal programma bash test. Il suo uso è:

test [espr]

ci sono molte espressioni possibili, di cui le più comuni sono:

Questo è un esempio d'uso del costrutto if:

if [ -f prova.txt ]
 then
       echo Il file esiste!
  else
       echo Il file non esiste!
fi

Un'altra forma del costrutto if:

if [ -f prova.txt ];then echo Il file esiste!;else echo Il file non esiste!;fi

Come si può notare, inserire tra parentesi quadre l'espressione da testare è equivalente a scrivere:

test -f prova.txt

L'if bash è molto rigoroso dal punto di vista sintattico. Dopo l'espressione da valutare è necessario andare o a capo e scrivere la parola chiave then, oppure frapporre un ; e scrivere di seguito la parola chiave.

Si noti inoltre che non c'è bisogno di parentesi graffe, infatti il blocco viene terminato con la parola chiave fi.

Case..in

L'uso del blocco case è molto semplice:

case $a in 
 1) echo sono un 1;;
 2) echo sono un 2;;
 3) echo sono un 3;;
 *) echo Non sono ne un 1 ne un 2 ne un 3;;
esac

viene valutata $a e in base al valore contenuto vengono eseguite le operazioni associate.
Si noti inoltre che non c'è bisogno di parentesi graffe, infatti il blocco viene terminato con la parola chiave esac.

Cicli enumerativi

Al contrario di altri linguaggi, nel Bash Scripting i cicli sono del tipo enumerativo, cioè eseguono le operazioni per tutti gli elementi presenti un una lista indicata. Il più importante è sicuramente il ciclo for..do.

For..do

La sua forma è:

for [VAR] [in [LIST]]
 do
    [COMANDI]
done

il cui parametro dopo in rappresenta la lista prima citata.
Nel seguente esempio il ciclo stamperà sullo standard output 1 2 3 4 5:

for i in 1 2 3 4 5
 do
    echo sono $i
done

In questo altro esempio il ciclo stamperà una lista di file:

for i in *
 do
    echo Sono il file $i
done

Ulteriori risorse


CategoryProgrammazione

Programmazione/LinguaggioBash (l'ultima modifica è del 15/02/2022 08.20.19, fatta da andreas-xavier)