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