Script bash I file di comandi in Linux
BASH Bourne Again Shell Modalità interattiva o batch (file di comandi) Ambiente di programmazione “completo” Bash versione 2.03
File di comandi sono file ASCII iniziano con: #!/bin/bash deve essere attribuito il permesso di esecuzione (chmod a+x ) per eseguire:./
Un primo esempio #!/bin/bash #Questa è una riga di commento #questo file di comandi visualizza #una frase echo Buon giorno a tutti
Metacaratteri E’ possibile utilizzare metacaratteri Es. #!/bin/bash #copia tutti i file doc e i file di due lettere che #iniziano con la lettera a nella directory #backup cp *.doc backup cp a?.txt backup
Operatori set $ls z[aeiou]* –visualizza tutti i file che iniziano con z e la cui seconda lettera è una vocale $ls z[!aeiou]* –visualizza tutti i file che iniziano con z e la cui seconda lettera è una vocale
Parentesi graffe l’istruzione $echo c{ar,at,an,on}s visualizza cars cats cans cons
Caratteri speciali < ridirezione input > ridirezione output | pipe & esegue in background ‘ apice forte “ apice debole $ variabile {} inizio e fine blocco di comandi
Variabili bash variabili stringa: –assegnamento = Es. nomefile=testo.txt –per ottenere il valore $ Es. echo $nomefile oppure ${ } Es. echo ${nomefile}
Variabili bash Oltre a quelle definite dall’utente ne esistono molte predefinite (Es. $IFS o $BASH_VERSION) $ seguito da un numero indica i parametri della riga di comando (0 il nome del file script) $# contiene il numero dei parametri $* è una stringa contenente tutti i parametri
Parametri della riga di comando #!/bin/bash echo “hai inserito $# parametri” echo “e sono $*.” Se il file si chiama prova e viene lanciato con il comando:./prova alfa beta gamma si otterrà il risultato: $hai inserito 3 parametri $e sono alfa beta gamma.
Codice di uscita Ogni programma Linux quando termina restituisce un codice di uscita che normalmente è 0 se non ci sono stati errori Viene memorizzato nella variabile $? Anche gli script bash possono restituire un codice con: exit Es. exit 0
Liste di comandi condizionate Per legare l’esecuzione di due comandi è possibile usare i due operatori: && - il secondo comando viene eseguito se e solo se il primo ha codice di uscita 0 || - il secondo comando viene eseguito se e solo se il primo ha codice di uscita diverso da 0
Esempio Liste Le seguenti istruzioni cambiano la directory corrente, se questa operazione ha successo vi copiano un file: cd /home/gabri/Linux && cp file file.bak Cambia la cartella corrente, scrive un messaggio di errore se la cartella non esiste cd /home/gabri || echo “Non c’e la cartella”
Lettura di variabili Si usa il comando read Es: #!/bin/bash echo “Inserisci x” read x echo “inserisci y” read y echo “x ha valore $x” echo “y ha valore $y”
Alternative if listacomandi1 then listacomandi2 [else listacomandi3] fi la listacomandi2 viene eseguita se l’ultimo codice di ritorno di listacomandi1 è 0, altrimenti viene eseguita la listacomandi3
Esempio if #!/bin/bash if ls $1 then echo “Il file $1 esiste” if grep $2 $1 then echo “… e contiene la parola $2” else echo “… ma non contiene la parola $2” fi else echo “il file $1 non esiste!” fi Questo scrip controlla se esiste il file passato come primo argomento e se esiste guarda se contiene la stringa passata come secondo argomento, visualizza messaggi di errore altrimenti
Formato if generale if listacomandi then listacomandi [elif listacomandi then listacomandi] [else listacomandi3] fi
Condizione generica Per usare un if con una generica condizione: if [ $1 = 1 ] then echo “hai inserito 1” fi Attenzione ai blank!!! -o fa l’or, -a fa l’and
Confronti fra interi oper.è vero se -eqi due numeri sono uguali -nei due numeri sono diversi -gtil primo è maggiore del -ltil primo è minore -geil primo è maggiore o uguale -ltil primo è minore o uguale
Test sui file oper.e’ vero se… -d filefile esiste ed è una directory -e filefile esiste -f filefile esiste ed è normale -r filesi può scrivere su file -s filefile esiste e non è vuoto -w filesi può scrivere su file -x filefile è eseguibile
Esempio #!/bin/bash USO=“Uso: copia file 1 file2” if [ $# -ne 2 ] ; then #verifica il nr. di argomenti echo “numero di argomenti non valido” echo $USO exit 1 fi if [ ! –e $1 ] ; then echo “$1 non esiste!” exit 2 fi if [ -e $2 –a ! –d $2 ] ; then echo “$2 esiste e non è una directory” exit 4 fi cp $1 $2 copia un file, se esiste, controllando di non sovrascriverne un’altro
Cicli: for for variabilefor in listadiparole do listacomandi done il ciclo viene eseguito mentre variabilefor assume i valori contenuti in listadiparole
Cicli: for #!/bin/bash IFS=: for dir in $PATH do echo $dir if [ -w $dir ]; then echo “puoi scrivere in $dir” else echo “ non puoi scrivere in $dir” fi done
Cicli: while while listacomandi1 do listacomandi2 done il ciclo viene eseguito mentre listacomandi1 restituisce codice 0
Cicli: while #!/bin/bash declare –i idx idx = 1 while [ $idx –ne 150 ] do cp filetesto filetesto.$idx idx=$idx+1 done
Cicli: until until listacomandi1 do listacomandi2 done il ciclo viene eseguito mentre listacomandi1 restituisce codice diverso da 0