Introduzione alla programmazione in bash

Se è la prima volta che create uno script in Bash non preoccupatevi, non è così complicato.
Tutto quello che vi serve:
- una distribuzione LINUX o un sistema operativo UNIX
- un editor di testo (raccomando Emacs).

Come iniziare

In bash tutti gli script iniziano con "#!" (shebang) seguito dalla path per invocare la bash:
#!/bin/bash

Se volete inserire i commenti dovete digitare il carattere "#" prima di essi, ad esempio:
#!/bin/bash
# il mio commento

Per stampare un messaggio a video invece usate la seguente sintassi:
#!/bin/bash
echo "Ciao a tutti!"

Eseguire lo script

Per eseguire il vostro script digitate da console:
$ bash mio_script.sh
Oppure se volete renderlo eseguibile:
$ chmod +x mio_script.sh
$ ./mio_script.sh

Variabili

Sintassi: nome_variabile=valore
In questo esempio potete vedere come definire una variabile per poi stamparla a video:
#!/bin/bash
variabile="Ciao a tutti!"
echo $variabile

Variabili globali e variabili locali

Come in tutti i linguaggi di programmazione anche in bash bisogna sempre stare attenti alla dichiarazione delle variabili, ma sopratutto allo scope delle varibili.
Vi mostro un esempio:
#!/bin/bash
# Definisco una variabile globale
var="GLOBALE"

function bash {
    # Definisco una variabile locale
    # Questa variabile è visibile solo all'interno della funzione 
    local var="LOCALE"
    echo $var
}

echo $var
bash
echo $var
Cosa restituisce?
Proviamo ad eseguire il codice.
$ chmod +x test.sh
$ ./test.sh 
GLOBALE
LOCALE
GLOBALE

Variabili di sistema

Le variabili di sistema sono definite da Linux stesso. Queste variabili sono importanti per conoscere l'ambiente in cui viene eseguito il codice.

Le principali variabili di sistema sono:
BASH: Il nome della vostra shell
BASH_VERSION: la versione della shell
HOME: La vostra cartella home
OSTYPE: Il tipo di sistema operativo
PWD: L'attuale directory
SHELL: Il nome della shell
USERNAME: Il nome di chi ha effettuato il login

La stampa di queste varibili è identica alla stampa di una qualsiasi variabile:
echo $USERNAME
echo $HOME

Eseguire più istruzioni in una sola riga

Sintassi: comando1; comando2; comandoN;
Ad esempio:
$ ls; date
Stamperà la lista dei files e cartelle + la data corrente.

Modalità interattiva

Per far si che l'utente possa inserire le variabli quando richiesto la soluzione è comoda e veloce:
#!/bin/bash

echo -n "Inserisci il tuo nome: "
read nome

echo "Ciao $nome!"

Argomenti da linea di comando

Gli argomenti in bash vengono salvati nell'ordine in cui sono stati inseriti.
Ecco un esempio su come prelevare e stampare gli argomenti passati da linea di comando:
#!/bin/bash
echo "Hai inserito $# argomenti"
echo "$0 è il nome dello script"
echo "$1 è il primo argomento"
echo "$2 è il terzo argomento"
echo "Tutti gli argomenti: $* o $@"

Questo codice se eseguito stamperà:
$ bash test.sh -a -b -c 10 "ciao"
Hai inserito 5 argomenti
hello.sh è il nome dello script
-a è il primo argomento
-b è il terzo argomento
Tutti gli argomenti: -a -b -c 10 ciao o -a -b -c 10 ciao
"$#" stampa il numero di argomenti passati al vostro script.
Come potete vedere con "$n" potete stampare l'n-esimo argomento mentre con "$*" o con "$@" stampate tutti gli argomenti passati.

if / then / else

Come in tutti i linguaggi di programmazione anche gli script in bash hanno i blocchi condizionali.
Sinstassi:
if condizione 
then
    # se la condizione è verificata
    # esegui questa porzione di codice
else
    # se la condizione NON è verificata
    # esegui questa porzione di codice    
fi

Ad esempio, se volete forzare l'utente a passare solo due argomenti da linea di comando, il codice dovrà essere il seguente:
#!/bin/bash

if [ $# != 2 ]
then
    echo "$0 : Devi inserire 2 argomenti"
    exit 1
else
    echo "Ok!"
fi

Se avete più costrutti annidati potete usare la sintassi seguente:
if condizione
then
    if condizione
    then
        # fai questo
    else
        # fai questo
    fi
else
    # fai questo
fi

Se avete più condizioni usate:
if condizione 0
then
    # se la condizione 0 è verificata
    # fai questo
elif condizione 1 
then
    # altrimenti se la condizione 1 è verificata
    # fai questo
elif condizione 2
then
    # altrimenti se la condizione 2 è verificata
    # fai questo
else
    # altrimenti fai questo
fi

Il ciclo for

Il ciclo for vi permette di eseguire un'istruzione n volte in modo automatico.
Sintassi:
for { nome variabile } in { lista }
do
    # esegue questa riga
    # per il numero di elementi della lista
    # termina quando la lista è finita
done

Un esempio concreto:
#!/bin/bash

for i in 1 2 3 4 5
do
    if [ $i == 1 ] 
    then
 echo "Ho eseguito questa riga $i volta"
    else
 echo "Ho eseguito questa riga $i volte"
    fi
done

Lanciando lo script ottente:
$ bash test.sh 
Ho eseguito questa riga 1 volta
Ho eseguito questa riga 2 volte
Ho eseguito questa riga 3 volte
Ho eseguito questa riga 4 volte
Ho eseguito questa riga 5 volte

Il ciclo while

Sintassi:
while [ condizione ]
do
   #comando 1
   #comando 2
   #comando 3
done
Finchè "condizione" è vera il ciclo continua. Di solito la condizione è un'espressione booleana. I cicli infiniti si verificano quando la condizione non è mai valutata come falsa.

Esempio di utilizzo:
#!/bin/bash
contatore=$1
fattoriale=1
while [ $contatore -gt 0 ]
do
   fattoriale=$(( $fattoriale * $contatore ))
   contatore=$(( $contatore - 1 ))
done
echo $fattoriale

Commenti