Shell Script Warm Up.
Piccolo riassunto delle parti componenti questa guida:
Parte 1. Perchè esistono le shell.
Parte 2. I primi esperimenti con i comandi Unix.
Parte 3. Script Warm Up.
Per imparare velocemente occorre fare domande, queste sono le più comuni:
Ma io come scrivo le shell script?
Utilizzando l’editor preferito! Che sia il vecchio, ma sempre verde, VI, che sia EMACS o i più prosaici KWrite, Kate, Gedit va bene lo stesso. Scegliete una cartella dove salvare la script (fare una sottodirectory della propria home va benissimo) ed iniziate a lavorare. Un unica accortezza: dopo aver salvato la prima volta la shell, proprio prima del primo lancio, sulla linea di comando digitare
chmod 744 nomeshell.
In questo modo potete lanciare la shell digitando
./nomeshell
il ./ non è un errore di battitura, ce lo dovete mettere.
Ma io come lancio le shell script?
Leggendo il punto precedente dovrebbe essere chiaro: da una shell occorre entrare nella cartella dove c’è la script e lanciarla con ./nomeshell dopo averne cambiato le permission. Una alternativa è lanciare la shell digitando: bash ./nomeshell (in Linux) o ksh ./nomeshell (in AIX e HP/UX) o csh ./nomeshell se siete tra i pochi che usano la c shell. Sì, è pure possibile lanciare la shell da un Window Manager, ma non è pratico per il debugging.
Quali sono gli interpreti disponibili, (ovvero, nello slang dei secchioni, le shell disponibili)?
Brutta notizia: in ambiente Unix non c’è un unico linguaggio script, ci sono vari interpreti e quindi vari dialetti. Buona notizia: i più usati sono due: in ambiente Linux la Bash (che a volte nele guide è semplicemente chiamata sh), in ambiente Aix (lo Unix di IBM) e HP/Ux (lo Unix di Hp) la Ksh (la Korn Shell, disponibile comunque anche per Linux, ma non è spesso inclusa nelle distribuzioni, va installata).
Ci sono altri linguaggi script diffusi: c’è csh che deriva dal linguaggio c, la sh classica (Bash sta per Bourne Again Shell, è un riscrittura della sh). Ma i sono anche il Perl ed il Tcl, che permettono potenza ed affidabilità.
Come faccio a capire quale interprete sto usando?
Bella domanda! Digitare dal promt di comando
env | grep SHELL
Questo vi dirà quale shell è il default dell’utenza. Se si lancia una script questa verrà interpretata dall’interprete di default. A meno che non si lanci esplicitamente lo script con i comandi:
ksh ./nomeshell
o
sh ./nomeshell oppure bash ./nomeshell
E’ anche possibile indicare quale interprete si vuole adoperare all’interno della shell stessa inserendo come prima riga del codice
#!/bin/nomeiterprete (esempio #!/bin/bash).
Quali sono i comandi di una shell script?
Sono tutti i comandi Unix ed alcuni ‘controllori di flusso’. In Informatica i controllori di flusso sono le istruzioni condizionali ed i cicli.
E adesso finalmente….
La prima shell: hello World
E’ tradizione, questa è la shell:
#!/bin/bash echo "Hello World"
Variabili
Le variabili possono avere nomi composti da caratteri alfanumerici, ma devono iniziare con caratteri alfabetici. Vanno bene variabili come foo, pippo, andrea, lucano, tina132, ma non 2ina.
Per valorizzare una variabile basta porre nomevariabile=valore, esempio foo=”ciccio formaggio” oppure foo = 1. I valori numerici non sono compresi tra doppi apici, quelli testuali sì.
Per leggere il valore di una variabile basta premettere alla medesima il carattere $. Quindi:
foo="ciccio formaggio" echo $foo
mostra a video…. ciccio formaggio.
Variabili speciali
E’ possibile passare dei parametri alla script: ovvero chiamare la shell così
./miashell par1 par2 par3
Per capire basta guardare questo esempio. Questo è il testo della script stampaparametri.sh
#!/bin/bash echo "Primo parametro:" $1 echo "Secondo parametro:" $2echo "Terzo parametro:" $3 echo "Hai inserito " $# " parametri"
Lanciando
./stampaparametri.sh cuccu ruccucu paloma
si ottiene
cuccuruccucupaloma 3
Quindi è abbastanza chiaro che la variabile $1 è la prima stringa che segue il nome della shell nel richiamo, $2 la seconda, ecc. La variabile $# fornisce il numero di parametri passati. Una curiosità: $0 è valorizzato….con il nome della shell.
Istruzioni condizionali (e concatenamento delle istruzioni).
Danno la possibilità di condizionare l’esecuzione di alcune istruzioni. Per esempio, se si vuole copiare il particolare file dalla cartella /var/log/scrollkeeper.log alla /tmp, ma solo se quest’ultimo esiste, si può scrivere questa script:
#!/bin/bashif [ -f /var/log/scrollkeeper.log ]then cp /var/log/scrollkeeper.log /tmp else echo "Impossibile copiare" fi
Quindi il formato delle istruzioni condizionali è
if [ condizione ] thenistruzioni da eseguire se la condizione è vera else istruzioni da eseguire se la condizione è falsa fi
Attenzione, then deve andare a capo, oppure è possibile scrivere così:
if [ condizione ];then
Per cui ‘;’ è alternativo all’andata a capo per indicare all’interprete che può considerare l’istruzione finita. Si possono concatenare più istruzioni separandole con ‘;’ se si vuole scrivere codice illegibile. Per esempio:
echo "tre";echo "due"; echo "uno"; echo "sciacquone!!".
Le condizioni (i secchioni li chiamano test) che si possono mettere nella if sono molteplici. Il test appena visto verifica la presenza di un file. Questo
if [ -d /tmp ]
verifica la presenza di directory. Naturalmente è possible confrontare numeri e stringhe, per esempio:
#!/bin/bashset $pippo="ciao"if [$pippo="ciao"];then echo "ciao ciao" else echo "maleducato"
è una shell che, una volta lanciato stampa a video la stringa “ciao ciao”. Il carattere ‘=’ serve a confrontare stringhe, ma anche numeri:
#!/bin/bashset $pippo=1if [$pippo=1];then echo "ciao ciao" else echo "maleducato"
Per confrontare numeri, la Bash, oltre all’operatore ‘=’, accetta anche l’operatore ‘-eq’:
#!/bin/bashset $pippo=1if [$pippo-eq1];then echo "ciao ciao" else echo "maleducato"
Attenzione: occorre rispettare le spaziature (o l’assenza di spaziature indicata nell’esempio.
Non è corretto scrivere:
if [$pippo -eq 1];then
Gli operatori di confronto utilizzabili sono = < > e -eq (sta per =) -gt (sta per >) -lt (sta per <) -ge (sta per =>) -le (sta per =<). In ksh è obbligatorio utilizzare -ge, -le, -gt, -lt, -eq per i valori numerici e =, >, < per le stringhe.
Cicli e ricicli (ma non bicicli).
Per terminare questa sezione del manuale ecco un esempio di script che usa un ciclo:
#!/bin/bashwhile truedo echo "pippo" done
Se la lanciate dovrete terminarla con la pressione dei tasti ctrl+c. Naturalmente while può essere seguito da un test uguale a quelli usati per le istruzioni condizionali.
Ma, come nei cartoni animati, nei telefilm e negli articoli (ma mai nei film porno) si vedrà tutto la prossima volta.