Introduzione allo shell scripting

Tempo di lettura: 7 minuti

Avere padronanza della propria shell è uno dei requisiti fondamentali per poter agire in autonomia, semplicità e migliorare nel campo della sicurezza informatica.

Lo shell scripting consiste nella scrittura di script eseguibili tramite la shell per automatizzare compiti, creare batch jobs ed imparare ad utilizzare il proprio terminale nel pieno delle sue capacità.

Esistono diverse tipologie di Shell:

  • shell standard, sh;
  • ash shell;
  • tcsh shell;
  • Korn shell;
  • zsh shell.

In questo articolo supporrò che si conosco i permessi di Linux e i comandi principali del terminale. Verranno introdotti diversi comandi, ma non tratterrò funzioni, sed e awk. Saranno trattati in seguito in quanto argomento avanzato (necessitano della conoscenza basilare dello shell scripting)

Creare un file di script

Non c’è bisogno di un programma speciale per scrivere uno script, basta VIM, geany o VI. Io utilizzerò quest’ultimo. Quando si crea uno script shell, bisogna specificare la shell che si sta utilizzando tramite la prima riga, con il comando

#!/bin/sh

Solitamente, il carattere # viene utilizzato per i commenti. Aggiungendo il ! riferisce quale shell, appunto, utilizzare per lo script. Il primo script sarà un semplice “Hello World”.

#!/bin/sh
# Questo è un commento 
echo "\nCiao mondo!\n"

Per eseguirlo bisogna cambiare i permessi, eseguendo il comando

chmod 755 script.sh

Utilizzare variabili

La shell mantiene diverse variabili d’ambiente a cui possiamo accedervi ed utilizzarle durante i nostri script. Per vederle basta digitare il comando set

┌─[mrtouch@parrot]─[~/Desktop]
└──╼ $set
BASH=/bin/bash
BASH_SOURCE=()
BASH_VERSINFO=([0]="4" [1]="4" [2]="11" [3]="1" [4]="release" [5]="i686-pc-linux-gnu")
HISTFILE=/home/mrtouch/.bash_history
HOME=/home/mrtouch
HOSTNAME=parrot
HOSTTYPE=i686
LANG=en_US.UTF-8
LINES=24
LOGNAME=mrtouch
...

Per quanto riguarda le variabili, uno script shell permette di definirle all’interno dello stesso. Sono case sensitive (nome sarà diverso da Nome), il tipo di dato viene determinato automaticamente dal sistema e per utilizzarle basta aggiungere il carattere **$**.

┌─[mrtouch@parrot]─[~/Desktop]
└──╼ $cat script.sh 
#!/bin/sh

nome="Hacktips"
ore=$(date +"%T")
echo "Oggi alle $ore, $USER sta scrivendo un articolo per $nome"
┌─[mrtouch@parrot]─[~/Desktop]
└──╼ $./script.sh 
Oggi alle 12:46:51, mrtouch sta scrivendo un articolo per Hacktips

Nel caso uno script non stampasse nulla, è possibile controllare se lo stesso è stato eseguito con successo oppure no. Linux possiede diversi codici di uscita per gli script, con i quali possiamo verificare lo buon uscita del nostro script.

Ad esempio, se digito date, il codice di uscita sarà 0, poichè il comando è stato eseguito correttamente.

Se invece digito boh, il codice sarà 127, in quanto il comando non esiste.

┌─[mrtouch@parrot]─[~]
└──╼ $date
Wed Feb 22 17:12:35 CET 2017
┌─[mrtouch@parrot]─[~]
└──╼ $echo $?
0
┌─[mrtouch@parrot]─[~]
└──╼ $boh
bash: boh: command not found
┌─[✗]─[mrtouch@parrot]─[~]
└──╼ $echo $?
127
http://tldp.org/LDP/abs/html/exitcodes.html#EXITCODESREF
http://tldp.org/LDP/abs/html/exitcodes.html#EXITCODESREF

Redirezione I/O

La redirezione può essere eseguita sia per l’input sia per l’output.

Uno dei comandi più basilari per eseguirla è inviare comandi ad un file. Molto semplicemente:

  • Si utilizza il comando _> _ per inserire il comando in un file;
  • Si utilizza il comando » per inserire nella riga successiva del file il comando passato per argomento.

Ad esempio

┌─[mrtouch@parrot]─[~/Desktop]
└──╼ $ls -l script.sh > file
┌─[mrtouch@parrot]─[~/Desktop]
└──╼ $cat file 
-rwxr-xr-x 1 mrtouch mrtouch 29 Feb 22 12:57 script.sh
┌─[mrtouch@parrot]─[~/Desktop]
└──╼ $date >> file
┌─[mrtouch@parrot]─[~/Desktop]
└──╼ $cat file 
-rwxr-xr-x 1 mrtouch mrtouch 29 Feb 22 12:57 script.sh
Wed Feb 22 13:00:11 CET 2017

Eseguire espressioni

Con la shell è ovviamente possibile scrivere espressioni matematiche. Nel caso dovessimo scrivere espressioni, il modo più semplice è quello di creare uno script, salvare le variabili ed eseguire i calcoli che ci servono.

Oltre alle semplici espressioni, è possibile usare if-then-else, cicli _for _e while. Come in qualsiasi altro linguaggio di programmazione, sta a noi decidere quale è più consono per la situazione.

Un paio di esempi

1.Verifica della presenza di file, cartelle ed esecuzione di alcuni comandi

#!/bin/sh

if USER=mrtouch
then
    echo "Ciao mrtouch"
else 
    echo "Non ti conosco"
fi
dir=hs
if [ -d $dir ]
then
    echo "Hs è una cartella"
    cd $dir
    ls -l
    if [ -e Telecom.cap ]
    then
        echo "Ed è pure presente Telecom"
        rm Telecom.cap
        ls -l
        echo "Ora non c'è più"
    fi
fi

L’output sarà

Per comparare dei numeri, il codice corrispondente è:

  1. a -eq b controlla se a è uguale a b;
  2. a -ge b controlla se a è più grande o uguale a b;
  3. a -gt b controlla se a è più grande di b;
  4. a -le b controlla se a è minore o uguale a b;
  5. a -lt b controlla se a è minore di b;
  6. a -ne b controlla se a è diverso da b;

Invece, per quanto riguarda la comparazione dei file

2.Stampare le parole di un file più lunghe di venti caratteri

#!/bin/sh

file="dictIT.txt"

for word in `cat $file`
do
    if [ ${#word} -gt 20 ]       #con ${#word} calcolo la lunghezza della stringa
    then
        echo $word
    fi
done

Conclusioni

Come già detto, in questo articolo ho voluto solo introdurre l’argomento. Come qualsiasi linguaggio di programmazione, anche bash necessita di esercizi e molta pratica per essere conosciuto a fondo. Per questo motivo, consiglio ShellScript.sh e tldp.org, due ottimi siti per potersi esercitare al meglio.