1 Intro Bash Scripting

Il linguaggio di scripting Bash è molto semplice, con poche regole e perfettamente integrato in Linux.

Gli script in bash non sono l’ideale per creare grandi programmi o operazioni di calcolo complesse.

Bash è l’acronimo di bourne again shell ( ancora una shell di Stephen Bourne, l’autore ), mentre uno script è un file contenente dei comandi che possono essere eseguiti.

Creiamo il nostro hello world utilizzando un editor di testo come vim, ma può andare bene anche nano, o anche uno con interfaccia grafica come leafpad, textedit, blocco note.

vim hello_world.sh

ora inseriamo nella prima riga

#!/bin/bash

Questa è la prima riga di intestazione di ogni script bash, contiene il percorso assoluto dell’interprete bash. Normalmente è inserito nella cartella bin, ma in alcuni sistemi potrebbe trovarsi in un differente percorso. Grazie a questa riga è possibile eseguire lo script direttamente nella sua cartella, altrimenti bisognerebbe lanciare bash col suo percorso prima del nome del nostro script

/bin/bash hello_world.sh

Il simbolo del cancelletto # indica una riga di commento , solitamente tutto il contenuto dopo viene ignorato dall’ esecuzione dell script.

Primi comandi

echo "Hello World!"
exit

Il primo comando è echo, serve a stampare del testo nella console.

Il secondo comando exit, comunica che il programma è terminato e si può uscire dal flusso, nel nostro caso non è obbligatorio perchè lo script termina in automatico.

Per eseguire il programma bisogna renderlo eseguibile tramite il comando chmod +x da terminale

chmod +x hello_world.sh

Adesso possiamo lanciare lo script ponendo davanti al suo nome un punto e slash ( ./ ) per i sistemi linux, altrimenti, in altri sistemi unix come per esempio macOS, il comando bash seguito dal nome del programma

./hello_world.sh
oppure
bash hello_world.sh

Quando uno script termina senza errori restituisce il valore zero, possiamo interrogare la console sul valore restituito dall’ultimo script lanciato tramite il comando echo seguito da dollaro e punto di domanda ( $? )

echo $?

Se provochiamo un errore, per esempio cambiando interprete

#!/bin/perl

Noteremo l’errore eseguendo il programma e stampando l’interrogazione sull’esito con echo $? verrà restituito un codice (nel nostro caso 126).

Possiamo assegnare un codice predefinito al comando exit da restituire in caso di errore, possiamo vedere il comando exit come il comando che permette un controllo quando lo script viene terminato.

Vediamo ora uno script che salva il log degli ultimi utenti che hanno effettuato l’accesso al sistema, con la time del sistema durante l’accesso e la time di sistema attuale.

touch get_status.sh
chmod +x get_status.sh

come detto, digitando il carattere hash (cancellato #) si creano i commenti e tutto ciò che segue sulla stessa riga verrà ignorato.

#!/bin/bash
# Stampa la lista degli ultimi utenti loggati, data e ora di login e data e ora attuale

echo "Ultimi utenti loggati: "
last -a
echo -e "\n"

il comando last, stampa la lista degli accessi al sistema con utente, il tty (avvio processo responsabile della lettura del nome e all’avvio del login), l’ ip, la data e l’ora. L’opzione -a disponibile solo in linux, aggiunge anche l’host di provenienza.

echo seguito dall’opzione -e indica al comando che deve eseguire la parte tra virgolette eseguibile, nel nostro caso \n stampa una riga vuota (new line). Sarebbe possibile anche stampare una riga vuota solo mettendo echo, ma ho ovulo essere più esplicito per mostrare l’utilizzo dell’opzione execute.

Per avere una guida su ogni comando, basta eseguire man seguito dal nome del comando

man last

aggiungiamo un altro pezzo allo script

echo "Tempo da quando il sistema è avviato: "
uptime

echo -e "\nData:"
date

Come spiega già il comando echo, uptime stampa il tempo e la data da quando il sistema è avviato, mentre date stampa la data attuale. Nell’ultimo echo ho inserito in unico comando sia \n che viene interpretato grazie all’opzione -e sia la stringa da stampare.

Oltre ad usare man per ogni comando

man date
man uptime
man echo

si può chiamare direttamente il manuale di bash

man bash

dove per esempio si può ricercare tutti i caratteri di escape anteponendo il back slash \ alla ricerca

\escape characters

oltre a echo è possibile utilizzare il comando printf che non genera un andare a capo automatico, quindi per farlo alla fine bisogna dirglielo con \n, ma esegue direttamente senza -e. Sostituiamolo

printf "Ultimi utenti loggati:\n"
last
printf "\n"

printf "Tempo da quando il sistema è avviato:\n"
uptime

printf "\nData:\n"
date

L’utilizzo di echo o printf è indifferente e a preferenza del programmatore.

Operatori di reindirizzamento

Per mandare tutti gli output su un files si usano gli operatori di reindirizzamento.

Il carattere maggiore ( > ) reindirizza il comando all’inizio di un file sovrascrivendone il contenuto.

Mentre il doppio maggiore ( >> ) aggiunge i contenuti al file senza cancellarne i contenuti precedenti.

aggiorniamo lo script

printf "Ultimi utenti loggati:\n" >> status.txt
last >> status.txt
printf "\n" >> status.txt

printf "Tempo da quando il sistema è avviato:\n" >> status.txt
uptime >> status.txt

printf "\nData:\n" >> status.txt
date >> status.txt

ogni volta che eseguiamo il nostro script, il file status.txt verrà aggiornato con i nuovi contenuti.

Se il file per l’output non esiste, viene automaticamente creato.

Possiamo visualizzare il contenuto del file col comando cat

cat status.txt