Introduzione ai principali comandi e alla scrittura di script della shell (con particolare riferimento a bash e ksh)
1 of 22
Downloaded 29 times
More Related Content
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 TENEXsviluppata 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 directorycd: 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 fotols | 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 sostituiscicomando 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=Paolonome=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 竪 7print il valore 竪 7
elseelse
print il valore 竪 diverso da 7print 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 continueE' 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 breakE' 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