SlideShare une entreprise Scribd logo
1  sur  22
Télécharger pour lire hors ligne
Shell Unix
Introduzione ai principali comandi e alla
scrittura di script della shell
(con particolare riferimento a bash e ksh)
Paolo Montalto set-2010Paolo Montalto set-2010http://www.xabaras.ithttp://www.xabaras.it
v2.0
Un po' di storia

sh: alias "Bourne" shellsh: alias "Bourne" shell
scritta da Steve Bourne degli AT&T Bell Labs per Unix V7 (1979)scritta da Steve Bourne degli AT&T Bell Labs per Unix V7 (1979)
Semplice, e dotata (inizialmente) di pochissimi comandi interni, infatti chiamava programmi esternianche perSemplice, e dotata (inizialmente) di pochissimi comandi interni, infatti chiamava programmi esternianche per
i task più semplici.i task più semplici.

csh: ”C" shellcsh: ”C" shell
sviluppata da Bill Joy (inventore dell editor VI) per il sistema BSDsviluppata da Bill Joy (inventore dell editor VI) per il sistema BSD
Simile alla Bourne shell ma con molti miglioramenti tesi all'interattività (es. history), i comandi usati negliSimile alla Bourne shell ma con molti miglioramenti tesi all'interattività (es. history), i comandi usati negli
script sono molto simili alle istruzioni del linguaggio C.script sono molto simili alle istruzioni del linguaggio C.

tcsh: ”TC” shelltcsh: ”TC” shell
sviluppata alla fine degli anni 70 da Ken Greer alla Carnegie Mellon University per il sistema ”TENEX”sviluppata alla fine degli anni 70 da Ken Greer alla Carnegie Mellon University per il sistema ”TENEX”
è un'estensione (completamente compatibile) della C shell che supporta il completamento automatico deiè un'estensione (completamente compatibile) della C shell che supporta il completamento automatico dei
comandi e l'editing a linea di comando.comandi e l'editing a linea di comando.

ksh: ”Korn” shellksh: ”Korn” shell
scritta da David Korn agli AT&T Bell Labs all'inizio degli anni 80scritta da David Korn agli AT&T Bell Labs all'inizio degli anni 80
considerata come un'update della Bourne shell, è compatibile con quest'ultima ma incorpora anche molteconsiderata come un'update della Bourne shell, è compatibile con quest'ultima ma incorpora anche molte
caratteristiche di interattività della tcshell.caratteristiche di interattività della tcshell.

bash: ”Bourne again” shellbash: ”Bourne again” shell
shell UNIX Open Source scritta dal progetto GNU (Default su Linux)shell UNIX Open Source scritta dal progetto GNU (Default su Linux)
è un clone della sh ma con estensione dell'insieme di comandi, conforme allo standard POSIX eè un clone della sh ma con estensione dell'insieme di comandi, conforme allo standard POSIX e
parzialmente compatibile con la Korn shell.parzialmente compatibile con la Korn shell.
Shell Unix
Principali comandi di shell 1/2

ls: mostra il contenuto delle Directoryls: mostra il contenuto delle Directory
-l-l elenca un file per lineaelenca un file per linea
-a-a mostra i file nascostmostra i file nascostii
-t-t ordina per data ultima modificaordina per data ultima modifica

cd: ”cambia directory”cd: ”cambia directory”

rm: cancella file e directoryrm: cancella file e directory
-R-R (ricorsivo) elimina anche le sottocartelle(ricorsivo) elimina anche le sottocartelle
-f-f forza la cancellazione senza chiedere confermaforza la cancellazione senza chiedere conferma

mv: sposta file e directorymv: sposta file e directory

pwd: stampa la directory correntepwd: stampa la directory corrente

history:history: mostra l'elenco dei comandi eseguidi dalla shellmostra l'elenco dei comandi eseguidi dalla shell

more:more: mette in pausa lo standard output consentendo di leggerlo, solitamente è usato in concomitanza conmette in pausa lo standard output consentendo di leggerlo, solitamente è usato in concomitanza con
l'operatore ”|” (che vedremo più avanti)l'operatore ”|” (che vedremo più avanti)

tail:tail: mostra le ultime righe di un filemostra le ultime righe di un file
-n-n mostra le ultime ”n” righemostra le ultime ”n” righe
-f-f continua a rileggere il file nel caso vinga modificatocontinua a rileggere il file nel caso vinga modificato

cat:cat: stampa uno o più file sullo standard outputstampa uno o più file sullo standard output
Shell Unix
Principali comandi di shell 2/2

ln: crea un link ad un fileln: crea un link ad un file
ln [OPZIONE] DEST NOME_COLLln [OPZIONE] DEST NOME_COLL
-s-s crea un link simbolicocrea un link simbolico

who:who: elenca gli utente attualmente loggati nel sistemaelenca gli utente attualmente loggati nel sistema

w:w: come ”who” ma aggiunge informazioni su cosa stanno eseguendocome ”who” ma aggiunge informazioni su cosa stanno eseguendo

echo:echo: stampa una stringa e/o il valore di una variabile sullo standard outputstampa una stringa e/o il valore di una variabile sullo standard output

which / whence:which / whence: trova il path corrispondete ad un comando, es:trova il path corrispondete ad un comando, es:
# which# which lsls
/bin/ls/bin/ls

sort:sort: ordina le righe di un file di testoordina le righe di un file di testo

touch:touch: cambia la data di modifica di un filecambia la data di modifica di un file

wc:wc: conta le parole presenti in un file di testoconta le parole presenti in un file di testo

find:find: cerca un file nel percorso specificato come parametrocerca un file nel percorso specificato come parametro
-name-name cerca i file per nomecerca i file per nome
-exec-exec esegue un comando sui file trovatiesegue un comando sui file trovati

kill:kill: invia un segnale ad un processo (generalmente usato per terminare un programma)invia un segnale ad un processo (generalmente usato per terminare un programma)
es.es. killkill -9 61435-9 61435
Shell Unix
Reindirizzamento 1/2
Ogni programma eseguito dalla shell accede a tre file specialiOgni programma eseguito dalla shell accede a tre file speciali

Standard input (per convenzione descrittore di file numeroStandard input (per convenzione descrittore di file numero 00))

Standard output per convenzione descrittore di file numeroStandard output per convenzione descrittore di file numero 11))

Standard error (per convenzione descrittore di file numeroStandard error (per convenzione descrittore di file numero 22))
ciascuno di questi file può essere oggetto di ”reindirizzamento”.ciascuno di questi file può essere oggetto di ”reindirizzamento”.
Cerchiamo di essere più chiari.Cerchiamo di essere più chiari.
Supponiamo di lanciare il comando ”ls” nella directory corrente, questo scriverà una lista di file e directorySupponiamo di lanciare il comando ”ls” nella directory corrente, questo scriverà una lista di file e directory
sullo schermo.sullo schermo.

E se invece volessimo scrivere il risultato di ”ls” su un file risultato.txt?E se invece volessimo scrivere il risultato di ”ls” su un file risultato.txt?
Detto fatto!Detto fatto!
Basterà utilizzare l'operatore ”>” che ”devia” lo standard output di ”ls” su un file:Basterà utilizzare l'operatore ”>” che ”devia” lo standard output di ”ls” su un file:
ls > risultato.txtls > risultato.txt
oppureoppure
ls >> risultato.txtls >> risultato.txt
se vogliamo mantenere il contenuto preesistende del filese vogliamo mantenere il contenuto preesistende del file
Shell Unix
Reindirizzamento 2/2

Per deviare lo standard error di un comando su file basta anteporre un 2 all'operatore:Per deviare lo standard error di un comando su file basta anteporre un 2 all'operatore:
comando 2> errore.txtcomando 2> errore.txt

Per deviare lo standard error sullo standard output lanciare:Per deviare lo standard error sullo standard output lanciare:
comando 2>&1comando 2>&1
dove ”&1” identifica lo standard output.dove ”&1” identifica lo standard output.

Inoltre è possibile leggere l'input di un comando da file in questo modo:Inoltre è possibile leggere l'input di un comando da file in questo modo:
comando < input.txtcomando < input.txt
o combinare i due tipi di reindirizzamento come di seguito:o combinare i due tipi di reindirizzamento come di seguito:
comando < input.txt > output.txtcomando < input.txt > output.txt

Infine ogni comando di shell può leggere il suo input da una lista testuale come questa:Infine ogni comando di shell può leggere il suo input da una lista testuale come questa:
comando <<[delimitatore]comando <<[delimitatore]
input1.txtinput1.txt
input2.txtinput2.txt
delimitatoredelimitatore
dove il primo ”delimitarore” indica il carattere che termina la lista (per default è EOF).dove il primo ”delimitarore” indica il carattere che termina la lista (per default è EOF).
Shell Unix
Pipeline di comandi

E' possibile eseguire comandi multipli in modo che l'output di un comando diventi l'input di quello successivoE' possibile eseguire comandi multipli in modo che l'output di un comando diventi l'input di quello successivo
in modo automatico.in modo automatico.
Ciò può essere fatto mediante l'operatore ”|” detto ”pipe” il quale collega in serie gli input/output dei variCiò può essere fatto mediante l'operatore ”|” detto ”pipe” il quale collega in serie gli input/output dei vari
comandi che compongono la pipeline nel modo seguente:comandi che compongono la pipeline nel modo seguente:
comando1 | comando2 [ | comando3 …]comando1 | comando2 [ | comando3 …]

L'uso delle pipeline è molto comune quando si utilizza una shell Unix, ecco alcuni esempi:L'uso delle pipeline è molto comune quando si utilizza una shell Unix, ecco alcuni esempi:
ls | morels | more esegue il comando ls e passa il suo output al comando more paginando di fatto la listaesegue il comando ls e passa il suo output al comando more paginando di fatto la lista
cat applicazione.log | morecat applicazione.log | more visualizza il contenuto del file di log una shermata alla voltavisualizza il contenuto del file di log una shermata alla volta
ls | grep ”foto”ls | grep ”foto” visualizza solo i file che contengono ”foto” nel nomevisualizza solo i file che contengono ”foto” nel nome
Shell Unix
sed – Stream Editor 1/2

Uno stream editor serve ad effettuare trasformazioni su uno stream (che si esso un file o una pipeline)Uno stream editor serve ad effettuare trasformazioni su uno stream (che si esso un file o una pipeline)
Ciò può essere molto utile, ad esempio, se si vogliono effettuare delle sostituzioni massive all'interno di unCiò può essere molto utile, ad esempio, se si vogliono effettuare delle sostituzioni massive all'interno di un
file.file.

Es: sostituiamo tutte le occorrenze della parola ”giorno” con la parola ”notte” nel file pippo.txt:Es: sostituiamo tutte le occorrenze della parola ”giorno” con la parola ”notte” nel file pippo.txt:
sed s/giorno/notte/ < pippo.txt > output.txtsed s/giorno/notte/ < pippo.txt > output.txt
il risultato della sostituzione viene memorizzato nel file output.txtil risultato della sostituzione viene memorizzato nel file output.txt

Cerchiamo ora di analizzare l'esempio descritto.Cerchiamo ora di analizzare l'esempio descritto.
Il comando è cotituito da quattro parti:Il comando è cotituito da quattro parti:

ss comando ”sostituisci”comando ”sostituisci”

/../..//../../ delimitatoredelimitatore

giornogiorno criterio di ricerca (pattern, è un'espressione regolare)criterio di ricerca (pattern, è un'espressione regolare)

nottenotte stringa da sostituirestringa da sostituire

Poiché lavora sugli stream, ”sed” può essere eseguito anche sulle pipeline, ad esempio:Poiché lavora sugli stream, ”sed” può essere eseguito anche sulle pipeline, ad esempio:
echo Buongiorno | sed 's/giorno/notte/'echo Buongiorno | sed 's/giorno/notte/'
Il cui risultato sarà la stringa ”Buonnotte”.Il cui risultato sarà la stringa ”Buonnotte”.
Shell Unix
sed – Stream Editor 2/2
Quello appena mostrato è solo un esempio delle potenzialità di sed.Quello appena mostrato è solo un esempio delle potenzialità di sed.
E' ad esempio possibile:E' ad esempio possibile:

cercare una stringa ed aggiungervi un prefisso e/o un suffissocercare una stringa ed aggiungervi un prefisso e/o un suffisso

sostituire soltanto una parte della stringa cercatasostituire soltanto una parte della stringa cercata

------
Supponiamo di avere un articolo con dei riferimenti alle figure inserite al suo interno (Figura 1, Figura 2,Supponiamo di avere un articolo con dei riferimenti alle figure inserite al suo interno (Figura 1, Figura 2,
Figura 3) e di voler aggiungere le parentesi intorno alla dicitura Figura n.Figura 3) e di voler aggiungere le parentesi intorno alla dicitura Figura n.
Non potremo usare il metodo precedentemente descritto, poiché non conosciamo la stringa esatta daNon potremo usare il metodo precedentemente descritto, poiché non conosciamo la stringa esatta da
cercare.cercare.

La soluzione è semplice, sed prevede un carattere speciale che possiamo usare per indicare la stringaLa soluzione è semplice, sed prevede un carattere speciale che possiamo usare per indicare la stringa
trovata, questo carattere e la '&'.trovata, questo carattere e la '&'.
Supponendo che il nostro testo sia ”La casa di Pippo Figura 1”, lanciando il seguente comando:Supponendo che il nostro testo sia ”La casa di Pippo Figura 1”, lanciando il seguente comando:
echo "La casa di pippo Figura 1" | sed 's/Figura [0-9]*/(&)/'echo "La casa di pippo Figura 1" | sed 's/Figura [0-9]*/(&)/'
otterremo la stringa:otterremo la stringa:
La casa di Pippo (Figura 1)La casa di Pippo (Figura 1)
Dove il criterio di ricerca ”Figura [0-9]*” indica la parola Figura seguita da uno spazio e da numero arbitrarioDove il criterio di ricerca ”Figura [0-9]*” indica la parola Figura seguita da uno spazio e da numero arbitrario
di cifre.di cifre.
Shell Unix
grep 1/2
General regular expression print o semplicemente ”grep” può rivelarsi un comando molto ultile a chiunque si
trovi a dover utilizzare una shell unix.
Sostanzialmente il comando ”grep” cerca nel file di input le righe che corrispondono ad un certo criterio e le
stampa.
Partendo da questo semplice concetto è possibile ad esempio cercare tutti i file che contengono una
determinata stringa o tutte le righe di un file che soddisfano una condizione.
Tale condizione è esprimibile come ”espressione regolare”.
 Ricollegandoci all'esempio fatto per ”sed”, supponiamo di voler cercare tutte le righe del file pippo.txt che
contengono il riferimento ad una Figura.
Ci basterà lanciare il seguente comando grep:
grep ”Figura [0-9]*Figura [0-9]*” pippo.txt
che stampa tutte le righe di pippo.txt che soddisfano il criterio.
Il comando così eseguito però non da informazioni sulla posizione delle righe nel file, inoltre il criterio di
ricerca è ”case sensitive”.
Modificando il comando in questo modo:
grep -in ”Figura [0-9]*Figura [0-9]*” pippo.txt
grep stamperà ogni riga preceduta dalla sua posizione nel file.
Nellesempio appena descritto il parametro -i sta per ”ignore case” e -n per ”line number”.
Shell Unix
grep 2/2
Anche grep può essere usato sulle pipeline ed è quindi molto utile per filtrare i risultati di altri comandi quali
ad esempio cat
 cat Catalina.out | grep myApp.war
oppure ls
 ls -l | grep -i ”Figura[0-9]*”
Principali opzioni di grep:
-i ignore case (non distingue tra minuscole e maiuscole)
-v invert match (seleziona le righe che non soddisfano la condizione)
-n visualizza numeri di riga
-w parola intera (Forza MODELLO a corrispondere solo a parole intere)
-x linea intera (Forza MODELLO a corrispondere solo a righe intere)
Shell Unix
Sudo (1/2)
Super User Do o semplicemente ”sudo” non è un comando di shell, ma un programma a se stante che
consente ad un utente abilitato di eseguire un comando come superutente o come un altro utente.
Normalmente i permessi e vincoli per l'esecuzione di sudo si trovano nel file /etc/sudoers che viene compilato
dall'amministratore di sistema.
La sintassi di sudo è la seguente:
 sudo [opzioni] [variabile1=valore1 …] [--] [comando [arg1 …]]
dove Il parametro facoltativo comando indica il comando da eseguire, ed i parametri arg sono i suoi
parametri.
Inolte è possibile associare delle variabili d'ambiente all'esecuzione del comando facendolo precedere da
parametri nella forma variabile=valore.
Il doppio trattino -- (facoltativo) indica che i parametri successivi non sono da considerarsi opzioni o
assegnazioni di variabili.
 Pricipali opzioni di sudo:
-u assume l'identità dell'utente specificato invece che di superuser
-l elenca i comandi che l'utente è abilitato a lanciare
-s lancia una shell come superutente
Shell Unix
Sudo (2/2)
 Una menzione particolare merita l'utilizzo di sudo in concomitanza con gli operatori di redirezione.
Supponiamo di voler eseguire come superutente il seguente comando:
 echo "1" > /proc/sys/net/ipv4/ip_forward
La sintassi più intuitiva sarebbe la seguente:
 sudo echo "1" > /proc/sys/net/ipv4/ip_forward
però, sfortunatamente non è quella corretta, poiché stiamo dicendo alla shell di eseguire echo ”1” come
superutente e la redirezione come utente normale.
La soluzione corretta è invece la seguente:
 sudo sh -c "echo 1 > /proc/sys/net/ipv4/ip_forward"
In questo modo si esegue come superutente una shell che lancia il comando
 echo 1 > /proc/sys/net/ipv4/ip_forward
Shell Unix
Script della shell
Uno script della shell è un file di testo contenente:Uno script della shell è un file di testo contenente:

comandi di shell così come potrebbero essere scritti nel promptcomandi di shell così come potrebbero essere scritti nel prompt

commenti (identificati dal simbolo # come primo carattere della riga)commenti (identificati dal simbolo # come primo carattere della riga)

costrutti di controllo e variabilicostrutti di controllo e variabili
Qualsiasi shell può essere utilizzata per eseguire uno script, per questo è fondamentale che nella prima rigaQualsiasi shell può essere utilizzata per eseguire uno script, per questo è fondamentale che nella prima riga
dello script sia specificato a quale shell è destinato per evitare errori di interpretazione.dello script sia specificato a quale shell è destinato per evitare errori di interpretazione.
Ciò può essere fatto mediante la seguente sintassi:Ciò può essere fatto mediante la seguente sintassi:
#!/percorso/della/shell#!/percorso/della/shell
ad esempioad esempio #!/bin/ksh#!/bin/ksh

A questo punto il file può essere eseguito passandolo alla shell in questo modo:A questo punto il file può essere eseguito passandolo alla shell in questo modo:
ksh mioscript.shksh mioscript.sh
o direttamente aggiungendo i permessi di esecuzione al file:o direttamente aggiungendo i permessi di esecuzione al file:
chmod +x mioscript.shchmod +x mioscript.sh
Shell Unix
Parametri a riga di comando
Uno script della shell può accettare parametri a riga di comando.Uno script della shell può accettare parametri a riga di comando.
Questi parametri possono essere accedutiQuesti parametri possono essere acceduti

in maniera posizionale attraverso le variabili $0, $1, $2, $3, $4... fino a $9in maniera posizionale attraverso le variabili $0, $1, $2, $3, $4... fino a $9
(dove $0 contiene il nome dello script)(dove $0 contiene il nome dello script)
Per accedere ai parametri successivi al 9 è possibile usarePer accedere ai parametri successivi al 9 è possibile usare

${10}, ${11} …${10}, ${11} …

Il costrutto ”shift n” che scarta i primi n argomenti e ri-numera i successiviIl costrutto ”shift n” che scarta i primi n argomenti e ri-numera i successivi

$* che contiene tutti gli argomenti separati da spazi in una sola stringa$* che contiene tutti gli argomenti separati da spazi in una sola stringa

$@ che contiene tutti gli argomenti tra virgolette e separati da spazi$@ che contiene tutti gli argomenti tra virgolette e separati da spazi
Se ad esempio gli argomenti sonoSe ad esempio gli argomenti sono a1 a2 "a3 con spazi" a4a1 a2 "a3 con spazi" a4 alloraallora

$1=a1, $2=a2, $3=a3 con spazi, $4=a4$1=a1, $2=a2, $3=a3 con spazi, $4=a4

$*=a1 a2 a3 con spazi a4$*=a1 a2 a3 con spazi a4

””$@"="a1" "a2" "a3 con spazi" "a4"$@"="a1" "a2" "a3 con spazi" "a4"
$#$# contiene il numero di argomenti passati (escluso $0).contiene il numero di argomenti passati (escluso $0).
Shell Unix
Variabili
Per creare una variabile è sufficiente assegnarle un valore:Per creare una variabile è sufficiente assegnarle un valore:
nome=”Paolo”nome=”Paolo”
eta=30eta=30
Invece quando si usa una variabile la sitassi cambia ed è necessario anteporre al nome della variabile ilInvece quando si usa una variabile la sitassi cambia ed è necessario anteporre al nome della variabile il
simbolo $, ad esempio:simbolo $, ad esempio:
echo $nameecho $name
E' anche possibile fare uso di array che possono essere dichiarati inizializzandone gli elementi:E' anche possibile fare uso di array che possono essere dichiarati inizializzandone gli elementi:
nomi[0]=Marionomi[0]=Mario
nomi[1]=Marconomi[1]=Marco
Inoltre:Inoltre:

${nomi[*]}${nomi[*]} ritorna tutti gli elementi dell'arrayritorna tutti gli elementi dell'array

${#nomi[*]}${#nomi[*]} ritorna il numero di elementi dell'arrayritorna il numero di elementi dell'array
Shell Unix
Input/Output
Gli scipt della shell possono scrivere sullo standard output e leggere dati direttamente nelle variabili.Gli scipt della shell possono scrivere sullo standard output e leggere dati direttamente nelle variabili.
Esistono due funzioni di output:Esistono due funzioni di output:
echoecho stampa gli argomenti separati da spazi e terminati da newline sullo standard outputstampa gli argomenti separati da spazi e terminati da newline sullo standard output
(supporta le convenzioni escape del linguaggio C: n, t, …)(supporta le convenzioni escape del linguaggio C: n, t, …)
-n-n sopprime i caratteri newlinesopprime i caratteri newline
printprint (nativa della Korn shell) stampa gli argomenti separati da spazi e terminati da newline sullo(nativa della Korn shell) stampa gli argomenti separati da spazi e terminati da newline sullo
standard outputstandard output
-n-n sopprime i caratteri newlinesopprime i caratteri newline
-r-r raw mode – ignora le convenzioni -escaperaw mode – ignora le convenzioni -escape
-R-R raw mode – ignora le convenzioni -escape e le altre opzioni (tranne -n)raw mode – ignora le convenzioni -escape e le altre opzioni (tranne -n)
Per la lettura dallo standard input è possibile usare la funzionePer la lettura dallo standard input è possibile usare la funzione
readread var1 var2 var3 …var1 var2 var3 …
che legge una riga dalla standard input ed inserisce le stringhe separate da spazi nelle relative variabili.che legge una riga dalla standard input ed inserisce le stringhe separate da spazi nelle relative variabili.
Shell Unix
Confronti
Shell Unix
La maggior parte dei costrutti per il controllo di flusso richiedono l'utilizzo di test e confronti.La maggior parte dei costrutti per il controllo di flusso richiedono l'utilizzo di test e confronti.

I confronti possono essere effettuati mediante:I confronti possono essere effettuati mediante:
il comandoil comando testtest
testtest $nome=”Paolo”$nome=”Paolo”
o i suoi equivalentio i suoi equivalenti […][…] ee [[…]][[…]] (per bash e ksh)(per bash e ksh)
[[ $nome=”Paolo”$nome=”Paolo” ]] [[[[ $nome=”Paolo”$nome=”Paolo” ]]]]

i confronti tra stringhe si effettuano mediantei confronti tra stringhe si effettuano mediante
== con ovvio significatocon ovvio significato
!=!= per diversoper diverso
<< per minoreper minore
>> per maggioreper maggiore

I confronti tra numeri si effettiano nel seguente modo:I confronti tra numeri si effettiano nel seguente modo:
-eq-eq per ugualeper uguale
-ne-ne per diversoper diverso
-lt-lt per minoreper minore
-gt-gt per maggioreper maggiore

Tutte le condizioni possono essere combinate con && (indica l'AND) e || (indica l'OR)Tutte le condizioni possono essere combinate con && (indica l'AND) e || (indica l'OR)
Controllo di flusso 1/3
Shell Unix
Infine ci sono tutta una serie di costrutti per il controllo di flusso, condizioni di branch e loop.Infine ci sono tutta una serie di costrutti per il controllo di flusso, condizioni di branch e loop.
Vediamone rapidamente la sintassi:Vediamone rapidamente la sintassi:

if then else fiif then else fi
if [[ $value -eq 7 ]]if [[ $value -eq 7 ]]
thenthen
print ”il valore è 7”print ”il valore è 7”
elseelse
print ”il valore è diverso da 7”print ”il valore è diverso da 7”
fifi

if then elif then else fiif then elif then else fi
if [[ $nome = "Paolo" ]]; thenif [[ $nome = "Paolo" ]]; then
print "Benvenuto, ${nome}."print "Benvenuto, ${nome}."
elif [[ $nome = "Luca" ]];thenelif [[ $nome = "Luca" ]];then
print "Ciao, ${nome}, come va?"print "Ciao, ${nome}, come va?"
elseelse
print "Arrivederci, ${nome}!"print "Arrivederci, ${nome}!"
fifi
N.B. Un comando può essere terminato andando a capo oppure con ”;”N.B. Un comando può essere terminato andando a capo oppure con ”;”
Controllo di flusso 2/3
Shell Unix

case esaccase esac
case $var incase $var in
Paolo|Luca) print ”Invitato”;;Paolo|Luca) print ”Invitato”;;
Mario) print ”Non invitato”;;Mario) print ”Non invitato”;;
*) print "Sconosciuto";;*) print "Sconosciuto";;
esacesac

while do donewhile do done
while [[ $count -gt 0 ]]; dowhile [[ $count -gt 0 ]]; do
print "$count è $count"print "$count è $count"
(( count -= 1 ))(( count -= 1 ))
donedone

until do doneuntil do done
until [[ $risposta = "si" ]];dountil [[ $risposta = "si" ]];do
print -n "Inserisci "si": "print -n "Inserisci "si": "
read rispostaread risposta
print "”print "”
donedone
Controllo di flusso 3/3
Shell Unix

for var in list do donefor var in list do done
for foo in $(ls);dofor foo in $(ls);do
if [[ -d $f ]];thenif [[ -d $f ]];then
print "$f è una directory"print "$f è una directory"
elseelse
print "$f non è una directory"print "$f non è una directory"
fifi
donedone

E' possibile saltare un'iterazione in un ciclo usando il comando ”continue”E' possibile saltare un'iterazione in un ciclo usando il comando ”continue”

E' possibile uscire da un ramo di uno dei costrutti di branch usando il comando ”break”E' possibile uscire da un ramo di uno dei costrutti di branch usando il comando ”break”
Bibliografia
 Unix shell scripting with ksh/bash
http://www.dartmouth.edu/~rc/classes/ksh/print_pages.shtml
 Unix KornShell Quick Reference - Most Usual Commands
http://freecomputerbooks.com/kornShell.html#Most usual commands
 Sed – An Introduction and tutorial
http://www.grymoire.com/Unix/Sed.html
 Grep
http://www.grymoire.com/Unix/Grep.html
Shell Unix

Contenu connexe

Tendances

Sistema operativo Unix e Linux
Sistema operativo Unix e LinuxSistema operativo Unix e Linux
Sistema operativo Unix e Linux
Giulia Shkreli
 
Introduzione Alla Uml Mconsole
Introduzione Alla Uml MconsoleIntroduzione Alla Uml Mconsole
Introduzione Alla Uml Mconsole
Majong DevJfu
 

Tendances (18)

#!/bin/bash ed esempi di scripting
#!/bin/bash ed esempi di scripting#!/bin/bash ed esempi di scripting
#!/bin/bash ed esempi di scripting
 
Lezione Quattro
Lezione QuattroLezione Quattro
Lezione Quattro
 
Assembly and Reverse Engineering
Assembly and Reverse EngineeringAssembly and Reverse Engineering
Assembly and Reverse Engineering
 
Bash intro
Bash introBash intro
Bash intro
 
TYPO3 CMS 8.1 - Le novità
TYPO3 CMS 8.1 - Le novitàTYPO3 CMS 8.1 - Le novità
TYPO3 CMS 8.1 - Le novità
 
Buffer Overflow - Shellcode - Shatter Attack
Buffer Overflow - Shellcode - Shatter AttackBuffer Overflow - Shellcode - Shatter Attack
Buffer Overflow - Shellcode - Shatter Attack
 
Linux@Unina
Linux@UninaLinux@Unina
Linux@Unina
 
Sistema operativo Unix e Linux
Sistema operativo Unix e LinuxSistema operativo Unix e Linux
Sistema operativo Unix e Linux
 
PostgreSQL: Prima configurazione
PostgreSQL: Prima configurazionePostgreSQL: Prima configurazione
PostgreSQL: Prima configurazione
 
Compilazione Kernel
Compilazione KernelCompilazione Kernel
Compilazione Kernel
 
Linux Kernel, driver e compilazione
Linux Kernel, driver e compilazioneLinux Kernel, driver e compilazione
Linux Kernel, driver e compilazione
 
X2 Linux Riassunti
X2 Linux RiassuntiX2 Linux Riassunti
X2 Linux Riassunti
 
Introduzione Alla Uml Mconsole
Introduzione Alla Uml MconsoleIntroduzione Alla Uml Mconsole
Introduzione Alla Uml Mconsole
 
Post gresql su_raspberry
Post gresql su_raspberryPost gresql su_raspberry
Post gresql su_raspberry
 
Socket python
Socket pythonSocket python
Socket python
 
Installazione ambientepython ubuntumate
Installazione ambientepython ubuntumateInstallazione ambientepython ubuntumate
Installazione ambientepython ubuntumate
 
La shell Bash - Comandi base - Comandi avanzati - Espressioni regolari
 La shell Bash - Comandi base - Comandi avanzati - Espressioni regolari La shell Bash - Comandi base - Comandi avanzati - Espressioni regolari
La shell Bash - Comandi base - Comandi avanzati - Espressioni regolari
 
GNU Linux Programming introduction
GNU Linux Programming introductionGNU Linux Programming introduction
GNU Linux Programming introduction
 

En vedette

wordpressnonsoloperblogger-beta
wordpressnonsoloperblogger-betawordpressnonsoloperblogger-beta
wordpressnonsoloperblogger-beta
Nicola D'Agostino
 
Giornataaperta Milano 13 maggio 2013 Varini dematerializzazione a scuola
Giornataaperta Milano 13 maggio 2013 Varini dematerializzazione a scuolaGiornataaperta Milano 13 maggio 2013 Varini dematerializzazione a scuola
Giornataaperta Milano 13 maggio 2013 Varini dematerializzazione a scuola
Mario Varini
 

En vedette (20)

Corso cad modulo 3_dsga_sl
Corso cad modulo 3_dsga_slCorso cad modulo 3_dsga_sl
Corso cad modulo 3_dsga_sl
 
wordpressnonsoloperblogger-beta
wordpressnonsoloperblogger-betawordpressnonsoloperblogger-beta
wordpressnonsoloperblogger-beta
 
Ludicizzazione di un MOOC in Moodle
Ludicizzazione di un MOOC in MoodleLudicizzazione di un MOOC in Moodle
Ludicizzazione di un MOOC in Moodle
 
Integrazione di uno spazio virtuale per la scuola
Integrazione di uno spazio virtuale per la scuolaIntegrazione di uno spazio virtuale per la scuola
Integrazione di uno spazio virtuale per la scuola
 
Tools & librerie PHP
Tools & librerie PHPTools & librerie PHP
Tools & librerie PHP
 
Bassano del Grappa 22 aprile 2015 "Verso la scuola del futuro"
Bassano del Grappa 22 aprile 2015 "Verso la scuola del futuro"Bassano del Grappa 22 aprile 2015 "Verso la scuola del futuro"
Bassano del Grappa 22 aprile 2015 "Verso la scuola del futuro"
 
Manifesto - Distribuzioni Linux
Manifesto - Distribuzioni LinuxManifesto - Distribuzioni Linux
Manifesto - Distribuzioni Linux
 
Presentazione Smau 2012:La digitalizzazione dei processi amministrativi a scu...
Presentazione Smau 2012:La digitalizzazione dei processi amministrativi a scu...Presentazione Smau 2012:La digitalizzazione dei processi amministrativi a scu...
Presentazione Smau 2012:La digitalizzazione dei processi amministrativi a scu...
 
Smau Milano 2011: La dematerializzazione dei documenti a scuola. Procedure, s...
Smau Milano 2011: La dematerializzazione dei documenti a scuola. Procedure, s...Smau Milano 2011: La dematerializzazione dei documenti a scuola. Procedure, s...
Smau Milano 2011: La dematerializzazione dei documenti a scuola. Procedure, s...
 
Tre lingue e un MOOC per imparare Linux
Tre lingue e un MOOC per imparare LinuxTre lingue e un MOOC per imparare Linux
Tre lingue e un MOOC per imparare Linux
 
Giornataaperta Milano 13 maggio 2013 Varini dematerializzazione a scuola
Giornataaperta Milano 13 maggio 2013 Varini dematerializzazione a scuolaGiornataaperta Milano 13 maggio 2013 Varini dematerializzazione a scuola
Giornataaperta Milano 13 maggio 2013 Varini dematerializzazione a scuola
 
Elaborazione dati dalla riga di comando Linux
Elaborazione dati dalla riga di comando LinuxElaborazione dati dalla riga di comando Linux
Elaborazione dati dalla riga di comando Linux
 
Progetto Linux va a scuola - Descrizione tecnica
Progetto Linux va a scuola - Descrizione tecnicaProgetto Linux va a scuola - Descrizione tecnica
Progetto Linux va a scuola - Descrizione tecnica
 
Progetto Linux va a scuola
Progetto Linux va a scuolaProgetto Linux va a scuola
Progetto Linux va a scuola
 
Introduzione agli strumenti Moodle per docenti / 2
Introduzione agli strumenti Moodle per docenti / 2Introduzione agli strumenti Moodle per docenti / 2
Introduzione agli strumenti Moodle per docenti / 2
 
Introduzione agli strumenti Moodle per docenti / 3
Introduzione agli strumenti Moodle per docenti / 3Introduzione agli strumenti Moodle per docenti / 3
Introduzione agli strumenti Moodle per docenti / 3
 
2 eLearning e Moodle
2 eLearning e Moodle2 eLearning e Moodle
2 eLearning e Moodle
 
Siti web scolastici - corso base indirizzato ai DSGA neo immessi in ruolo
Siti web scolastici - corso base indirizzato ai DSGA neo immessi in ruoloSiti web scolastici - corso base indirizzato ai DSGA neo immessi in ruolo
Siti web scolastici - corso base indirizzato ai DSGA neo immessi in ruolo
 
Uso del sistema operativo 1
Uso del sistema operativo 1Uso del sistema operativo 1
Uso del sistema operativo 1
 
Presentazione gasw 13 5 16
Presentazione gasw 13 5 16Presentazione gasw 13 5 16
Presentazione gasw 13 5 16
 

Similaire à Shell unix

Lezione corso Base GNU/Linux
Lezione corso Base GNU/LinuxLezione corso Base GNU/Linux
Lezione corso Base GNU/Linux
Alex Palesandro
 
LinuxDay 2004 - Linux - Storia e caratteristiche vincenti - slides
LinuxDay 2004 - Linux - Storia e caratteristiche vincenti - slidesLinuxDay 2004 - Linux - Storia e caratteristiche vincenti - slides
LinuxDay 2004 - Linux - Storia e caratteristiche vincenti - slides
Maurizio Antonelli
 
Lug Roma3 Corso Linux Base
Lug Roma3   Corso Linux BaseLug Roma3   Corso Linux Base
Lug Roma3 Corso Linux Base
fosk
 
MontelLUG - Conferenze 2007 - Introduzione a RSync
MontelLUG - Conferenze 2007 - Introduzione a RSyncMontelLUG - Conferenze 2007 - Introduzione a RSync
MontelLUG - Conferenze 2007 - Introduzione a RSync
Manuel Dalla Lana
 
8 Linux Comandi Di Sistema
8 Linux Comandi Di Sistema8 Linux Comandi Di Sistema
8 Linux Comandi Di Sistema
Mauro Ferrigno
 

Similaire à Shell unix (20)

Linux shell
Linux shellLinux shell
Linux shell
 
Lezione corso Base GNU/Linux
Lezione corso Base GNU/LinuxLezione corso Base GNU/Linux
Lezione corso Base GNU/Linux
 
GNU Linux introduction
GNU Linux introductionGNU Linux introduction
GNU Linux introduction
 
Amministrazione base dei sistemi Linux
Amministrazione base dei sistemi LinuxAmministrazione base dei sistemi Linux
Amministrazione base dei sistemi Linux
 
Bash programming
Bash programmingBash programming
Bash programming
 
LinuxDay 2004 - Linux - Storia e caratteristiche vincenti - slides
LinuxDay 2004 - Linux - Storia e caratteristiche vincenti - slidesLinuxDay 2004 - Linux - Storia e caratteristiche vincenti - slides
LinuxDay 2004 - Linux - Storia e caratteristiche vincenti - slides
 
Understanding Linux
Understanding LinuxUnderstanding Linux
Understanding Linux
 
Comandi bash
Comandi bashComandi bash
Comandi bash
 
Inferno Limbo Italian
Inferno Limbo ItalianInferno Limbo Italian
Inferno Limbo Italian
 
Lug Roma3 Corso Linux Base
Lug Roma3   Corso Linux BaseLug Roma3   Corso Linux Base
Lug Roma3 Corso Linux Base
 
MontelLUG - Conferenze 2007 - Introduzione a RSync
MontelLUG - Conferenze 2007 - Introduzione a RSyncMontelLUG - Conferenze 2007 - Introduzione a RSync
MontelLUG - Conferenze 2007 - Introduzione a RSync
 
8 Linux Comandi Di Sistema
8 Linux Comandi Di Sistema8 Linux Comandi Di Sistema
8 Linux Comandi Di Sistema
 
Linux & Open Source : Lezione Quattro
Linux & Open Source : Lezione QuattroLinux & Open Source : Lezione Quattro
Linux & Open Source : Lezione Quattro
 
[BASH] Shell Scripting [ITA]
[BASH] Shell Scripting [ITA][BASH] Shell Scripting [ITA]
[BASH] Shell Scripting [ITA]
 
11 I File
11   I File11   I File
11 I File
 
As it e icloud
As it e icloudAs it e icloud
As it e icloud
 
Corso linux base
Corso linux baseCorso linux base
Corso linux base
 
Introduzione ros
Introduzione rosIntroduzione ros
Introduzione ros
 
Chi ha paura della command-line? - WordCamp Roma 2018
Chi ha paura della command-line? - WordCamp Roma 2018Chi ha paura della command-line? - WordCamp Roma 2018
Chi ha paura della command-line? - WordCamp Roma 2018
 
Apache Maven - Gestione di progetti Java e build automation
Apache Maven - Gestione di progetti Java e build automationApache Maven - Gestione di progetti Java e build automation
Apache Maven - Gestione di progetti Java e build automation
 

Shell unix

  • 1. Shell Unix Introduzione ai principali comandi e alla scrittura di script della shell (con particolare riferimento a bash e ksh) Paolo Montalto set-2010Paolo Montalto set-2010http://www.xabaras.ithttp://www.xabaras.it v2.0
  • 2. Un po' di storia  sh: alias "Bourne" shellsh: alias "Bourne" shell scritta da Steve Bourne degli AT&T Bell Labs per Unix V7 (1979)scritta da Steve Bourne degli AT&T Bell Labs per Unix V7 (1979) Semplice, e dotata (inizialmente) di pochissimi comandi interni, infatti chiamava programmi esternianche perSemplice, e dotata (inizialmente) di pochissimi comandi interni, infatti chiamava programmi esternianche per i task più semplici.i task più semplici.  csh: ”C" shellcsh: ”C" shell sviluppata da Bill Joy (inventore dell editor VI) per il sistema BSDsviluppata da Bill Joy (inventore dell editor VI) per il sistema BSD Simile alla Bourne shell ma con molti miglioramenti tesi all'interattività (es. history), i comandi usati negliSimile alla Bourne shell ma con molti miglioramenti tesi all'interattività (es. history), i comandi usati negli script sono molto simili alle istruzioni del linguaggio C.script sono molto simili alle istruzioni del linguaggio C.  tcsh: ”TC” shelltcsh: ”TC” shell sviluppata alla fine degli anni 70 da Ken Greer alla Carnegie Mellon University per il sistema ”TENEX”sviluppata alla fine degli anni 70 da Ken Greer alla Carnegie Mellon University per il sistema ”TENEX” è un'estensione (completamente compatibile) della C shell che supporta il completamento automatico deiè un'estensione (completamente compatibile) della C shell che supporta il completamento automatico dei comandi e l'editing a linea di comando.comandi e l'editing a linea di comando.  ksh: ”Korn” shellksh: ”Korn” shell scritta da David Korn agli AT&T Bell Labs all'inizio degli anni 80scritta da David Korn agli AT&T Bell Labs all'inizio degli anni 80 considerata come un'update della Bourne shell, è compatibile con quest'ultima ma incorpora anche molteconsiderata come un'update della Bourne shell, è compatibile con quest'ultima ma incorpora anche molte caratteristiche di interattività della tcshell.caratteristiche di interattività della tcshell.  bash: ”Bourne again” shellbash: ”Bourne again” shell shell UNIX Open Source scritta dal progetto GNU (Default su Linux)shell UNIX Open Source scritta dal progetto GNU (Default su Linux) è un clone della sh ma con estensione dell'insieme di comandi, conforme allo standard POSIX eè un clone della sh ma con estensione dell'insieme di comandi, conforme allo standard POSIX e parzialmente compatibile con la Korn shell.parzialmente compatibile con la Korn shell. Shell Unix
  • 3. Principali comandi di shell 1/2  ls: mostra il contenuto delle Directoryls: mostra il contenuto delle Directory -l-l elenca un file per lineaelenca un file per linea -a-a mostra i file nascostmostra i file nascostii -t-t ordina per data ultima modificaordina per data ultima modifica  cd: ”cambia directory”cd: ”cambia directory”  rm: cancella file e directoryrm: cancella file e directory -R-R (ricorsivo) elimina anche le sottocartelle(ricorsivo) elimina anche le sottocartelle -f-f forza la cancellazione senza chiedere confermaforza la cancellazione senza chiedere conferma  mv: sposta file e directorymv: sposta file e directory  pwd: stampa la directory correntepwd: stampa la directory corrente  history:history: mostra l'elenco dei comandi eseguidi dalla shellmostra l'elenco dei comandi eseguidi dalla shell  more:more: mette in pausa lo standard output consentendo di leggerlo, solitamente è usato in concomitanza conmette in pausa lo standard output consentendo di leggerlo, solitamente è usato in concomitanza con l'operatore ”|” (che vedremo più avanti)l'operatore ”|” (che vedremo più avanti)  tail:tail: mostra le ultime righe di un filemostra le ultime righe di un file -n-n mostra le ultime ”n” righemostra le ultime ”n” righe -f-f continua a rileggere il file nel caso vinga modificatocontinua a rileggere il file nel caso vinga modificato  cat:cat: stampa uno o più file sullo standard outputstampa uno o più file sullo standard output Shell Unix
  • 4. Principali comandi di shell 2/2  ln: crea un link ad un fileln: crea un link ad un file ln [OPZIONE] DEST NOME_COLLln [OPZIONE] DEST NOME_COLL -s-s crea un link simbolicocrea un link simbolico  who:who: elenca gli utente attualmente loggati nel sistemaelenca gli utente attualmente loggati nel sistema  w:w: come ”who” ma aggiunge informazioni su cosa stanno eseguendocome ”who” ma aggiunge informazioni su cosa stanno eseguendo  echo:echo: stampa una stringa e/o il valore di una variabile sullo standard outputstampa una stringa e/o il valore di una variabile sullo standard output  which / whence:which / whence: trova il path corrispondete ad un comando, es:trova il path corrispondete ad un comando, es: # which# which lsls /bin/ls/bin/ls  sort:sort: ordina le righe di un file di testoordina le righe di un file di testo  touch:touch: cambia la data di modifica di un filecambia la data di modifica di un file  wc:wc: conta le parole presenti in un file di testoconta le parole presenti in un file di testo  find:find: cerca un file nel percorso specificato come parametrocerca un file nel percorso specificato come parametro -name-name cerca i file per nomecerca i file per nome -exec-exec esegue un comando sui file trovatiesegue un comando sui file trovati  kill:kill: invia un segnale ad un processo (generalmente usato per terminare un programma)invia un segnale ad un processo (generalmente usato per terminare un programma) es.es. killkill -9 61435-9 61435 Shell Unix
  • 5. Reindirizzamento 1/2 Ogni programma eseguito dalla shell accede a tre file specialiOgni programma eseguito dalla shell accede a tre file speciali  Standard input (per convenzione descrittore di file numeroStandard input (per convenzione descrittore di file numero 00))  Standard output per convenzione descrittore di file numeroStandard output per convenzione descrittore di file numero 11))  Standard error (per convenzione descrittore di file numeroStandard error (per convenzione descrittore di file numero 22)) ciascuno di questi file può essere oggetto di ”reindirizzamento”.ciascuno di questi file può essere oggetto di ”reindirizzamento”. Cerchiamo di essere più chiari.Cerchiamo di essere più chiari. Supponiamo di lanciare il comando ”ls” nella directory corrente, questo scriverà una lista di file e directorySupponiamo di lanciare il comando ”ls” nella directory corrente, questo scriverà una lista di file e directory sullo schermo.sullo schermo.  E se invece volessimo scrivere il risultato di ”ls” su un file risultato.txt?E se invece volessimo scrivere il risultato di ”ls” su un file risultato.txt? Detto fatto!Detto fatto! Basterà utilizzare l'operatore ”>” che ”devia” lo standard output di ”ls” su un file:Basterà utilizzare l'operatore ”>” che ”devia” lo standard output di ”ls” su un file: ls > risultato.txtls > risultato.txt oppureoppure ls >> risultato.txtls >> risultato.txt se vogliamo mantenere il contenuto preesistende del filese vogliamo mantenere il contenuto preesistende del file Shell Unix
  • 6. Reindirizzamento 2/2  Per deviare lo standard error di un comando su file basta anteporre un 2 all'operatore:Per deviare lo standard error di un comando su file basta anteporre un 2 all'operatore: comando 2> errore.txtcomando 2> errore.txt  Per deviare lo standard error sullo standard output lanciare:Per deviare lo standard error sullo standard output lanciare: comando 2>&1comando 2>&1 dove ”&1” identifica lo standard output.dove ”&1” identifica lo standard output.  Inoltre è possibile leggere l'input di un comando da file in questo modo:Inoltre è possibile leggere l'input di un comando da file in questo modo: comando < input.txtcomando < input.txt o combinare i due tipi di reindirizzamento come di seguito:o combinare i due tipi di reindirizzamento come di seguito: comando < input.txt > output.txtcomando < input.txt > output.txt  Infine ogni comando di shell può leggere il suo input da una lista testuale come questa:Infine ogni comando di shell può leggere il suo input da una lista testuale come questa: comando <<[delimitatore]comando <<[delimitatore] input1.txtinput1.txt input2.txtinput2.txt delimitatoredelimitatore dove il primo ”delimitarore” indica il carattere che termina la lista (per default è EOF).dove il primo ”delimitarore” indica il carattere che termina la lista (per default è EOF). Shell Unix
  • 7. Pipeline di comandi  E' possibile eseguire comandi multipli in modo che l'output di un comando diventi l'input di quello successivoE' possibile eseguire comandi multipli in modo che l'output di un comando diventi l'input di quello successivo in modo automatico.in modo automatico. Ciò può essere fatto mediante l'operatore ”|” detto ”pipe” il quale collega in serie gli input/output dei variCiò può essere fatto mediante l'operatore ”|” detto ”pipe” il quale collega in serie gli input/output dei vari comandi che compongono la pipeline nel modo seguente:comandi che compongono la pipeline nel modo seguente: comando1 | comando2 [ | comando3 …]comando1 | comando2 [ | comando3 …]  L'uso delle pipeline è molto comune quando si utilizza una shell Unix, ecco alcuni esempi:L'uso delle pipeline è molto comune quando si utilizza una shell Unix, ecco alcuni esempi: ls | morels | more esegue il comando ls e passa il suo output al comando more paginando di fatto la listaesegue il comando ls e passa il suo output al comando more paginando di fatto la lista cat applicazione.log | morecat applicazione.log | more visualizza il contenuto del file di log una shermata alla voltavisualizza il contenuto del file di log una shermata alla volta ls | grep ”foto”ls | grep ”foto” visualizza solo i file che contengono ”foto” nel nomevisualizza solo i file che contengono ”foto” nel nome Shell Unix
  • 8. sed – Stream Editor 1/2  Uno stream editor serve ad effettuare trasformazioni su uno stream (che si esso un file o una pipeline)Uno stream editor serve ad effettuare trasformazioni su uno stream (che si esso un file o una pipeline) Ciò può essere molto utile, ad esempio, se si vogliono effettuare delle sostituzioni massive all'interno di unCiò può essere molto utile, ad esempio, se si vogliono effettuare delle sostituzioni massive all'interno di un file.file.  Es: sostituiamo tutte le occorrenze della parola ”giorno” con la parola ”notte” nel file pippo.txt:Es: sostituiamo tutte le occorrenze della parola ”giorno” con la parola ”notte” nel file pippo.txt: sed s/giorno/notte/ < pippo.txt > output.txtsed s/giorno/notte/ < pippo.txt > output.txt il risultato della sostituzione viene memorizzato nel file output.txtil risultato della sostituzione viene memorizzato nel file output.txt  Cerchiamo ora di analizzare l'esempio descritto.Cerchiamo ora di analizzare l'esempio descritto. Il comando è cotituito da quattro parti:Il comando è cotituito da quattro parti:  ss comando ”sostituisci”comando ”sostituisci”  /../..//../../ delimitatoredelimitatore  giornogiorno criterio di ricerca (pattern, è un'espressione regolare)criterio di ricerca (pattern, è un'espressione regolare)  nottenotte stringa da sostituirestringa da sostituire  Poiché lavora sugli stream, ”sed” può essere eseguito anche sulle pipeline, ad esempio:Poiché lavora sugli stream, ”sed” può essere eseguito anche sulle pipeline, ad esempio: echo Buongiorno | sed 's/giorno/notte/'echo Buongiorno | sed 's/giorno/notte/' Il cui risultato sarà la stringa ”Buonnotte”.Il cui risultato sarà la stringa ”Buonnotte”. Shell Unix
  • 9. sed – Stream Editor 2/2 Quello appena mostrato è solo un esempio delle potenzialità di sed.Quello appena mostrato è solo un esempio delle potenzialità di sed. E' ad esempio possibile:E' ad esempio possibile:  cercare una stringa ed aggiungervi un prefisso e/o un suffissocercare una stringa ed aggiungervi un prefisso e/o un suffisso  sostituire soltanto una parte della stringa cercatasostituire soltanto una parte della stringa cercata  ------ Supponiamo di avere un articolo con dei riferimenti alle figure inserite al suo interno (Figura 1, Figura 2,Supponiamo di avere un articolo con dei riferimenti alle figure inserite al suo interno (Figura 1, Figura 2, Figura 3) e di voler aggiungere le parentesi intorno alla dicitura Figura n.Figura 3) e di voler aggiungere le parentesi intorno alla dicitura Figura n. Non potremo usare il metodo precedentemente descritto, poiché non conosciamo la stringa esatta daNon potremo usare il metodo precedentemente descritto, poiché non conosciamo la stringa esatta da cercare.cercare.  La soluzione è semplice, sed prevede un carattere speciale che possiamo usare per indicare la stringaLa soluzione è semplice, sed prevede un carattere speciale che possiamo usare per indicare la stringa trovata, questo carattere e la '&'.trovata, questo carattere e la '&'. Supponendo che il nostro testo sia ”La casa di Pippo Figura 1”, lanciando il seguente comando:Supponendo che il nostro testo sia ”La casa di Pippo Figura 1”, lanciando il seguente comando: echo "La casa di pippo Figura 1" | sed 's/Figura [0-9]*/(&)/'echo "La casa di pippo Figura 1" | sed 's/Figura [0-9]*/(&)/' otterremo la stringa:otterremo la stringa: La casa di Pippo (Figura 1)La casa di Pippo (Figura 1) Dove il criterio di ricerca ”Figura [0-9]*” indica la parola Figura seguita da uno spazio e da numero arbitrarioDove il criterio di ricerca ”Figura [0-9]*” indica la parola Figura seguita da uno spazio e da numero arbitrario di cifre.di cifre. Shell Unix
  • 10. grep 1/2 General regular expression print o semplicemente ”grep” può rivelarsi un comando molto ultile a chiunque si trovi a dover utilizzare una shell unix. Sostanzialmente il comando ”grep” cerca nel file di input le righe che corrispondono ad un certo criterio e le stampa. Partendo da questo semplice concetto è possibile ad esempio cercare tutti i file che contengono una determinata stringa o tutte le righe di un file che soddisfano una condizione. Tale condizione è esprimibile come ”espressione regolare”.  Ricollegandoci all'esempio fatto per ”sed”, supponiamo di voler cercare tutte le righe del file pippo.txt che contengono il riferimento ad una Figura. Ci basterà lanciare il seguente comando grep: grep ”Figura [0-9]*Figura [0-9]*” pippo.txt che stampa tutte le righe di pippo.txt che soddisfano il criterio. Il comando così eseguito però non da informazioni sulla posizione delle righe nel file, inoltre il criterio di ricerca è ”case sensitive”. Modificando il comando in questo modo: grep -in ”Figura [0-9]*Figura [0-9]*” pippo.txt grep stamperà ogni riga preceduta dalla sua posizione nel file. Nellesempio appena descritto il parametro -i sta per ”ignore case” e -n per ”line number”. Shell Unix
  • 11. grep 2/2 Anche grep può essere usato sulle pipeline ed è quindi molto utile per filtrare i risultati di altri comandi quali ad esempio cat  cat Catalina.out | grep myApp.war oppure ls  ls -l | grep -i ”Figura[0-9]*” Principali opzioni di grep: -i ignore case (non distingue tra minuscole e maiuscole) -v invert match (seleziona le righe che non soddisfano la condizione) -n visualizza numeri di riga -w parola intera (Forza MODELLO a corrispondere solo a parole intere) -x linea intera (Forza MODELLO a corrispondere solo a righe intere) Shell Unix
  • 12. Sudo (1/2) Super User Do o semplicemente ”sudo” non è un comando di shell, ma un programma a se stante che consente ad un utente abilitato di eseguire un comando come superutente o come un altro utente. Normalmente i permessi e vincoli per l'esecuzione di sudo si trovano nel file /etc/sudoers che viene compilato dall'amministratore di sistema. La sintassi di sudo è la seguente:  sudo [opzioni] [variabile1=valore1 …] [--] [comando [arg1 …]] dove Il parametro facoltativo comando indica il comando da eseguire, ed i parametri arg sono i suoi parametri. Inolte è possibile associare delle variabili d'ambiente all'esecuzione del comando facendolo precedere da parametri nella forma variabile=valore. Il doppio trattino -- (facoltativo) indica che i parametri successivi non sono da considerarsi opzioni o assegnazioni di variabili.  Pricipali opzioni di sudo: -u assume l'identità dell'utente specificato invece che di superuser -l elenca i comandi che l'utente è abilitato a lanciare -s lancia una shell come superutente Shell Unix
  • 13. Sudo (2/2)  Una menzione particolare merita l'utilizzo di sudo in concomitanza con gli operatori di redirezione. Supponiamo di voler eseguire come superutente il seguente comando:  echo "1" > /proc/sys/net/ipv4/ip_forward La sintassi più intuitiva sarebbe la seguente:  sudo echo "1" > /proc/sys/net/ipv4/ip_forward però, sfortunatamente non è quella corretta, poiché stiamo dicendo alla shell di eseguire echo ”1” come superutente e la redirezione come utente normale. La soluzione corretta è invece la seguente:  sudo sh -c "echo 1 > /proc/sys/net/ipv4/ip_forward" In questo modo si esegue come superutente una shell che lancia il comando  echo 1 > /proc/sys/net/ipv4/ip_forward Shell Unix
  • 14. Script della shell Uno script della shell è un file di testo contenente:Uno script della shell è un file di testo contenente:  comandi di shell così come potrebbero essere scritti nel promptcomandi di shell così come potrebbero essere scritti nel prompt  commenti (identificati dal simbolo # come primo carattere della riga)commenti (identificati dal simbolo # come primo carattere della riga)  costrutti di controllo e variabilicostrutti di controllo e variabili Qualsiasi shell può essere utilizzata per eseguire uno script, per questo è fondamentale che nella prima rigaQualsiasi shell può essere utilizzata per eseguire uno script, per questo è fondamentale che nella prima riga dello script sia specificato a quale shell è destinato per evitare errori di interpretazione.dello script sia specificato a quale shell è destinato per evitare errori di interpretazione. Ciò può essere fatto mediante la seguente sintassi:Ciò può essere fatto mediante la seguente sintassi: #!/percorso/della/shell#!/percorso/della/shell ad esempioad esempio #!/bin/ksh#!/bin/ksh  A questo punto il file può essere eseguito passandolo alla shell in questo modo:A questo punto il file può essere eseguito passandolo alla shell in questo modo: ksh mioscript.shksh mioscript.sh o direttamente aggiungendo i permessi di esecuzione al file:o direttamente aggiungendo i permessi di esecuzione al file: chmod +x mioscript.shchmod +x mioscript.sh Shell Unix
  • 15. Parametri a riga di comando Uno script della shell può accettare parametri a riga di comando.Uno script della shell può accettare parametri a riga di comando. Questi parametri possono essere accedutiQuesti parametri possono essere acceduti  in maniera posizionale attraverso le variabili $0, $1, $2, $3, $4... fino a $9in maniera posizionale attraverso le variabili $0, $1, $2, $3, $4... fino a $9 (dove $0 contiene il nome dello script)(dove $0 contiene il nome dello script) Per accedere ai parametri successivi al 9 è possibile usarePer accedere ai parametri successivi al 9 è possibile usare  ${10}, ${11} …${10}, ${11} …  Il costrutto ”shift n” che scarta i primi n argomenti e ri-numera i successiviIl costrutto ”shift n” che scarta i primi n argomenti e ri-numera i successivi  $* che contiene tutti gli argomenti separati da spazi in una sola stringa$* che contiene tutti gli argomenti separati da spazi in una sola stringa  $@ che contiene tutti gli argomenti tra virgolette e separati da spazi$@ che contiene tutti gli argomenti tra virgolette e separati da spazi Se ad esempio gli argomenti sonoSe ad esempio gli argomenti sono a1 a2 "a3 con spazi" a4a1 a2 "a3 con spazi" a4 alloraallora  $1=a1, $2=a2, $3=a3 con spazi, $4=a4$1=a1, $2=a2, $3=a3 con spazi, $4=a4  $*=a1 a2 a3 con spazi a4$*=a1 a2 a3 con spazi a4  ””$@"="a1" "a2" "a3 con spazi" "a4"$@"="a1" "a2" "a3 con spazi" "a4" $#$# contiene il numero di argomenti passati (escluso $0).contiene il numero di argomenti passati (escluso $0). Shell Unix
  • 16. Variabili Per creare una variabile è sufficiente assegnarle un valore:Per creare una variabile è sufficiente assegnarle un valore: nome=”Paolo”nome=”Paolo” eta=30eta=30 Invece quando si usa una variabile la sitassi cambia ed è necessario anteporre al nome della variabile ilInvece quando si usa una variabile la sitassi cambia ed è necessario anteporre al nome della variabile il simbolo $, ad esempio:simbolo $, ad esempio: echo $nameecho $name E' anche possibile fare uso di array che possono essere dichiarati inizializzandone gli elementi:E' anche possibile fare uso di array che possono essere dichiarati inizializzandone gli elementi: nomi[0]=Marionomi[0]=Mario nomi[1]=Marconomi[1]=Marco Inoltre:Inoltre:  ${nomi[*]}${nomi[*]} ritorna tutti gli elementi dell'arrayritorna tutti gli elementi dell'array  ${#nomi[*]}${#nomi[*]} ritorna il numero di elementi dell'arrayritorna il numero di elementi dell'array Shell Unix
  • 17. Input/Output Gli scipt della shell possono scrivere sullo standard output e leggere dati direttamente nelle variabili.Gli scipt della shell possono scrivere sullo standard output e leggere dati direttamente nelle variabili. Esistono due funzioni di output:Esistono due funzioni di output: echoecho stampa gli argomenti separati da spazi e terminati da newline sullo standard outputstampa gli argomenti separati da spazi e terminati da newline sullo standard output (supporta le convenzioni escape del linguaggio C: n, t, …)(supporta le convenzioni escape del linguaggio C: n, t, …) -n-n sopprime i caratteri newlinesopprime i caratteri newline printprint (nativa della Korn shell) stampa gli argomenti separati da spazi e terminati da newline sullo(nativa della Korn shell) stampa gli argomenti separati da spazi e terminati da newline sullo standard outputstandard output -n-n sopprime i caratteri newlinesopprime i caratteri newline -r-r raw mode – ignora le convenzioni -escaperaw mode – ignora le convenzioni -escape -R-R raw mode – ignora le convenzioni -escape e le altre opzioni (tranne -n)raw mode – ignora le convenzioni -escape e le altre opzioni (tranne -n) Per la lettura dallo standard input è possibile usare la funzionePer la lettura dallo standard input è possibile usare la funzione readread var1 var2 var3 …var1 var2 var3 … che legge una riga dalla standard input ed inserisce le stringhe separate da spazi nelle relative variabili.che legge una riga dalla standard input ed inserisce le stringhe separate da spazi nelle relative variabili. Shell Unix
  • 18. Confronti Shell Unix La maggior parte dei costrutti per il controllo di flusso richiedono l'utilizzo di test e confronti.La maggior parte dei costrutti per il controllo di flusso richiedono l'utilizzo di test e confronti.  I confronti possono essere effettuati mediante:I confronti possono essere effettuati mediante: il comandoil comando testtest testtest $nome=”Paolo”$nome=”Paolo” o i suoi equivalentio i suoi equivalenti […][…] ee [[…]][[…]] (per bash e ksh)(per bash e ksh) [[ $nome=”Paolo”$nome=”Paolo” ]] [[[[ $nome=”Paolo”$nome=”Paolo” ]]]]  i confronti tra stringhe si effettuano mediantei confronti tra stringhe si effettuano mediante == con ovvio significatocon ovvio significato !=!= per diversoper diverso << per minoreper minore >> per maggioreper maggiore  I confronti tra numeri si effettiano nel seguente modo:I confronti tra numeri si effettiano nel seguente modo: -eq-eq per ugualeper uguale -ne-ne per diversoper diverso -lt-lt per minoreper minore -gt-gt per maggioreper maggiore  Tutte le condizioni possono essere combinate con && (indica l'AND) e || (indica l'OR)Tutte le condizioni possono essere combinate con && (indica l'AND) e || (indica l'OR)
  • 19. Controllo di flusso 1/3 Shell Unix Infine ci sono tutta una serie di costrutti per il controllo di flusso, condizioni di branch e loop.Infine ci sono tutta una serie di costrutti per il controllo di flusso, condizioni di branch e loop. Vediamone rapidamente la sintassi:Vediamone rapidamente la sintassi:  if then else fiif then else fi if [[ $value -eq 7 ]]if [[ $value -eq 7 ]] thenthen print ”il valore è 7”print ”il valore è 7” elseelse print ”il valore è diverso da 7”print ”il valore è diverso da 7” fifi  if then elif then else fiif then elif then else fi if [[ $nome = "Paolo" ]]; thenif [[ $nome = "Paolo" ]]; then print "Benvenuto, ${nome}."print "Benvenuto, ${nome}." elif [[ $nome = "Luca" ]];thenelif [[ $nome = "Luca" ]];then print "Ciao, ${nome}, come va?"print "Ciao, ${nome}, come va?" elseelse print "Arrivederci, ${nome}!"print "Arrivederci, ${nome}!" fifi N.B. Un comando può essere terminato andando a capo oppure con ”;”N.B. Un comando può essere terminato andando a capo oppure con ”;”
  • 20. Controllo di flusso 2/3 Shell Unix  case esaccase esac case $var incase $var in Paolo|Luca) print ”Invitato”;;Paolo|Luca) print ”Invitato”;; Mario) print ”Non invitato”;;Mario) print ”Non invitato”;; *) print "Sconosciuto";;*) print "Sconosciuto";; esacesac  while do donewhile do done while [[ $count -gt 0 ]]; dowhile [[ $count -gt 0 ]]; do print "$count è $count"print "$count è $count" (( count -= 1 ))(( count -= 1 )) donedone  until do doneuntil do done until [[ $risposta = "si" ]];dountil [[ $risposta = "si" ]];do print -n "Inserisci "si": "print -n "Inserisci "si": " read rispostaread risposta print "”print "” donedone
  • 21. Controllo di flusso 3/3 Shell Unix  for var in list do donefor var in list do done for foo in $(ls);dofor foo in $(ls);do if [[ -d $f ]];thenif [[ -d $f ]];then print "$f è una directory"print "$f è una directory" elseelse print "$f non è una directory"print "$f non è una directory" fifi donedone  E' possibile saltare un'iterazione in un ciclo usando il comando ”continue”E' possibile saltare un'iterazione in un ciclo usando il comando ”continue”  E' possibile uscire da un ramo di uno dei costrutti di branch usando il comando ”break”E' possibile uscire da un ramo di uno dei costrutti di branch usando il comando ”break”
  • 22. Bibliografia  Unix shell scripting with ksh/bash http://www.dartmouth.edu/~rc/classes/ksh/print_pages.shtml  Unix KornShell Quick Reference - Most Usual Commands http://freecomputerbooks.com/kornShell.html#Most usual commands  Sed – An Introduction and tutorial http://www.grymoire.com/Unix/Sed.html  Grep http://www.grymoire.com/Unix/Grep.html Shell Unix