Bash shell in 30″
Variabili di ambiente
PATH – definisce i percorsi dove trovare tutti i programmi eseguibili
HOME – directory dell’utente
MAIL – il file dove vengono archivate le email dell’utente
IFS – contiene la stringa che viene utilizzata come separatore per le linee di comando. Il valore preimpostato e’ uno spazio
PS1 e PS2 – sono rispettivamente il primo e il secondo prompt di bash. I valori preimpostati sono “$” per il primo e “>” per il secondo
USER – il nome della login utente
TERM – indica il terminale utilizzato dall’utente (importante da impostare per alcuni editor testuali, es vi)
SHELL – indica il tipo di shell utilizzata dall’utente
Note:
- per utilizzare il valore contenuto in una variabile si deve scrivere il simbolo
$davanti al nome della variabile.
Es.
echo $USER
stampa il valore contenuto nella variabileUSER - l’assegnamento avviene con il nome della variabile, seguito dal simbolo “=” e successivamente dal valore da associare (meglio se fra virgolette).
Es.
PATH="/usr/local/bin:$PATH"
aggiunge alla variabile PATH il percorso/usr/local/bin - le modifiche alle variabili d’ambiente possono essere rese persistenti se archiviate nel file
$HOME/.bashrc
Regole di base per i file di script
- iniziare sempre la prima riga con
#!/bin/bash
serve ad indicare allo script il percorso assoluto della shell da eseguire - una volta creato il file di script occorre dare i permessi di esecuzione
con
chmod ugo+x nome_dello_script.sh
o con (forma compatta)
chmod - aggiungere al nome del file l’estensione
.sh, non si tratta di una regola ma di una buona norma per far sapere che si tratta di uno script di shell
Strutture di controllo
il costrutto if
valuta una condizione ed esegue un blocco di comandi
Sintassi:
if la_condizione_è_vera
then
operazioni da eseguire
else
operazioni da eseguire
fi
e’ possibile usare anche una forma piu’ complessa qualora le condizioni sia di piu’ usando questa forma
if la_condizione_è_soddisfatta
then
operazioni da eseguire
elif altra_condizione_soddisfatta
then
operazioni da eseguire
else
operazoni da eseguire
fi
Esempio
if grep "aiuto" testo.txt
then
echo "Ho trovato la parola che stavi cercando"
else
echo "Non ho trovato la parola che stavi cercando"
fi
Il comando grep “aiuto” testo.txt restituisce true se trova la parola aiuto all’interno del file testo.txt
i test
test è una funziona interna della shell.
Il test valuta la condizione posta alla sua destra e restituisce true o false in relazione al risultato.
Esistono diverse tipologie di valutazione.
Qui l’elenco
operatori di confronto
-eq uguale a
-lt minore di
-le minore o uguale a
-gt maggiore di
-ge maggiore o uguale a
operatori sui file
-f nomefile vero (true) se il file esiste
-r nomefile vero (true) se il file esiste ed è leggibile
-w nomefile vero (true) se il file esiste ed è scrivibile
-x nomefile vero (true) se il file esiste ed è eseguibile
-d nomefile vero (true) se si tratta di una directory
-s nomefile vero (true) se il file esiste ed è maggiore di zero
operatori sulle stringhe
-n string vero (true) se la stringa string non è una stringa nulla
-z string vero (true) se la stringa string è nulla
string1 == string2 vero (true) se entrambe le stringhe sono uguali
string1 != string2 vero (true) se entrambe le stringhe sono diverse
string vero (true) se alla stringa string è assegnato un valore non nullo
attraverso questi operatori logici è possibile unire fra di loro piu’ test
-a corrisponde all'operatore AND
-o corrisponde all'operatore OR
Esempi
d=12
if [ $d -eq 25]
then
echo "si"
else
echo "no il valore è $d"
fi
se il valore della variabile d e’ 25 allo scrivi “si“, altrimenti “no” assieme al valore contenuto
if [ $str1 == $str2 ]
then
echo "Le due stringhe sono uguali!"
fi
Se il contenuto della stringa str1 e’ uguale a quello di str2 allora scrivi “Le due stringhe sono uguali”
if [ -n "$str1" -a -n "$str2" ]
then
echo 'sia $str1 che $str2 non sono nulli'
fi
Se la string str1 e la stringa str2 non hanno valore nulli allora stampami il loro valori dichiarando che non sono nulli
Note importanti sull’uso dei test
- cio’ che viene scritto fra parentesi quadre [ ] deve essere staccato da ciascuna parentesi con uno spazio
- qualora si confrontino variabili contenenti stringhe si consiglia di scriverle fra virgolette
es:
[ "$str1" == "$str2" ]
stuttura di controllo basata su casi case
Sintassi:
case espressione in
valoreatteso1) comandi da eseguire ;;
valoreatteso1) comandi da eseguire ;;
...
esac
I possibili valori ammessi sono fra le parole chiave case e esac. Il doppio punto e virgola ;; e’ utilizzato come terminatore delle istruzioni.
Il costrutto utilizza ) per dividere il valore possibile dalla serie di istruzioni da eseguire.
Esempio
echo "Fa la tua scelta : "
read scelta;
case $scelta in
1) ls -l ;;
2) ps -aux ;;
3) date ;;
4) who ;;
5) exit
esac
In questo esempio viene chiesto l’input di una stringa che viene archiviato nella variabile scelta (read scelta)
Se la stringa contiene uno dei casi proposti (i numeri da 1 a 5), lo script esegue il corrispettivo comando.
Il comando exit esce dall’esecuzione della shell
Cicli di controllo
cicli di controllo while loop
Sintassi:
while la_condizione_è_vera
do
comandi da eseguire
done
Esempi:
while [ $num -gt 100 ]
do
sleep 5
done
fino a che il valore contenuto nella variabile num è minore di 100 fa un attesa di 5 secondi (sleep 5)
cicli di controllo for
Sintassi:
for variabile in lista
do
comandi_da_eseguire
done
Esempi:
for x in 1 2 3 4 5
do
echo "il valore di x è $x";
done
Stampa 5 volte la stringa “il valore di x è … ” mostrando di volta in volta il valore assunto da x (ogni singolo valore della lista preso per volta)
for file in *~
do
rm $file
done
Cerca tutti i file che finisco con “~” (*~) e li cancella uno alla volta (rm $file)
Nota: il comando break interrompe in qualsiasi ciclo (sia while che for)
Ulteriori informazioni utili
- assegnare l’output di un comando ad una variabile
Sintassi:
VARIABILE=$(comando)
in alternativa
VARIABILE=`comando`
Esempi:
SOMMA=$(echo 1+1 | bc)
il valore contenuto in SOMMA sara’ la somma di 1+1 calcolata dal programma bcOGGI=`date '+%d/%m/%Y'`
Il valore contenuto in OGGI sara’ la data espressa nella forma giorno/mese/anno - Variabili speciali
$1 ... $n - i valori della sequenza dei parametri passati ad uno script si recuperano attraverso la lettura delle variabili (in sequenza) $1, $2 ...
$* - considera l'elenco di tutti parametri passati allo script
$0 - nome dello script eseguito
$# - numero dei parametri passati allo script
$? - stato di uscita dell'ultimo comando
Esempio:
sorgente dello script esempio.sh
#!/bin/bash
echo "Mi sono stati passati $# valori"
if [ "$#" -gt 0 ]
then
echo "Il primo valore e' $1"
fi
Uso
./esempio.sh 100 200
Output
Mi sono stati passati 2 valori
Il primo valore e' 100
- Gestione input/output
- aggiungendo il simbolo “>” seguito da un nome di un file a destra di un comando, l’output viene rediretto in un file sovrascrivendolo
- aggiungendo il simbolo “>>” seguito da un nome di un file a destra di un comando, l’output viene rediretto in un file accodandolo
Esempi
echo "Hello" > output.txt
cat output.txt
Hello
echo "World" >> output.txt
cat output.txt
Hello
World
<” seguito da un nome di un file a destra di un comando, si passa in input al comando il contenuto del file
mail nobody@where.no < testo_email.txt - inserendo il simbolo “|” fra due comandi si passa l’output di uno come input dell’altro
ls | more
- creare un file di testo e il suo relativo contenuto
cat > nomefile << EOF
testo da inserire
EOF
Nota: nel file si troveranno le stringhe contenute fra le due parole chiave EOF (escluse)
Puo’ essere usata una qualsiasi parola chiave a patto che venga ripetuta come chiusura
Sito da cui e’ stato liberamente tradotto e modificato questo post
http://linuxhelp.blogspot.com/2005/10/10-seconds-guide-to-bash-shell.html
Altri link interessanti
- http://linuxhelp.blogspot.com/2005/08/bash-shell-shortcuts.html
- http://www.cyberciti.biz/nixcraft/linux/docs/uniqlinuxfeatures/lsst
- http://bashcurescancer.com/10-steps-to-beautiful-shell-scripts.html
- http://steve-parker.org/sh/trap.shtml
- http://www.tldp.org/LDP/abs/html/
Mappa temporale delle medaglie olimpiche Chiavetta HSDPA Tre – Momodesign MD-@ e Ubuntu
[...] Ecco un articolo molto carino con alcuni esempi di bash scripting: Bash in 30 minuti [...]
Addenda:
Interessante articolo che si pone le problematiche di debugging degli script bash
http://aymanh.com/how-debug-bash-scripts