Corso di Metodi Computazionali della Fisica
Alessandro Vicini (Università di Milano)
Esempi di shell scripting
come la shell è un processo del sistema operativo in grado di
effettuare operazioni di input/output con l'utente
effettuare operazioni matematiche e con regular expressions
eseguire processi (sia programmi dell'utente, sia operazioni condotte all'interno di una subshell)
Ottime pagine web di introduzione allo shell scripting
Esempi concreti
Per cominciare
ogni file contenente uno script deve essere eseguibile (chmod u+x file.sh)
come esempio di script elementare si considerino le seguenti due righe
#!/bin/bash
echo ciao
la prima riga dichiara che le istruzioni seguenti sono da interpretare come comandi della bash
il simbolo # introduce i commenti, ma in questo caso permette una dichiarazione
la seconda riga stampa su standard output
In breve
Esempi utili
Abbreviazioni ed espansioni
In un comando di linea possiamo passare al sistema operativo
comandi eseguibili (del sistema, programmi eseguibili dell'utente)
nomi di files, di stream
parametri
L'utilità dello shell scripting sta nel rappresentare in modo comodo, generale, automatizzabile
le relazioni tra i comandi e i parametri.
Una variabile (convenzionalmente scritta maiuscola) si assegna senza spazi bianchi attorno al segno =
NAME="Alessandro"
Il valore della variabile si ottiene premettendo il $ alla variabile
echo $NAME
NAME è una variabile della shell
possiamo rendere NAME una variabile di "ambiente", comune cioè a tutte le shell generate a partire da quella in cui stiamo lavorando, con il comando
export NAME
Le parentesi permettono di rappresentare in forma compatta il risultato di operazioni che, scritte esplicitamente, risultano molto lungo e ponderoso
FILES=$(ls)
echo $FILES
Le parentesi tonde precedute dal $ hanno il significato seguente: viene aperta una subshell in cui l'operazione indicata viene eseguita
Si osservi la seguente differenza
FILES2=(ls)
echo $FILES2
Senza il $, le parentesi non agiscono e quindi ls non viene interpretato come comando, ma come stringa
è possibile eseguire operazioni aritmetiche, utilizzando la doppia parentesi tonda per "lanciare l'ambiente matematico"
SOMMA=$((3+5**2))
echo $SOMMA
Le parentesi graffe precedute da un $ permettono la valutazione alfanumerica dell'argomento, che può essere accostato senza errore ad altre stringhe
echo $NAMEW
echo ${NAME}W
Le parentesi graffe permettono di rappresentare una lista di alternative tra cui un comando sceglie
ls {*.c ,*.pdf}
è possibile generare array di variabili il cui elemento generico è indicato dalle parentesi quadre
p[4]=4
echo p[4]
echo ${p[4]}
echo $(p[4])
echo ${p[4]**2}
echo $((p[4]**2))
Quando parleremo di loop vedremo come costruire un intero array di valori p[i]
Quando diamo un comando di linea, in generale specifichiamo anche degli argomenti o delle opzioni.
Ci si riferisce a queste quantità parlando di variabili posizionali, poichè vengono richiamate con $1 $2 $3 ...
Il nome del comando è rappresentato da $0
Genericamente queste variabili si indicano con $#
Costrutti: cicli, condizioni, gruppi di comandi
Esistono diversi modi di effettuare un ciclo
for ((i=0;i<10;i++)); do echo ciao; done
for i in 1 2 3 4; echo $i; done
for i in matteo carla giovanna; do echo $i; done
for i in $(ls *.pdf); do echo $i; done
for arg; do echo $arg; done
Operatori logici e test di condizioni
And |
-a |
Or |
-o |
Not |
! |
= |
-eq |
<= |
-le |
>= |
-ge |
< |
-lt |
> |
-gt |
until [condizione vera]; do qualcosa; done
#!/bin/bash
user=$1
until who |grep "$user"> /dev/null
do
echo "User not logged in"
sleep 10
done
echo "Finally!! $user has entered the OS"
exit 0
while [condizione vera]; do qualcosa; done
i=1; while [ $i -le 10 ]; do echo $i; i=$(($i+1)); done