Creare uno script

Uno script è un file di testo che viene eseguito dalla bash; al suo interno, contiene una sequenza di comandi che vengono eseguiti, esattamente (o quasi) come se fossero stati digitati in un terminale.

Sequenze di istruzioni

Possiamo iniziare da un esempio semplice: creiamo uno script che prima scriva il nostro nome utente, e poi la data corrente.

Si crei un file di testo mioscript.sh con il seguente contenuto:
#!/bin/bash
echo "L'utente corrente è $USER"
date
Il significato della prima riga è quello di indicare al sistema con che programma deve essere eseguito questo programma. Nel nostro caso, specifichiamo /bin/bash, che è la shell corrente. A questo punto, si potrebbe provare ad eseguire lo script semplicemente digitando nel terminale
$ ./mioscript.sh
Tuttavia, questo comando restituirebbe un errore, perché non abbiamo dato al nostro script i permessi di esecuzione. Dobbiamo dunque usare il comando chmod, che avevamo visto nelle scorse lezioni, per ovviare a questo problema:
$ chmod a+x ./mioscript.sh
Si provi ad eseguire lo script, e lo si modifici per riportare anche il percorso della propria home directory (promemoria, questa viene memorizzata nella variabile d'ambiente $HOME).

Variabili

Come si è già visto nella sessione interattiva, anche all'interno di uno script è possibile memorizzare delle variabili. Per assegnare un valore, è sufficiente scrivere un'istruzione del tipo:

MIAVAR="a b c"
Conviene ricordare sempre che l'uso delle virgolette doppie permette di espandere automaticamente le variabili, mentre quello degli apici singoli le lascia inalterate.

Ad esempio, se impostiamo le variabili

$ MIAVAR="La mia home è $HOME"
$ MIAVAR2='La mia home è $HOME'
la prima conterrà il percorso alla propria home directory, mentre la seconda conterrà la stringa $HOME.
Realizzare un piccolo script che stampi queste due variabili, per testare il comportamento descritto.

Per leggere una variabile chiedendola all'utente, è possibile utilizzare il comando read, come segue:

read MIAVAR

Esistono alcune variabili speciali che memorizzano gli argomenti passati ad uno script. In particolare:

Ad esempio, uno script che contenga la riga:
echo $2
stamperà il secondo argomento passato allo script, oppure una stringa vuota nel caso questo non sia stato specificato. La variabile $0 contiene sempre il nome dello script, come è stato chiamato dall'utente.
Realizzare uno script myscript.sh che prenda due argomenti: Lo script deve poi salvare nel secondo file tutti i campi contenuti nella prima colonna del primo, ottenuta separando le colonne con spazi o tabulazioni (suggerimento: usare awk dentro allo script).

Salvare l'output di un comando

Spesso può essere utile salvare in una variabile l'output di un comando, invece che farlo vedere all'utente. Questo si può ottenere in uno script bash con la seguente sintassi:

OUTPUT=$(miocomando)
dove OUTPUT è il nome di una qualunque variabile dove salvare il risultato, e miocomando il comando che si desidera eseguire. Una sintassi alternativa è la seguente:
OUTPUT=`miocomando`
Si realizzi uno script che stampi il seguente output:
Anno corrente: 2020
Mese corrente: Novembre
Suggerimento: Si utilizzi il comando date per estrarre queste informazioni. Nel caso il computer abbia la lingua settata in inglese, stampare il nome del mese come viene restituito da date, e non preoccuparsi di tradurlo in italiano.

Funzioni e operazioni aritmetiche

Quando uno script diventa sufficientemente lungo, è possibile suddividerlo in funzioni. Una funzione si definisce con la seguente sintassi (si noti anche i commenti, che si inseriscono con il simbolo #):

#!/bin/bash
function myfun {
  echo $1 # La sintassi per gli argomenti è le stessa del programma principale
}

# Questo programma stampa "ciao"
myfun "ciao" 
Come visibile nell'esempio, chiamare le funzioni è sintatticamente equivalente a chiamare un comando.

Un'altra caratteristica spesso utile è quella di effettuare operazioni aritmetiche. Bash ha un supporto minimale per alcune operazioni, tramite la sintassi $(( )). Ad esempio:

#/bin/bash
A=1
B=$(($A + 1))
echo $B # Stampa 2
Per operazioni più complicate, si può utilizzare il comando bc e salvare l'output con la sintassi $(echo "2+3" | bc).

Importare altri file

Se si ha bisogno di molte funzioni, oppure si vogliono semplicemente condividere alcune di queste fra più script, si possono inserire in un file separato e importare con il comando

source altrofile.sh
Si provi a creare uno script che chiede all'utente un nome di file, e ritorna il numero di righe e di caratteri che quel file contiene (usando wc). Si provi a strutturare il codice con delle funzioni.