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

bash reference manual

Advanced bash-scripting guide


Esempi concreti

Raccolta di scripts


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

  1. le abbreviazioni e le espansioni
  2. le regular expressions
  3. l'ambiente della shell
  4. comandi base e costrutti elementari (loops, condizionali, gruppi di comandi)



Esempi utili



Abbreviazioni ed espansioni

In un comando di linea possiamo passare al sistema operativo

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



variabili built-in di awk