Você está na página 1de 197

La guida di Bash per i principianti

Machtelt Garrels
Garrels BVBA <tille wants no spam _at_ garrels dot be>

Versione 1.11 Edizione ultimo aggiornamento 20081227

Indice generale
Introduzione.........................................................................................................................................7 1. Perch questa guida?...................................................................................................................7 2. Chi dovrebbe leggere questo libro?............................................................................................7 3. Nuove versioni, traduzioni e dis onibilit!.................................................................................." #. Cronologia delle revisioni..........................................................................................................." $. Contributi....................................................................................................................................% &. 'iscontri....................................................................................................................................1( 7. In)or*azioni sui diritti..............................................................................................................1( ". +i cosa avete bisogno?.............................................................................................................1( %. Convenzioni utilizzate in questo docu*ento............................................................................11 1(. ,rganizzazione di questo docu*ento.....................................................................................11 Ca itolo 1. -ash e gli scri t di -ash .................................................................................................13 1.1. Co*uni rogra**i della shell..............................................................................................13 1.1.1. .unzioni generali di shell...............................................................................................13 1.1.2. /i i di shell.....................................................................................................................13 1.2. 0antaggi della -ourne 1gain 2hell........................................................................................1# 1.2.1. -ash 3 la shell 4N5.......................................................................................................1# 1.2.2. .unzionalit! riscontrabili solo in bash...........................................................................1$ 1.3. 6secuzione dei co*andi.........................................................................................................21 1.3.1. In generale......................................................................................................................21 1.3.2. Co*andi integrati della shell.........................................................................................22 1.3.3. 6secuzione di rogra**i da uno scri t.........................................................................22 1.#. Costruzione di blocchi...........................................................................................................23 1.#.1. Costruzione di blocchi di shell.......................................................................................23 1.$. 2vilu are buoni scri t .........................................................................................................2& 1.$.1. Pro riet! dei buoni scri t...............................................................................................2& 1.$.2. 2truttura..........................................................................................................................2& 1.$.3. /er*inologia..................................................................................................................2& 1.$.#. 5na arola su ordine e logica.........................................................................................27 1.$.$. 5n ese* io di scri t di -ash7 *iosiste*a.sh................................................................27 1.$.&. 6se* io di scri t init.....................................................................................................2% 1.&. 2o**ario...............................................................................................................................3( 1.7. 6sercizi...................................................................................................................................3( Ca itolo 2. 2crivere e correggere gli scri t.......................................................................................32 2.1. Creare ed avviare uno scri t..................................................................................................32 2.1.1. 2crittura e deno*inazione..............................................................................................32 2.1.2. scri t1.sh........................................................................................................................33 2.1.3. 6secuzione dello scri t...................................................................................................3$ 2.2. 8e basi degli scri t.................................................................................................................3& 2.2.1. 9uale shell eseguir! lo scri t?.......................................................................................3& 2.2.2. 1ggiungere co**enti....................................................................................................3& 2.3. Caccia agli errori negli scri t -ash........................................................................................37 2.3.1. Correzioni nell:intero scri t............................................................................................37 2.3.2. Correzione su arte;i dello scri t...................................................................................3" 2.#. 2o**ario...............................................................................................................................#( 2.$. 6sercizi...................................................................................................................................#( Ca itolo 3. 8:a*biente di -ash.........................................................................................................#2 3.1. .ile di inizializzazione della shell..........................................................................................#2 2

3.1.1. .ile di con)igurazione dell:intero siste*a......................................................................#2 3.1.2. I )ile di con)igurazione del singolo utente.....................................................................## 3.1.3. Ca*biare i )ile di con)igurazione...................................................................................#7 3.2. 0ariabili..................................................................................................................................#" 3.2.1. /i i di variabili...............................................................................................................#" 3.2.2. Creazione delle variabili................................................................................................$( 3.2.3. 6s ortare variabili..........................................................................................................$1 3.2.#. 0ariabili riservate...........................................................................................................$2 3.2.$. Para*etri s eciali..........................................................................................................$& 3.2.&. 'iciclo degli scri t con le variabili................................................................................$" 3.3. Caratteri tra gli a ici..............................................................................................................&( 3.3.1. Perch?...........................................................................................................................&( 3.3.2. Caratteri di esca e..........................................................................................................&( 3.3.3. 1 ici singoli...................................................................................................................&( 3.3.#. 1 ici do i.....................................................................................................................&( 3.3.$. 0irgolettatura 1N2I<C....................................................................................................&1 3.3.&. 8ocali.............................................................................................................................&1 3.#. 6s ansione della shell............................................................................................................&1 3.#.1. In generale......................................................................................................................&1 3.#.2. 6s ansione delle arentesi gra))e...................................................................................&2 3.#.3. 6s ansione della tilde....................................................................................................&2 3.#.#. I ara*etri della shell e l:es ansione delle variabili......................................................&3 3.#.$. 8a sostituzione dei co*andi...........................................................................................&# 3.#.&. 6s ansione arit*etica....................................................................................................&$ 3.#.7. 2ostituzione dei rocessi................................................................................................&& 3.#.". 2co* osizione delle arole...........................................................................................&7 3.#.%. 6s ansione del no*e dei )ile.........................................................................................&7 3.$. 1lias.......................................................................................................................................&" 3.$.1. Cosa sono gli alias?........................................................................................................&" 3.$.2. Creazione e ri*ozione degli alias..................................................................................&% 3.&. 5lteriori o zioni di -ash........................................................................................................7( 3.&.1. , zioni di visualizzazione.............................................................................................7( 3.&.2. , zioni di *odi)ica.......................................................................................................7( 3.7. 2o**ario...............................................................................................................................71 3.". 6sercizi...................................................................................................................................72 Ca itolo #. 8e es ressioni regolari....................................................................................................73 #.1. 6s ressioni regolari................................................................................................................73 #.1.1. Cosa sono le es ressioni regolari?.................................................................................73 #.1.2. I *etacaratteri delle es ressioni regolari........................................................................73 #.1.3. 6s ressioni regolari ele*entari contro estese................................................................7# #.2. 6se* i di utilizzo di gre ......................................................................................................7# #.2.1. Cos:3 gre ?.....................................................................................................................7# #.2.2. 4re e le es ressioni regolari.........................................................................................7$ #.3. Co* arazione dei *odelli utilizzando le )unzionalit! di -ash.............................................77 #.3.1. Intervalli dei caratteri.....................................................................................................77 #.3.2. Classi di caratteri............................................................................................................7" #.#. 2o**ario...............................................................................................................................7% #.$. 6sercizi...................................................................................................................................7% Ca itolo $. 8:editor di )lussi 4N5 sed.............................................................................................."( $.1. Introduzione..........................................................................................................................."( 3

$.1.1. Che cosa 3 sed................................................................................................................"( $.1.2. I co*andi di sed............................................................................................................."( $.2. =odi)ica interattiva................................................................................................................"1 $.2.1. 2ta* a delle linee contenenti un *odello....................................................................."1 $.2.2. Cancellazione delle linee in ingresso contenenti un *odello........................................"2 $.2.3. Intervalli di linee............................................................................................................"2 $.2.#. Cerca e sostituisci con sed............................................................................................."3 $.3. =odi)iche non interattive......................................................................................................."# $.3.1. 8ettura dei co*andi di sed da un )ile............................................................................."# $.3.2. 2crittura dei )ile dei dati in uscita.................................................................................."$ $.#. 2o**ario..............................................................................................................................."& $.$. 6sercizi..................................................................................................................................."& Ca itolo &. Il linguaggio di rogra**azione 4N5 a>?.................................................................."" &.1. Introduzione a ga>?..............................................................................................................."" &.1.1. Cos:3 ga>??...................................................................................................................."" &.1.2. I co*andi di ga>?.........................................................................................................."% &.2. Il rogra**a rint................................................................................................................."% &.2.1. 2ta* a di ca* i selezionati..........................................................................................."% &.2.2. .or*attare i ca* i.........................................................................................................%( &.2.3. Il co*ando rint e le es ressioni regolari......................................................................%1 &.2.#. =odelli s eciali..............................................................................................................%2 &.2.$. 4li scri t in ga>?...........................................................................................................%3 &.3. 8e variabili di ga>?...............................................................................................................%3 &.3.1. Il se aratore di ca* i i**essi.......................................................................................%3 &.3.2. I se aratori di e*issione................................................................................................%# &.3.3. Il nu*ero di record.........................................................................................................%$ &.3.#. 0ariabili de)inite dall:utente...........................................................................................%& &.3.$. 5lteriori ese* i..............................................................................................................%& &.3.&. Il rogra**a rint)........................................................................................................%7 &.#. 2o**ario...............................................................................................................................%7 &.$. 6sercizi...................................................................................................................................%" Ca itolo 7. Istruzioni condizionali..................................................................................................1(( 7.1. Introduzione a i)...................................................................................................................1(( 7.1.1. In generale....................................................................................................................1(( 7.1.2. 2e* lici a licazioni di i)...........................................................................................1(3 7.2. 5so di i) i@ avanzato..........................................................................................................1($ 7.2.1. Costrutti i);then;else.....................................................................................................1($ 7.2.2. I costrutti i);then;else...................................................................................................1(% 7.2.3. Istruzioni i) annidate.....................................................................................................11( 7.2.#. , erazioni booleane.....................................................................................................11( 7.2.$. 5so dell:istruzione eAit e i)...........................................................................................111 7.3. 5so delle istruzioni case......................................................................................................112 7.3.1. Condizioni se* li)icate................................................................................................112 7.3.2. 6se* io di initscri t.....................................................................................................113 7.#. 2o**ario.............................................................................................................................11# 7.$. 6sercizi.................................................................................................................................11# Ca itolo ". 2crivere scri t interattivi...............................................................................................11& ".1. Presentare dei *essaggi er gli utenti..................................................................................11& ".1.1. Interattivi o *eno?.......................................................................................................11& ".1.2. 5so del co*ando integrato echo..................................................................................117 #

".2. Cattura dell:i**issione dell:utente......................................................................................11% ".2.1. 5so del co*ando integrato read...................................................................................11% ".2.2. 'ichieste di i**issione dati dagli utenti.....................................................................12( ".2.3. 'edirezione e descrittori dei )ile..................................................................................122 ".2.#. I**issioni ed e*issioni di )ile....................................................................................12# ".3. 2o**ario.............................................................................................................................12% ".#. 6sercizi.................................................................................................................................12% Ca itolo %. Co* iti ri etitivi..........................................................................................................131 %.1. Il ciclo )or.............................................................................................................................131 %.1.1. Co*e )unziona?...........................................................................................................131 %.1.2. 6se* i..........................................................................................................................131 %.2. Il ciclo >hile........................................................................................................................133 %.2.1. Cos:3?...........................................................................................................................133 %.2.2. 6se* i..........................................................................................................................133 %.3. Il ciclo until..........................................................................................................................13& %.3.1. Cos:3?...........................................................................................................................13& %.3.2. 6se* io........................................................................................................................13& %.#. 8a redirezione dell:I;, e i cicli............................................................................................137 %.#.1. 'edirezione dell:i**issione........................................................................................137 %.#.2. 'edirezione dell:e*issione...........................................................................................137 %.$. -rea? e continue..................................................................................................................13" %.$.1. 8:integrato brea?..........................................................................................................13" %.$.2. 8:integrato continue......................................................................................................13% %.$.3. 6se* i..........................................................................................................................13% %.&. Creazione di *enu con l:integrato select.............................................................................1#( %.&.1. In generale....................................................................................................................1#( %.&.2. 2otto*enu....................................................................................................................1#2 %.7. 8:integrato shi)t....................................................................................................................1#2 %.7.1. Che cosa )a?.................................................................................................................1#2 %.7.2. 6se* i..........................................................................................................................1#2 %.". 2o**ario.............................................................................................................................1## %.%. 6sercizi.................................................................................................................................1## Ca itolo 1(. +i i@ sulle variabili...................................................................................................1#& 1(.1. /i i di variabili...................................................................................................................1#& 1(.1.1. 1ssegna*ento di valori in generale...........................................................................1#& 1(.1.2. 5so dell:integrato declare...........................................................................................1#& 1(.1.3. Costanti......................................................................................................................1#7 1(.2. 0ariabili *atriciali.............................................................................................................1#" 1(.2.1. Creazione delle *atrici..............................................................................................1#" 1(.2.2. +ere)erenzia*ento delle variabili di una *atrice......................................................1#% 1(.2.3. Cancellare le variabili *atriciali................................................................................1#% 1(.2.#. 6se* i di *atrici.......................................................................................................1$( 1(.3. , erazioni su variabili.......................................................................................................1$2 1(.3.1. 1rit*etica con le variabili..........................................................................................1$2 1(.3.2. 8unghezza di una variabile........................................................................................1$2 1(.3.3. /ras)or*azioni di variabili.........................................................................................1$2 1(.#. 2o**ario...........................................................................................................................1$$ 1(.$. 6sercizi...............................................................................................................................1$$ Ca itolo 11. .unzioni......................................................................................................................1$7 11.1. Introduzione.......................................................................................................................1$7 $

11.1.1. Cosa sono le )unzioni?...............................................................................................1$7 11.1.2. 2intassi delle )unzioni................................................................................................1$7 11.1.3. I ara*etri osizionali nelle )unzioni.........................................................................1$" 11.1.#. =ostrare le )unzioni...................................................................................................1$% 11.2. 6se* i di )unzioni negli scri t..........................................................................................1&( 11.2.1. 'iciclaggio.................................................................................................................1&( 11.2.2. I* ostazione del ercorso..........................................................................................1&( 11.2.3. Co ie di salvataggio in re*oto...................................................................................1&1 11.3. 2o**ario...........................................................................................................................1&2 11.#. 6sercizi...............................................................................................................................1&2 Ca itolo 12. Cattura dei segnali......................................................................................................1&# 12.1. 2egnali...............................................................................................................................1&# 12.1.1. Introduzione...............................................................................................................1&# 12.1.2. 5so dei segnali con ?ill..............................................................................................1&$ 12.2. /ra ole.............................................................................................................................1&& 12.2.1. In generale..................................................................................................................1&& 12.2.2. Co*e -ash inter reta le tra ole...............................................................................1&7 12.2.3. 5lteriori ese* i..........................................................................................................1&7 12.3. 2o**ario...........................................................................................................................1&" 12.#. 6sercizi...............................................................................................................................1&" 1 endice 1 . Caratteristiche della shell..........................................................................................17( 1.1. Caratteristiche co*uni........................................................................................................17( 1.2. Caratteristiche di))erenti......................................................................................................171 4lossario..........................................................................................................................................17# Indice...............................................................................................................................................1%#

&

Introduzione
1. Perch questa guida?
Il *otivo rinci ale er la scrittura di questo docu*ento 3 che *olti lettori avvertono che l:esistente B,C/, 3 tro o breve ed inco* leto B,C/,, *entre la guida -ash scri ting 3 eccessiva co*e o era di ri)eri*ento. Non esiste nulla tra i due estre*i. Bo scritto ure questa guida sul rinci io generale che non sono dis onibili abbastanza corsi ele*entari liberi, sebbene dovrebbe essere cosD. 9uesta 3 una guida ratica che, sebbene non se* re *olto seria, tenta di )ornire ese* i di vita reale iuttosto che teorici. In articolare l:ho scritta erch non *i a))ascinano ese* i ri resi ed eccessiva*ente se* li)icati, scritti da ersone che conoscono ciE di cui stanno arlando e che *ostrano alcune caratteristiche di -ash vera*ente carine e cosD )uori dal suo contesto che non otrete usare *ai in circostanze ratiche. Potrete leggere questo genere di argo*enti do o aver ter*inato questo libro, che contiene esercizi ed ese* i che vi aiuteranno a so ravvivere nel *ondo reale. +alla *ia es erienza di utente 5NIF;8inuA, a**inistratrice di siste*a e docente, so che la gente uE avere anni di interazione quotidiana con i ro ri siste*i, senza avere la *ini*a conoscenza di auto*azione dei co* iti. CosD ensano )requente*ente che 5NIF non sia alla ortata degli utenti e, ancora eggio, ricevono l:i* ressione che sia lento e )uori *oda. /ale roble*a 3 un altro a cui si otr! orre ri*edio con questa guida.

2. Chi dovrebbe leggere questo libro?


Chiunque voglia se* li)icarsi la vita lavorando su un siste*a 5NIF o si*il<5NIF, co*e gli utenti voluti e gli a**inistratori, ossono trarre bene)icio dalla lettura di questo libro. I lettori che hanno gi! una certa adronanza nel lavorare nel siste*a usando la linea di co*ando i* areranno vantaggi e svantaggi della creazione di scri t di shell che se* li)ichino l:esecuzione dei co* iti quotidiani. 4li a**inistratori di siste*a )anno un grosso a))ida*ento sullo scri ting di shell7 lavori di uso co*une vengono s esso auto*atizzati utilizzando se* lici scri t. 9uesto docu*ento 3 ieno di ese* i che vi incoraggeranno a scriverne di ro ri e che vi is ireranno ad a ortare *igliorie agli scri t esistenti. Prerequisiti;non in questo corso7 +ovreste essere un utente es erto di 5NIF o 8inuA, ratico dei co*andi di base, delle agine *an e di docu*entazione 6ssere ca aci di usare un editor testuale Co* rendere i rocessi di avvio e s egni*ento del siste*a, init e initscri t Creare utenti e gru i, i* ostare ass>ord

Introduzione

Per*essi, *odalit! s eciali Co* rendere le convenzioni dei no*i delle eri)eriche, il artiziona*ento, il *ontaggio e lo s*ontaggio dei )ile sGste* 1ggiungere;ri*uovere so)t>are nei vostri siste*i

Consultate Introduzione a 8inuA Ho il vostro *irror locale di /8+PI se non avete trattato uno o i@ di questi argo*enti. In)or*azioni aggiuntive si ossono trovare nella vostra docu*entazione di siste*a H agine *an e in)oI o nel Progetto di Documentazione Linux (The Linux Documentation ProjectI.

3.

uove versioni! traduzioni e disponibilit"

8:edizione i@ recente si uE trovare su htt 7;;tille.garrels.be;training;bash;. Potreste trovare la stessa versione su htt 7;;tld .org;8+P;-ash<-eginners<4uide;ht*l;indeA.ht*l. 9uesta guida 3 dis onibile Jin ingleseK sta* ata resso .ultus.co*. Figura 1. La copertina anteriore di Bash Guide for beginners

9uesta guida 3 stata tradotta7 traduzione cinese di Cang Cei su htt 7;;Aiao>ang.net;bgb<cn; traduzione ucraina di Laroslav .edevGch ed il suo gru o su htt 7;;docs.linuA.org.ua;indeA. h ;8+P7-ashMbeginnersMguide 5na traduzione )rancese 3 in corso e verr! aggiunta ai collega*enti non a ena sar! ter*inata.

#. Cronologia delle revisioni


Cronologia delle revisioni Introduzione "

'evisione 1.11 /rattate le segnalazioni dei lettori. 'evisione 1.1( Ca*bio di indirizzi 'evisione 1.% 'evisione 1."

2(("<12<27 2(("<(&<(& 2((&<1(<1(

'evisionata da7 =4 'evisionata da7 =4 'evisionata da7 =4

Incor orati i co**enti dei lettori, aggiunto indice utilizzando le etichette +oc-oo?. chiarito ese* io nel Ca itolo #, corretto doc here nel ca itolo %, veri)iche generali e correzione degli errori ti ogra)ici, aggiunti i collega*enti alle traduzioni cinese e ucraina, note ed altro da sa ere su a>? nel ca itolo &. 'evisione 1.7 Corretti errori ti ogra)ici nei ca itoli 3, & e 7, incor orati dei co**enti dei letttori, aggiunta una nota nel ca itolo 7. 'evisione 1.& Correzioni *inori, aggiunte i@ arole chiave, in)or*azioni su nuova -ash 3.(, tolta un:i**agine vuota. 'evisione 1.( 0ersione iniziale er 8+PN i@ esercizi, i@ *arcature, *eno errori e aggiunta del glossario 'evisione 1.(<beta Pre<rilascio

$. Contributi
4razie a tutti gli a*ici che hanno aiutato Ho hanno cercato di )arloI e a *io *arito7 le vostre arole di incoraggia*ento hanno reso ossibile questo lavoro. 4razie a tutte le ersone che hanno inviato segnalazioni di errori, ese* i e co**enti O di cui )ra gli altri tantissi*i7 Bans -ol, uno dei gru etti =i?e 2i*, co**enti sullo stile +an 'ichter, er gli ese* i sulle *atrici 4erg .erguson, er le idee sul titolo =endel 8eo Coo er, er aver )atto s azio PlinuA.be, er aver tenuto i *iei iedi a terra .ran? Cang, er i suoi dettagliati co**enti sulle cose che ho sbagliato a )are N<I 'ingrazia*enti s eciali a /abatha =arshall, che si 3 dedicata volonterosa*ente a svolgere una revisione ed un controllo ortogra)ico e gra**aticale co* leti. .or*ia*o una bella squadra7 lei lavora quando io dor*o. 6 viceversa N<I

Introduzione

%. &iscontri
In)or*azioni *ancanti, collega*enti assenti, caratteri sco* arsi, note? Inviateli a <tille non vuole spam _at_ garrels punto be> la *anutentrice di questo docu*ento.

'. In(or)azioni sui diritti


* * * * * * * * * * * * * * * * * * * * * * * * Copyright (c) 2002-2007, Machtelt Garrels All rights reserved. Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met: * Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer. * Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution. * Neither the name of the author, Machtelt Garrels, nor the names of its contributors may be used to endorse or promote products derived from this software without specific prior written permission. THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR AND CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.

8:autrice e l:editore hanno )atto ogni s)orzo nella re arazione di questo libro er assicurare l:accuratezza delle in)or*azioni. /uttavia le in)or*azioni contenute in questo libro sono o))erte senza garanzia, sia es ressa che tacita. N l:autrice, n l:editore o qualunque altro venditore o distributore saranno ritenuti res onsabili er qualsiasi danno causato o ritenuto causato sia diretta*ente che indiretta*ente da questo libro. I loghi, i *archi co**erciali e i si*boli utilizzati in questo libro sono ro riet! dei ris ettivi titolari.

*. +i cosa avete bisogno?


Bash, dis onibile su htt 7;;>>>.gnu.org;directorG;4N5;. 8a shell -ash si trova in quasi tutti i siste*i 8inuA ed attual*ente si uE incontrare in un:a* ia variet! di siste*i 5NIF. 6: )acile da co* ilare se ve ne serve una vostra, collaudata su una grande variet! di 5NIF, 8inuA =2 Cindo>s ed ad altri siste*i. Introduzione 1(

,. Convenzioni utilizzate in questo docu)ento


In questo testo sono resenti le seguenti convenzioni ti ogra)iche e d:utilizzo7 Tabella 1: Convenzioni tipografiche e di utilizzo Tipo di testo Q/esto virgolettatoR
vista da terminale

Significato Citazione da ersone, risultato del co* uter tra virgolette. Ingresso ed uscita dati letterale del co* uter catturati dal ter*inale, solita*ente reso con uno s)ondo grigio chiaro. No*e di un co*ando che uE essere inserito nella riga di co*ando. No*e di una variabile o di un untatore ad un contenuto della variabile, co*e in $NOMEVAR. , zione di un co*ando, co*e in Ql:o zione -a del co*ando lsR. 1rgo*ento di un co*ando, co*e in Qleggete man lsR. sintassi dei co*andi od utilizzo in generale nella riga di co*ando No*e di un )ile o di una directorG, er ese* io QCa*biate verso la directorG /usr/binR, /asti da battere sulla tastiera, co*e Qbattete Q er ter*inareR. -ottone gra)ico da re*ere, co*e il bottone ,S. 2celta da e))ettuare in un *enu gra)ico, er ese* io Q2cegliete 4uida< TIn)or*azioni su =ozilla .ire)oA nel vostro navigatore di reteR. /er*ine o concetto i* ortante7 QIl kernel di 8inuA costituisce il cuore del siste*aR. 8a sbarra inversa in una vista di ter*inale o nella sintassi di un co*ando indica una riga non ter*inata. In altre arole, se vedete un co*ando lungo che 3 suddiviso in i@ righe, U signi)ica QNon re*ete ancora In ioVR. Collega*ento al relativo argo*ento contenuto in questa guida. Collega*ento cliccabile ad una risorsa di rete esterna.

comando VARIABILE opzione argomento comando opzioni argomenti nomefile Tasto -ottone =enu<T2celta Terminologia

U v. Ca itolo 1 8:autore

1-. .rganizzazione di questo docu)ento


9uesta guida tratta concetti utili nella vita quotidiana del serio utente di -ash. 2ebbene sia richiesta una conoscenza di base dell:uso della shell, noi iniziere*o con la discussione sui co* onenti ele*entari della shell e con esercizi nei ri*i tre ca itoli. I ca itoli dal quattro al sei sono trattazioni sugli stru*enti base che vengono nor*al*ente i* iegati Introduzione 11

negli scri t di shell. I ca itoli dall:otto al dodici si occu ano dei i@ co*uni costrutti degli scri t di shell. /utti i ca itoli hanno degli esercizi che veri)icheranno la vostra re arazione er quelli successivi. Ca itolo 17 'udi*enti di -ash7 erch -ash 3 cosD valida, costruzione di blocchi, ri*e linee guida nello svilu o di buoni scri t. Ca itolo 27 'udi*enti di scri t7 scrittura e correzione. Ca itolo 37 8:a*biente di -ash7 )ile di inizializzazione, variabili, caratteri virgolettati, ordine di es ansione della shell, alias, o zioni. Ca itolo #7 6s ressioni regolari7 una introduzione. Ca itolo $7 2ed7 una introduzione all:editor di linea sed. Ca itolo &7 1>?7 introduzione al linguaggio di rogra**azione a>?. Ca itolo 77 Istruzioni condizionali7 costrutti usati in -ash er veri)icare le condizioni Ca itolo "7 2cri t interattivi7 creare se* lici scri t er catturare gli in ut degli utenti Ca itolo %7 6secuzione ri etuta di co*andi7 costrutti usati in -ash er auto*atizzare l:esecuzione dei co*andi. Ca itolo 1(7 0ariabili avanzate7 s eci)icare i ti i delle variabili, introduzione alle *atrici delle variabili, o erazioni su variabili. Ca itolo 117 .unzioni7 una introduzione. Ca itolo 127 Cattura dei segnali7 introduzione alle segnalazioni dei rocessi, segnali di cattura inviati dagli utenti.

Introduzione

12

Capitolo 1. Bash e gli script di Bash


In questo *odulo introduttivo descrivere*o alcune shell co*uni evidenziere*o i vantaggi e le caratteristiche della -ash 4N5 descrivere*o i blocchi di costruzione della shell trattere*o i )ile di inizializzazione di -ash vedre*o co*e la shell esegue i co*andi osservere*o alcuni se* lici ese* i di scri t

1.1. Co)uni progra))i della shell


1.1.1. /unzioni generali di shell
Il rogra**a 5NIF di shell inter reta i co*andi degli utenti, che vengono i* artiti diretta*ente dall:utente, o che ossono essere letti da un )ile chia*ato scri t di shell o rogra**a di shell. 4li scri t di shell sono inter retati, non co* ilati. 8a shell legge i co*andi dallo scri t riga er riga e cerca quei co*andi nel siste*a Hv. 2ezione 1.2I *entre un co* ilatore converte un rogra**a in un )or*ato leggibile dalla *acchina, un )ile eseguibile O che oi otrebbe essere utilizzato in uno scri t di shell. 1 arte il assaggio dei co*andi al ?ernel, il co* ito rinci ale di una shell 3 di )ornire un a*biente er l:utente, che uE essere con)igurato individual*ente usando i )ile di con)igurazione delle risorse di shell.

1.1.2. 0ipi di shell


Pro rio co*e le ersone che conoscono di))erenti linguaggi e dialetti, il vostro siste*a 5NIF nor*al*ente o))rir! una variet! di ti i di shell7 sh o -ourne 2hell7 la shell originale ancora utilizzata nei siste*i 5NIF e nei loro relativi a*bienti. 9uesta 3 la shell base, un iccolo rogra**a con oche )unzionalit!. 2ebbene questa non sia la shell standard, 3 ancora dis onibile in ogni siste*a 8inuA er co* atibilit! con i rogra**i 5NIF. bash o -ourne 1gain 2hell7 la shell 4N5 standard, intuitiva e )lessibile. Probabil*ente *olto consigliabile agli utenti rinci ianti ur essendo allo stesso te* o uno stru*ento otente er gli utenti avanzati e ro)essionali. In 8inuA bash 3 la shell standard er gli utenti co*uni. 9uesta shell 3 un cosiddetto uper et della shell -ourne, un insie*e di aggiunte e lug<in. CiE signi)ica che la -ourne 1gain 2hell 3 co* atibile con la -ourne7 i co*andi che )unzionano con sh, Ca itolo 1. -ash e gli scri t di -ash 13

)unzionano ure con bash. csh o C shell7 la sintassi di questa shell a quella del linguaggio di rogra**azione C. /alvolta ricercata dai rogra**atori. tcsh o /6N6F C shell7 un su erinsie*e della co*une C shell, con *igliora*enti nella )acilit! d:uso e nella velocit!. 9uesto 3il *otivo er cui qualcuno la chia*a /urbo C shell. !sh o Sorn shell7 talvolta a rezzata da ersone con es erienze 5NIF. 5n su erinsie*e della -ourne shell7 in con)igurazione standard un incubo er gli utenti rinci ianti. Il )ile /etc/shells o))re una anora*ica delle shell conosciute in un siste*a 8inuA7
mia:~> cat /etc/shells /bin/bash /bin/sh /bin/tcsh /bin/csh

8a vostra shell rede)inita 3 i* ostata nel )ile /etc/passwd, co*e in questa linea dell:utente mia7
mia:L2NOfqdlPrHwE:504:504:Mia Maya:/home/mia:/bin/bash

Per assare da una shell all:altra basta inserire il no*e della nuova shell nel ter*inale attivo. Il siste*a trova la directorG dove ricorre il no*e utilizzando le i* ostazioni di PATH e, dal *o*ento che la shell 3 un )ile eseguibile H rogra**aI, l:attuale shell l:attiva ed essa viene eseguita. Nor*al*ente viene *ostrato un nuovo invito J promptK oich ogni shell ha la ro ria ti ica a arenza7 mia:~> tcsh [mia@post21 ~]$

1.2. 1antaggi della Bourne 2gain 3hell


1.2.1. Bash 4 la shell 5 6
Il rogetto 4N5 H4N5:s Not 5NIFI )ornisce stru*enti er l:a**inistrazione di siste*i si*il< 5NIF che sono so)t>are libero e aderente agli standard 5NIF. -ash 3 una shell co* atibile con sh che incor ora utili )unzionalit! rovenienti dalle shell Sorn H?shI e C HcshI. 6: rogettata er con)or*arsi allo standard I666 P,2IF P1((3.2;I2, %%#$.2 2hell and /ools. ,))re *igliora*enti )unzionali ris etto a sh sia er la rogra**azione che er l:uso interattivo7 ciE co* rende la scrittura a linea di co*ando, una cronologia dei co*andi dalle di*ensioni illi*itate, il controllo dei Wob, )unzioni di shell e alias, *atrici indicizzate di di*ensione illi*itata e un:arit*etica degli interi in qualsiasi base da due a sessantaquattro. -ash uE )ar girare la *aggior arte degli scri t sh senza *odi)iche. Co*e gli altri rogetti 4N5, l:iniziativa bash 3 iniziata er *antenere, roteggere e ro*uovere la libert! di uso, studio, co ia, *odi)ica e redistribuzione del so)t>are. 6: general*ente noto che queste condizioni sti*olano la creativit!. 9uesto era anche il caso del rogra**a bash, che ha *olte lici )unzionalit! eAtra che altre shell non sono in grado di o))rire. Ca itolo 1. -ash e gli scri t di -ash 1#

1.2.2. /unzionalit" riscontrabili solo in bash


1.2.2.1. Invocazione
In aggiunta alle o zioni di shell a singolo carattere nella riga di co*ando che ossono essere general*ente con)igurate utilizzando il co*ando interno alla shell set, esistono diverse o zioni *ulticarattere che otete usare. Ci interessere*o in questo e nei successivi ca itoli di una co ia delle o zioni i@ o olari7 l:elenco co* leto si uE trovare nelle agine in)o di -ash, -ash )eatures< TInvo?ing -ash.

1.2.2.2. I (ile di avvio di Bash


I )ile di avvio J tartup file K sono degli scri t che vengono letti ed eseguiti da -ash quando questo arte. 8e seguenti sottosezioni descrivono dei *odi di))erenti er avviare la shell e i relativi )ile di avvio che vengono letti.

1.2.2.2.1.

Chia)ata co)e shell di login interattiva! o con 788login7

Interattivo signi)ica che otete inviare dei co*andi. 8a shell non sta )unzionando erch uno scri t 3 stato attivato. 5na shell di login signi)ica che avete una shell do o l:autenticazione nel siste*a, nor*al*ente dando il vostro no*e utente e la ass>ord. .ile letti7 /etc/profile ~/.bash_profile, ~/.bash_login o esistente ure ~/.profile7 viene letto il ri*o )ile

~/.bash_logout alla chiusura della sessione JlogoutK 0engono e*essi dei *essaggi di errore se i )ile di con)igurazione esistono *a non sono leggibili. 2e un )ile non esiste, bash cerca il successivo.

1.2.2.2.2.

Chia)ata co)e shell interattiva non di login

2hell non di login signi)ica che non dovete autenticarvi nel siste*a. Per ese* io, quando a rite un ter*inale usando una icona o una voce di *enu, questa 3 una shell non di login. .ile letti7

Ca itolo 1. -ash e gli scri t di -ash

1$

~/.bashrc 9uesto )ile nor*al*ente si ri)erisce a ~/.bash_profile7 if " -f ~/.bashrc #$ then . ~/.bashrc$ fi 0. Ca itolo 7 er *aggiori in)or*azioni sul costrutto i).

1.2.2.2.3.

Chia)ata non interattiva

/utti gli scri t usano shell non interattive. 6ssi sono rogra**ati er svolgere certi co* iti e non ossono essere istruiti a svolgere altri lavori eccetto quelli er cui sono stati rogra**ati. .ile letti7 de)inito da BASH_ENV PATH non viene utilizzato er ricercare questo )ile, cosicch, se volete usarlo, *eglio ri)erirsi ad esso dando il ercorso ed il no*e co* leti.

1.2.2.2.#.

Chia)ata con il co)ando sh

-ash cerca di co* ortarsi co*e lo storico rogra**a sh *entre aderisce il i@ ossibile allo standard P,2IF. .ile letti7 /etc/profile ~/.profile 9uando chia*ata interattiva*ente, la variabile ENV aggiuntive. uE untare ad in)or*azioni di avvio

1.2.2.2.$.

9odalit" P.3I:

9uesta o zione viene abilitata o usando il set integrato7 set -o posix o ure chia*ando il rogra**a bash con l:o zione Oposix. -ash tenter! quindi di attenersi il i@ ossibile allo standard P,2IF er le shell. 2i ottiene la stessa cosa i* ostando la variabile 1&

Ca itolo 1. -ash e gli scri t di -ash

POSIXLY_CORRECT. .ile letti7 de)inito da BASH_ENV.

1.2.2.2.%.

Chia)ata da re)oto

File letti quando chiamata da rshd7 ~/.bashrc % itate l&uso di r'tools 2tate attenti ai ericoli (uando utilizzate stru*enti co*e rlogin, telnet, rsh e rcp7 sono intrinseca*ente insicuri oich i dati con)idenziali vengono inviati in chiaro sulla rete. 2e vi servono stru*enti er esecuzioni, tras)eri*ento )ile e cosD via in re*oto, utilizzate un:i* le*entazione di 2ecure 2hell, nota co*une*ente co*e 22B,dis onibile libera*ente su htt 7;;>>>.o enssh.org. 2ono dis onibili anche diversi rogra**i cliente er siste*i non 5NIF7 consultate il vostro *irror locale di so)t>are.

1.2.2.2.'.

Chia)ata quando 6I+ non 4 uguale a ;6I+

5n questo caso non viene letto alcun )ile d:avvio.

1.2.2.3. 3hell interattive


1.2.2.3.1. Cosa una shell interattiva?

5na shell interattiva general*ente legge da e scrive su ub ter*inale utente7 ingresso ed uscita dei dati sono collegati ad un ter*inale. Il co* orta*ento interattivo di -ash inizia quando il co*ando bash viene chia*ato senza argo*enti rivi di o zioni, eccetto quando l:o zione 3 una stringa da leggere nella shell o quando questa viene invocata er leggere dall:ingresso standard dei dati J tandard inputK che er*ette di i* ostare i ara*etri osizionali Hv. Ca itolo 3I.

1.2.2.3.2.

<uesta 4 una shell interattiva?

0eri)icate osservando il contenuto dello s eciale ara*etro -7 contiene una :i: quando la shell 3 interattiva. eddy:~> echo $himBH Ca itolo 1. -ash e gli scri t di -ash 17

Nelle shell non interattive, l:invito Jo promptK, P21, non 3 i* ostato.

1.2.2.3.3.

Co)porta)ento della shell interattiva

+i))erenze nella *odalit! interattiva7 -ash legge i )ile di avvio Controllo dei rocessi nor*al*ente abilitato 4li inviti sono de)initi, P22 3 abilitata er i co*andi *ultilinea, i* ostata di solito a QTR. 9uesto 3 anche l:invito che ottenete quando la shell ritiene che abbiate inserito un co*ando inco* leto, er ese* io quando scordate degli a ici, delle strutture dei co*andi che non ossono essere tralasciate, ecc... I co*andi vengono letti in *odo rede)inito dalla riga di co*ando utilizzando readline. -ash inter reta l:o zione di shell ignoreeof invece di uscire i**ediata*ente con la ricezione di 6,. H6nd ,) .ileI. 8a cronologia dei co*andi e l:es ansione della cronologia vengono abilitate in artenza. 8a cronologia viene salvata nel )ile untato da HISTFILE quando la shell ter*ina. In artenza, BI2/.I86 unta a ~/.bash_history. 6: abilitata l:es ansione degli alias. In assenza di tra ole, il segnale SIGTERM viene ignorato. In assenza di tra ole, il segnale SIGINT viene viene intercettato e gestito. 9uindi, er ese* io, battendo )trl*) non si interro* er! la vostra shell interattiva. 8:invio di segnali SIGHUP a tutti i rocessi viene con)igurato tra*ite l:o zione huponexit. I co*andi vengono eseguiti su lettura. -ash controlla eriodica*ente la osta. -ash uE essere con)igurata er ter*inare quando incontra variabili non re)erenziate. Nella *odalit! interattiva questo co* orta*ento 3 disabilitato. 9uando i co*andi integrati della shell incontrano errori di redirezione, ciE non deter*ina l:uscita della shell. Co*andi integrati s eciali che restituiscono errori in *odalit! P,2IF non deter*inano l:uscita della shell. 9uesti sono elencati nella 2ezione 1.3.2. Il )alli*ento di e+ec non )ar! uscire la shell. Il se* lice controllo ortogra)ico er gli argo*enti dell:integrato cd viene abilitato in artenza. 0iene abilitata l:uscita auto*atica do o la scadenza del eriodo s eci)icato nella variabile /=,5/. =aggiori in)or*azioni7 2ezione 3.2

Ca itolo 1. -ash e gli scri t di -ash

1"

2ezione 3.& v. Ca itolo 12 er un di i@ sui segnali. 2ezione 3.# tratta le varie es ansioni eseguite con l:inseri*ento di un co*ando.

1.2.2.#. Le espressioni condizionali


8e es ressioni condizionali vengono usate dal co*ando co* osto JJ e da test e dai co*andi integrati J. 8e es ressioni ossono essere unarie o binarie. 8e es ressioni unarie vengono s esso utilizzate er esa*inare lo stato di un )ile. 0i serve solo un oggetto, er ese* io un )ile, er realizzare l:o erazione. 6sistono ure degli o eratori di stringa e degli o eratori di con)ronto nu*erico7 questi sono o eratori binari, che richiedono due ele*enti er co* letare l:o erazione. 2e l:argo*ento di FILE di uno degli unari 3 nella )or*a /dev/fd/N, allora il descrittore dei )ile N 3 selezionato. 2e l:argo*ento di FILE di uno degli unari 3 del ti o /dev/stdin, /dev/stdout o ;dev/stderr, allora 3 ris ettiva*ente selezionato il descrittore dei )ile (, 1 o 2. 8e es ressioni condizionali sono trattate in dettaglio nel Ca itolo 7. =aggiori in)or*azioni sui descrittori dei )ile nella 2ezione ".2.3.

1.2.2.$. 2rit)etica della shell


8a shell consente di calcolare delle es ressioni arit*etiche, con una delle es ansioni della shell o con l:integrato let. Il calcolo viene svolto con interi di di*ensione )issa senza controllo degli eccessi, sebbene la divisione er ( venga intercettata e segnalata co*e un errore. 4li o eratori e le loro recedenze e co*binazioni sono le stesse del linguaggio C, v. Ca itolo 3.

1.2.2.%. 5li alias


4li alias er*ettono di sostituire una stringa con una arola quando viene utilizzata co*e ri*a arola di un se* lice co*ando. 8a shell conserva un elenco degli alias che uE essere abilitato e disabilitato con i co*andi alias e unalias. -ash legge se* re al*eno una linea di ingresso co* leta ri*a di eseguire uno qualsiasi dei co*andi di quella linea. 4li alias vengono es ansi quando viene letto un co*ando, non quando viene eseguito. 9uindi una de)inizione di alias che a are nella stessa linea co*e altro co*ando Ca itolo 1. -ash e gli scri t di -ash 1%

non ha alcun e))etto )inch non viene letta la successiva linea di ingresso. I co*andi che seguono la de)inizione dell:alias in quella linea non vengono in)luenzati dai nuovi alias. 4li alias vengono es ansi quando viene letta una de)inizione di )unzione,non quando viene eseguita la )unzione, erch una de)inizione di )unzione 3 di er s stessa un co*ando co* osto. +i conseguenza, gli alias de)initi in una )unzione non sono dis onibili solo do o che la )unzione 3 eseguita. +iscutere*o degli alias in dettaglio nella 2ezione 3.$.

1.2.2.'. Le )atrici
-ash )ornisce variabili di *atrici *onodi*ensionali. 9ualsiasi variabile uE essere usata co*e una *atriceN l:integrato declare dichiarer! es licita*ente una *atrice. Non esiste li*ite *assi*o della di*ensione di una *atrice e ne ure un qualche requisito che i *e*bri vengano indicizzati o assegnati in *odo contiguo. 8e *atrici artono dallo zero. 0. Ca itolo 1(.

1.2.2.*. Pila di director=


8a ila di directorG Jdirector! tackK 3 un elenco delle directorG visitate di recente. 8:integrato pushd aggiunge directorG alla ila co*e ca*bia la directorG corrente e l:integrato popd ri*uove s eci)iche directorG dalla ila e ca*bia la directorG corrente in quella ri*ossa. I contenuti ossono essere *ostrati dando il co*ando dirs o selezionando il contenuto della variabile DIRSTACK. 5lteriori in)or*azioni sul )unziona*ento di questo *eccanis*o si si uE trovare nelle agine in)o di -ash.

1.2.2.,. L7invito
-ash rende se* re i@ divertente giocare con l:invito J promptK. 0. la 2ezione Controllare l"invito nelle agine in)o di -ash.

1.2.2.1-. La shell ristretta


9uando si invoca co*e rbash o con le o zioni Orestricted o -r, ca itano le cose seguenti7 Il cd integrato 3 disabilitato. 6: i* ossibile i* ostare o cancellare le i* ostazioni di SHELL, ENV o BASH_ENV. Ca itolo 1. -ash e gli scri t di -ash 2(

I no*i dei co*andi non ossono i@ contenere barre. I no*i dei )ile contenenti una barra non sono i@ consentiti con il co*ando integrato . HsorgenteI. 8:hash integrato non accetta barre con l:o zione -p. 8:i* ortazione di )unzioni all:avvio 3 disabilitata. SHELLOPTS viene ignorata all:avvio. 8a redirezione in uscita utilizzando >, TX, ><, >&, &> e >> 3 disabilitata. 8:integrato e+ec 3 disabilitato. 8e o zioni <) e <d sono disabilitate er l:integrato enable. 5n P1/B base non uE essere s eci)icato tra*ite l:integrato command. Non 3 ossibile s egnere il *odo ristretto. 9uando viene eseguito un co*ando che si sco re essere uno scri t, rbash esclude qualsiasi restrizione rodotta er eseguire lo scri t. 5lteriori in)or*azioni7 2ezione 3.2 2ezione 3.& In)o bash<T-asic 2hell .eatures<T'edirections 2ezione ".2.37 redirezione avanzata

1.3. ;secuzione dei co)andi


1.3.1. In generale
-ash stabilisce il ti o di rogra**a che deve essere eseguito. I rogra**i nor*ali sono co*andi di siste*a che esistono nel vostro siste*a in )or*a co* ilata. 9uando un tale rogra**a viene eseguito, viene creato un nuovo rocesso erch -ash crea una co ia esatta di se stesso. 9uesto rocesso )iglio ha lo stesso a*biente del suo genitore, *entre solo il nu*ero I+ del rocesso 3 diverso. 9uesta rocedura viene chia*ata biforcazione o forking. +o o il rocesso di bi)orcazione, lo s azio degli indirizzi del rocesso )iglio viene sovrascritto con i nuovi dati del rocesso. CiE viene realizzato tra*ite una chia*ata exec al siste*a. Il *eccanis*o fork#and#exec sca*bia oi un vecchio co*ando con uno nuovo, *entre l:a*biente in cui viene eseguito il nuovo rogra**a ri*ane il *edesi*o, co* resi la con)igurazione delle eri)eriche d:ingresso e uscita, le variabili a*bientali e la riorit!. /ale *eccanis*o 3 usato er creare tutti i rocessi di 5NIF, e cosD si a lica al siste*a o erativo 8inuA. 1nche il il ri*o rocesso, init, con I+ di rocesso 1, viene bi)orcato durante la rocedura di avvio chia*ata di Ca itolo 1. -ash e gli scri t di -ash 21

boot trapping.

1.3.2. Co)andi integrati della shell


I co*andi integrati Jbuilt#in commandK sono contenuti nella shell stessa. 9uando si usa il no*e di un co*ando integrato co*e ri*a arola di un se* lice co*ando, la shell esegue il co*ando diretta*ente, senza creare un nuovo rocesso. I co*andi integrati sono necessari er )ornire )unzionalit! i* ossibili o oco convenienti da ottenere con rogra**i di utilit! se arati. -ash su orta 3 ti i di co*andi integrati7

integrati della -ourne 2hell7 ,, ., brea!, cd, continue, e al, e+ec, e+it, e+port, getopts, hash, p-d, readonl., return, set, shift, test, ", times, trap, umas! e unset. Co*andi integrati di -ash7 alias, bind, builtin, command, declare, echo, enable, help, let, local, logout/ printf, read, shopt, t.pe, t.peset, ulimit e unalias. Co*andi integrati s eciali7 9uando -ash viene eseguito in *odalit! P,2IF, gli integrati s eciali di))eriscono dagli altri co*andi integrati er tre *otivi7 1. 4li integrati s eciali si trovano ri*a delle )unzioni di shell durante la ricerca dei co*andi Jcomand lookupK. 2. se un integrato s eciale restituisce uno stato di errore, una shell non interattiva ter*ina. 3. 8e istruzioni di assegna*ento che recedono il co*ando hanno e))etto nell:a*biente della shell do o il co* leta*ento del co*ando. 4li integrati s eciali P,2IF sono7 ., brea!, continue, e al, e+ec, e+it, e+port, readonl., return, set, shift, trap e unset. =olti di questi integrati verranno trattati nei rossi*i ca itoli. Per quei co*andi esclusi , )accia*o ri)eri*ento alle agine In)o.

1.3.3. ;secuzione di progra))i da uno script


9uando viene eseguito un rogra**a che 3 uno scri t di shell, bash creer! un nuovo rocesso bash ricorrendo ad una bi)orcazione JforkK. 9uesta sottoshell legge le linee dello scri t di shell una er volta. I co*andi di ciascuna linea vengono letti, inter retati ed eseguiti co*e se )ossero stati battuti diretta*ente dalla tastiera.

Ca itolo 1. -ash e gli scri t di -ash

22

=entre la sottoshell elabora ogni linea dello scri t, la shell genitrice as etta che il rocesso )iglio ter*ini. 9uando non ci sono i@ linee da leggere nello scri t di shell, la sottoshell ter*ina. 8a shell genitrice si risveglia e *ostra un nuovo invito.

1.#. Costruzione di blocchi


1.#.1. Costruzione di blocchi di shell
1.#.1.1. 3intassi della shell
2e i dati in ingresso non sono co**entati, la shell li legge e li suddivide in arole ed o eratori, utilizzando le regole delle virgolettature er de)inire il signi)icato di ogni carattere in ingresso. Poi queste arole ed o eratori vengono tradotte in co*andi ed altri costrutti, che restituiscono uno stato di uscita utilizzabile er is ezioni o elaborazioni. Il recedente sche*a bi)orca<ed<esegui J fork#and# execK viene a licato solo do o che la shell ha analizzato i dati in ingresso nel *odo seguente7 8a shell legge i dati in ingresso da un )ile, da una stringa o dal ter*inale dell:utente. I dati in ingresso vengono suddivisi in arole ed o eratori, obbedendo alle regole di virgolettatura Hv. Ca itolo 3I. 9uesti s ezzoni HtokenI sono se arati da metacaratteri. 0iene eseguita l:es ansione l:es ansione degli alias. 8a shell comprende Hanalizza e sostituisceI gli s ezzoni co*e co*andi se* lici e co* osti. -ash esegue svariate es ansioni della shell, scindendo gli s ezzoni es ansi in elenchi di no*i di )ile, co*andi e argo*enti. 2e necessario viene attuata la redirezione7 gli o eratori di redirezione e i loro o erandi vengono ri*ossi dall:elenco degli argo*enti. I co*andi vengono eseguiti. 6ventual*ente la shell as etta dei co*andi er co* letare e ricevere il suo stato di uscita.

1.#.1.2. Co)andi della shell 5n banale co*ando di shell co*e touch file1 file2 file3 consiste nel co*ando stesso seguito da argo*enti, se arati da s azi. Co*andi di shell i@ co* licati sono )or*ati da se* lici co*andi co*binati assie*e in svariate *odalit!7 in una conduttura HpipelineI in cui il risultato di un co*ando diventa il dato in ingresso di un secondo, in un costrutto iterattivo o condizionale, o in qualche altro raggru a*ento. 5na co ia di ese* i7 ls 0 more gun1ip file.tar.gz 0 tar xvf -

Ca itolo 1. -ash e gli scri t di -ash

23

1.#.1.3. /unzioni della shell 8e )unzioni della shell sono un *odo er raggru are co*andi er un:esecuzione successiva utilizzando un solo no*e er il gru o. 0engono eseguiti ro rio co*e un co*ando QregolareR. 9uando il no*e di una )unzione di shell 3 utilizzato co*e un se* lice no*e di co*ando, viene eseguito l:elenco dei co*andi associati con tale )unzione. 8e )unzioni della shell vengono eseguite nel contesto della shell corrente7 nessun nuovo rocesso 3 creato er inter retarle. 8e )unzioni sono s iegate nel Ca itolo 11.

1.#.1.#. Para)etri della shell 5n ara*etro 3 un:entit! che contiene valori. PuE essere un no*e, un nu*ero o un valore s eciale. Per quanto riguarda la shell, una variabile 3 un ara*etro che conserva un no*e. 5na variabile ha un valore e zero o i@ attributi. 8e variabili si creano con il co*ando integrato alla shell declare. 2e non 3 stato dato un valore, alla variabile viene assegnata una stringa vuota. 8e variabili ossono essere eli*inate solo con l:integrato unset. 8:assegna*ento alle variabili 3 trattato nella 2ezione 3.2, *entre l:uso avanzato delle variabili nel Ca itolo 1(.

1.#.1.$. ;spansione della shell 8:es ansione della shell viene attuata do o che ciascuna linea di co*ando 3 stata divisa in )ra**enti. 9ueste sono le es ansioni eseguite7 6s ansione delle arentesi 6s ansione della tilde 6s ansione dei ara*etri e delle variabili 2ostituzione dei co*andi 6s ansione arit*etica 2uddivisione delle arole 6s ansione del no*e dei )ile +iscutere*o in dettaglio di questi ti i di es ansione nella 2ezione 3.#.

Ca itolo 1. -ash e gli scri t di -ash

2#

1.#.1.%. &edirezioni
Pri*a dell:esecuzione di un co*ando, i suoi dati in ingresso ed uscita otrebbero essere rediretti utilizzando una s eciale notazione inter retata dalla shell. 8a redirezione uE essere usata anche er a rire e chiudere )ile del corrente a*biente di esecuzione della shell.

1.#.1.'. ;secuzione dei co)andi


9uando un co*ando 3 in esecuzione, le arole che l:analizzatore sintattico H par erI ha segnato co*e assegnazioni di variabili H recedendo il no*e del co*andoI e le redirezioni vengono salvate quale ri)eri*ento )uturo. 8e arole che non sono assegnazioni di variabili o redirezioni vengono es anseN la ri*a arola che ri*ane do o l:es ansione viene resa quale no*e del co*ando ed il resto costituisce gli argo*enti di quel co*ando. 0engono oi eseguite le redirezioni, quindi le stringhe assegnate alle variabili vengono es anse. 2e non risulta alcun no*e di co*ando, le variabili in)luenzeranno l:attuale a*biente di shell. 5na arte i* ortante dei co* iti della shell 3 la ricerca dei co*andi. -ash )a ciE co*e segue7 controlla se il co*ando contiene delle barre. 2e non 3 cosD, veri)ica er ri*a cosa con l:elenco delle )unzioni er vedere se contiene un co*ando in base al no*e che stia*o cercandoN se il co*ando non 3 una )unzione, controlla se c:3 nell:elenco degli integratiN se il co*ando non 3 n una )unzione, n un integrato, lo ricerca analizzando le directorG elencate in PATH. -ash utilizza una tabella di ha h Hha h tableI Harea di conservazione dei dati in *e*oriaI er ricordare l:intero no*e dei ercorsi degli eseguibili in *odo da evitare estese ricerche in PATH. se la ricerca non riesce, bash sta* a un *essaggio di errore e restituisce uno stato di uscita di 127. se la ricerca riesce o il co*ando contiene delle sbarre, la shell esegue il co*ando in un a*biente di esecuzione se arato. se l:esecuzione )allisce erch il )ile non 3 eseguibile e non 3 una directorG, si su uno scri t di shell. one che sia

se il co*ando non 3 stato iniziato in *odo asincrono, la shell as etta il co*ando er co* letare e raccogliere il suo stato di uscita.

1.2.1.3. Script di shell


9uando un )ile contenente co*andi di shell viene usato co*e ri*o argo*ento non<o zione al *o*ento di invocare -ash Hsenza -c o -sI, ciE creer! una shell non interattiva. /ale shell er ri*a cosa cerca il )ile di scri t nella directorG corrente, oi guarda in P1/B se non 3 ossibile trovare l! il )ile.

Ca itolo 1. -ash e gli scri t di -ash

2$

1.$. 3viluppare buoni script


1.$.1. Propriet" dei buoni script
9uesta guida 3 rinci al*ente sull:ulti*o *attone considerazioni generali ri*a di continuare7 1. 2. 3. #. $. er costruire la shell, gli scri t. 1lcune

5no scri t dovrebbe girare senza errori. +ovrebbe eseguire il co* ito a cui 3 destinato. 8a logica del rogra**a 3 chiara*ente de)inita e visibile. 5no scri t non svolge necessaria*ente un lavoro. 4li scri t dovrebbero essere riutilizzabili.

1.$.2. 3truttura
8a struttura di una scri t di shell 3 *olto )lessibile. 1nche se in -ash viene garantita *olta libert!, voi dovete assicurare una logica corretta, un controllo dei )lussi e l:e))icienza, cosicch gli utenti che )anno )unzionare lo scri t lo ossano )are in *odo )acile e corretto. 1ll:inizio di un nuovo scri t, onetevi le seguenti do*ande7 1vrE bisogno di qualche in)or*azione dall:utente o dall:a*biente dell:utente? co*e conserverE queste in)or*azioni? c:3 qualche )ile che deve essere creato? dove e con quali er*essi e ro riet!? quali co*andi utilizzerE? quando si usa lo scri t in diversi siste*i, tutti questi siste*i avranno tali co*andi nelle versioni richieste? all:utente serve una qualche noti)ica? quando e erch?

1.$.3. 0er)inologia
8a tabella successiva ci o))re una anora*ica dei ter*ini di rogra**azione che vi occorrono er )a*iliarizzare con7 Tabella 1#1: Panoramica ui termini della programmazione Termine Ciclo JloopK Controllo dei co*andi Jcommand controlK )os&45 Porzione di rogra**a che viene eseguita zero o i@ volte. 2tato di uscita di rova er deter*inare se una arte del rogra**a debba essere eseguita.

Ca itolo 1. -ash e gli scri t di -ash

2&

.lusso logico Jlogic flo$K Inseri*ento da utente Ju er inputK 2alto condizionale Jconditional branchK

8a struttura generale del rogra**a. +eter*ina la sequenza logica dei co* iti in *odo che il risultato sia corretto e controllato. In)or*azione )ornita da una )onte esterna *entre il rogra**a 3 in esecuzione7 uE essere conservata e richia*ata quando serve. Punto logico del rogra**a in cui unna condizione deter*ina cosa avviene do o.

1.$.#. 6na parola su ordine e logica


Per velocizzare il rocesso di svilu o, l:ordine logico di un rogra**a dovrebbe essere ensato in antici o. 9uesto 3 il ri*o asso quando si svilu a uno scri t. Possono essere usati nu*erosi *etodi7 uno dei i@ co*uni 3 quello di lavorare con liste. 2tilare un elenco dettagliato dei co* iti i* licati in un rogra**a vi er*ette di descrivere ciascun rocesso. 2ingoli co* iti ossono essere re)erenziati con il loro nu*ero di elenco. 8:utilizzo del vostro ersonale linguaggio arlato er annotare i co* iti da svolgere con il rogra**a vi aiuter! a creare una )or*a co* rensibile del rogra**a stesso. 2uccessiva*ente, otrete ri* iazzare i co*andi del linguaggio quotidiano con le arole e i costrutti del linguaggio di shell. 8:ese* io sottostante *ostra tale de)inizione del )lusso logico. +escrive la rotazione dei )ile di registro Hlog fileI. 9uesto ese* io un ossibile ciclo ri etitivo, controllato dal nu*ero di )ile di registro che desiderate ruotare7 1. 2i vuole ruotare le registrazioni? aI 2e sD7 i. Inserire il no*e della directorG che contiene le registrazioni da ruotare. ii. Inserire il no*e dell:archivio del )ile di registro. iii. 'endere le *odi)iche er*anenti nel )ile crontab dell:utente. bI 2e no, andare al asso 3. 2. 0olete ruotare un altro insie*e di registrazioni? aI 2e sD7 ri etere il asso 1. bI 2e no7 andare al asso 3. 3. 5scita 8:utente dovrebbe )ornire in)or*azioni al rogra**a er )are qualcosa. 8:inseri*ento dei dati da utente deve essere ottenuto e conservato. 8:utente dovrebbe essere avvisato che il suo crontab verr! *odi)icato.

1.$.$. 6n ese)pio di script di Bash> )iosiste)a.sh


8o scri t miosistema.sh qui sotto esegue alcuni co*andi ben noti H date/ -/ uname/ uptimeI Ca itolo 1. -ash e gli scri t di -ash 27

er *ostrare delle in)or*azioni su di voi ed il vostro siste*a.


tom:~> cat -n miosistema.sh 1 #!/bin/bash 2 clear 3 echo "Queste sono informazioni sono fornite da miosistema.sh. Il programma inizia ora." 4 5 echo "Ciao, $USER" 6 echo 7 8 echo "La data odierna `date`, questa la settimana n. `date +"%V"`." 9 echo 10 11 echo "Questi sono gli utenti attualmente collegati:" 12 w | cut -d " " -f 1 - | grep -v USER | sort -u 13 echo 14 15 echo "Questo `uname -s` che gira in un processore `uname -m`." 16 echo 17 18 echo "Questa l'informazione di uptime:" 19 uptime 20 echo 21 22 echo "Questo tutto gente!"

5no scri t inizia se* re con gli stessi due caratteri, QPVR. +o o di ciE, 3 de)inita la shell che eseguir! i co*andi susseguenti la ri*a linea. 9uesto scri t inizia alla linea 2 con la ri ulitura dello scher*o. 8a linea 3 )a sD che sta* i un *essaggio in)or*ante l:utente su cosa sta er avvenire. 8a linea $ saluta l:utente. 8e linee &, %, 13, 1& e 2( si trovano l! solo a sco o di *ostrare i risultati in *odo ordinato. 8a linea " sta* a la data attuale ed il nu*ero della setti*ana. 8a linea 11 3 nuova*ente un *essaggio in)or*ativo co*e le linee 3, 1" e 22. 8a linea 12 )or*atta il risultato di -N la linea 1$ *ostra le in)or*azioni sul siste*a o erativo e la CP5. 8a linea 1% o))re le in)or*azioni di u ti*e e del carico. 2ia echo che printf sono dei co*andi -ash integrati. Il ri*o esce se* re con uno stato ( e sta* a se* lice*ente argo*enti seguiti da un carattere di )ine linea J %nd &f Line o 6,8K, *entre il successivo er*ette di de)inire una stringa di )or*attazione e d! in caso di )alli*ento un codice di stato di uscita diverso da zero. 9uesto 3 lo stesso scri t che utilizza l:integrato printf7
tom:~> cat -n miosistema.sh #!/bin/bash clear printf "Queste sono informazioni sono fornite da miosistema.sh. Il programma inizia ora.\n" printf "Ciao, $USER\n\n" printf "La data odierna `date`, questa la settimana n. `date +"%V"`.\n\n" printf "Questi sono gli utenti attualmente collegati:\n" w | cut -d " " -f 1 - | grep -v USER | sort -u printf "\n" printf "Questo `uname -s` che gira in un processore `uname -m`.\n\n" printf "Questa l'informazione di uptime:\n"

Ca itolo 1. -ash e gli scri t di -ash

2"

uptime printf "\n" printf "Questo tutto gente!\n"

8a creazione di scri t di )acile uso grazie all:inseri*ento di *essaggi viene trattata nel Ca itolo ". 6osi1ione standard della Bourne 7gain shell CiE i* lica che il rogra**a bash sia installato in ;bin. Se non 4 disponibile stdout 2e eseguite uno scri t da cron, )ornite i no*i dei ercorsi interi e ridirigete dati in uscita ed errori. 2icco*e la shell gira in *odo non interattivo,qualsiasi errore otrebbe deter*inare l:uscita re*atura dello scri t se non ensate a ciE. I ca itoli seguenti tratteranno i dettagli degli scri t qui so ra.

1.$.%. ;se)pio di script init


5no scri t init avvia i servizi di siste*a nelle *acchine 5NIF e 8inuA. Il de*one del registro di siste*a H ! tem log daemonI, il de*one della gestione dell:ali*entazione H po$er management daemonI, i de*oni dei no*i e della osta sono degli ese* i co*uni. 9uesti scri t, conosciuti anche co*e scri t di avvio H tartup criptI, vengono conservati in una locazione s eci)ica del vostro siste*a, co*e /etc.rd/init.d o /etc/init.d. Init, il rocesso iniziale, legge i suoi )ile di con)igurazione e decide quali servizi avviare o )er*are in ciascun livello di esecuzione. 5n livello di esecuzione 3 una con)igurazione di rocessi7 ogni siste*a ha un livello di esecuzione singolo utente, ad ese* io, er svolgere dei co* iti a**inistrativi, er cui il siste*a deve trovarsi in una condizione di inutilizzo er quanto ossibile, co*e quando si sta ri ristinando un )ile sGste* critico da una co ia di sicurezza. Nor*al*ente vengono con)igurati anche i livelli di esecuzione del riavvio e dello s egni*ento. I co* iti da svolgere er avviare o )er*are un servizio sono elencati negli scri t di avvio. 8a con)igurazione di init 4 una delle *ansioni dell:a**inistratore di siste*a, in *odo che quei servizi vengano avviati e )er*ati al *o*ento giusto. 9uando a))rontate questo co* ito, vi serve u7na buona co* rensione delle rocedure di avvio e s egni*ento del vostro siste*a. +:altronde vi consiglia*o di leggere le agine *an di init e inittab ri*a di co*inciare con i vostri scri t di inizializzazione ersonali. 9ui c:3 un ese* io *olto se* lice che rodurr! un suono all:avvio ed allo s egni*ento della vostra *acchina7
#!/bin/bash # This script is for /etc/rc.d/init.d # Link in rc3.d/S99audio-greeting and rc0.d/K01audio-greeting case "$1" in 'start') cat /usr/share/audio/at_your_service.au > /dev/audio ;; 'stop') cat /usr/share/audio/oh_no_not_again.au > /dev/audio ;;

Ca itolo 1. -ash e gli scri t di -ash

2%

esac exit 0

8:istruzione case, s esso utilizzata in questo ti o di scri t, 3 descritta nella 2ezione 7.2.$.

1.%. 3o))ario
-ash 3 la shell 4N5, co* atibile con la shell -ourne e incor orante *olte )unzioni utili di altre shell. 9uando viene avviata, la shell legge i suoi )ile di con)igurazione. I i@ i* ortanti sono7 /etc/profile ~/.bash_profile ~/.bashrc -ash si co* orta in *odo diverso quando 3 in *odalit! interattiva ed ha ure una *odalit! con)or*e e ristretta a P,2IF. I co*andi di shell ossono essere suddivisi in tre gru i7 le )unzioni di shell, gli integrati della shell e i co*andi esistenti in una directorG nel vostro siste*a. -ash su orta degli integrati aggiuntivi che non si trovano nella nor*ale shell -ourne. 4li scri t di shell consistono di tali co*andi organizzati co*e co*anda la sintassi della shell. 4li scri t vengono letti ed eseguiti linea er linea e dovrebbero avere una struttura logica.

1.'. ;sercizi
9uesti sono alcuni esercizi er re ararvi al rossi*o ca itolo. 1. +ov:3 osizionato il rogra**a bash nel vostro siste*a? 2. 5tilizzate l:o zione versione er sco rire quale versione state )acendo girare. 3. 9uali )ile di con)igurazione di shell vengono letti quando vi autenticate nel siste*a usando l:inter)accia gra)ica dell:utente H45I o 'raphical ( er )nterfaceI e quando a rite una )inestra di ter*inale? #. 8e seguenti shell sono shell interattive? 2ono shell di login? 5na shell a erta cliccando sullo s)ondo della vostra scrivania gra)ica, selezionando Q/er*inalR o qualcosa di si*ile da un *enu. 5na shell che ottenete do o aver dato il co*ando ssh localhost. 5na shell che ottenete quando vi autenticate nella console in *odalit! testo. 5na shell ottenuta con il co*ando +term 8. 5na shell a erta dallo scri t miosistema.sh. 5na shell che ottenete su un host re*oto, er la quale non dovete autenticarvi e;o dare la ass>ord erch utilizzate 22B e )orse le chiavi 22B. $. Potete s iegare erch bash non esce quando battete )trl*) nella riga di co*ando? &. =ostrate il contenuto della catasta H tackI delle directorG. 7. 2e non 3 ancora il caso, i* ostate il vostro invito in *odo che *ostri la vostra osizione nella gerarchia del siste*a. Per ese* io, aggiungete questa linea a ~/.bashrc7 Ca itolo 1. -ash e gli scri t di -ash 3(

e+port PS1="\u@\h \w> " ". =ostrate i co*andi con il cancelletto HPI della vostra corrente sessione di shell. %. 9uanti rocessi stanno girando attual*ente nel vostro siste*a? 5sate ps e -c7 la ri*a linea di dati in uscita di ps non 3 un rocessoV 1(. Co*e si *ostra il no*e host del siste*a? 2olo il no*e, nient:altroV

Ca itolo 1. -ash e gli scri t di -ash

31

Capitolo 2. 3crivere e correggere gli script


+o o aver assato questo ca itolo sarete in grado di7 2crivere un se* lice scri t +e)inire il ti o di shell che dovrebbe eseguire lo scri t Inserire dei co**enti in uno scri t Ca*biare i er*essi in uno scri t 6seguire e correggere uno scri t

2.1. Creare ed avviare uno script


2.1.1. 3crittura e deno)inazione
5no scri t di shell 3 una sequenza di co*andi che dovete usare )requente*ente. /ale sequenza viene eseguita nor*al*ente inserendo il no*e dello scri t nella linea di co*ando. In alternativa, otete usare gli scri t er auto*atizzare dei co* iti utilizzando lo stru*ento cron. 5n altro uso degli scri t si ha nella rocedura 5NIF di avvio e s egni*ento, in cui le o erazioni dei de*oni e servizi vengono stabilite negli init scri t. Per creare uno scri t di shell, a rite un nuovo )ile vuoto nel vostro editor. 0a bene qualsiasi editor di testo7 im, emacs, gedit, dtpad, eccetera, sono tutti validi. Potreste tuttavia desiderare di scegliere un editor i@ avanzato co*e im o emacs erch questi ossono essere con)igurati er riconoscere la sintassi delle shell e di -ash e ossono essere di grande aiuto nel revenire quegli errori che i rinci ianti )anno di )requente, co*e il di*enticare arentesi e unti e virgola. % iden1ia1ione della sintassi in im Per attivare l:evidenziazione della sintassi in im, usate il co*ando ,s.nta+ enable o ure

7s. enable o ure

,s.n enable Potete aggiungere questa i* ostazione al vostro )ile .vimrc er renderla er*anente. Ca itolo 2. 2crivere e correggere gli scri t 32

=ettete i co*andi 5NIF nel )ile nuovo vuoto co*e li inserireste nella linea di co*ando. Co*e trattato nel ca itolo recedente Hv. 2ezione 1.3I, i co*andi ossono essere delle )unzioni di shell, degli integrati di shell, dei co*andi 5NIF e altri scri t. 1ttribuite al vostro scri t un no*e con)acente che suggerisca ciE che lo scri t roduce. 1ccertatevi che il no*e dello scri t non con)ligga con co*andi esistenti. Per assicurarvi che non si ossa creare con)usione, i no*i degli scri t s esso ter*inano in .sh7 anche cosD, ci otrebbero essere altri scri t nel vostro siste*a con lo stesso no*e di quello che avete scelto. 0eri)icate usando -hich, -hereis e altri co*andi er la ricerca di in)or*azioni su rogra**i e )ile7 -hich -a script_name -hereis script_name locate script_name

2.1.2. script1.sh
In questo ese* io usia*o l:integrato di -ash echo er in)or*are l:utente su cosa sta er avvenire, ri*a che venga eseguito il co* ito che creer! il risultato. 2i consiglia viva*ente di in)or*are gli utenti su cosa sta )acendo uno scri t, er evitare che si innervosiscano perch* lo cript non ta facendo niente. 'itornere*o sull:argo*ento della co*unicazione con gli utenti nel Ca itolo ".

Ca itolo 2. 2crivere e correggere gli scri t

33

-igura .#1/ cript1/ h 2crivete questo scri t da voi stessi co*e *eglio otete. Potrebbe essere una buona idea creare una directorG ~/scripts er tenere i vostri scri t. 1ggiungete la directorG ai contenuti della variabile PATH7 e+port PATH="$PATH:~/scripts" 2e state a ena inco*inciando con -ash, utilizzate un editor testuale che usi colori di))erenti er di))erenti costrutti di shell. 8:evidenziazione della sintassi 3 su ortata da im, g im, 9+:emacs, !-rite e *olti altri editor7 controllate la docu*entazione del vostro editor re)erito. In iti differenti 4li inviti HpromptI in questo corso ossono variare in base allo s irito dell:autore. CiE si accosta i@ alle situazione della vita reale iuttosto del tradizionale educativo invito +. 8:unica convenzione a cui ci attenia*o 3 che l:invito di root ter*ina con un segno cancelletto H, o ha h markI.

Ca itolo 2. 2crivere e correggere gli scri t

3#

2.1.3. ;secuzione dello script


8o scri t er oter essere lanciato dovrebbe avere i er*essi di esecuzione er gli utenti corretti . 9uando si i* ostano i er*essi, veri)icate di ottenere real*ente i er*essi che volete. .atto ciE, lo scri t uE avviarsi co*e qualunque altro co*ando7
willy:~/scripts> chmod u+x script1.sh willy:~/scripts> ls -l script1.sh -rwxrw-r-- 1 willy willy 456 Dec 24 17:11 script1.sh willy:~> script1.sh The script starts now. Hi, willy! I will now fetch you a list of connected users: 3:38pm up 18 days, 5:37, 4 users, load average: 0.12, 0.22, 0.15 USER TTY FROM LOGIN@ IDLE JCPU PCPU WHAT root tty2 - Sat 2pm 4:25m 0.24s 0.05s -bash willy :0 - Sat 2pm ? 0.00s ? willy pts/3 - Sat 2pm 3:33m 36.39s 36.39s BitchX willy ir willy pts/2 - Sat 2pm 3:33m 0.13s 0.06s /usr/bin/screen I'm setting two variables now. This is a string: black And this is a number: 9 I'm giving you back your prompt now. willy:~/scripts> echo $COLOUR willy:~/scripts> echo $VALUE willy:~/scripts>

9uesto 3 il *odo i@ co*une er eseguire uno scri t. 6: re)eribile eseguire uno scri t co*e questo in una sottoshell. 8e variabili, )unzioni ed alias creati in questa sottoshell sono noti solo alla articolare sessione di bash di tale sottoshell. 9uando quella shell ter*ina e la genitrice riacquista il controllo, tutto viene ri ulito e ed ogni *odi)ica di stato di shell eseguita dallo scri t viene di*enticata. 2e non *ettete la directorG scripts nel vostro PATH e . Hla directorG correnteI non 3 ne ure nel P1/B, otete attivare lo scri t in questo *odo7 .;nome<script.sh 5no scri t uE essere eseguito es licita*ente da una data shell, *a in genere )accia*o questo se voglia*o ottenere un co* orta*ento s eciale, co*e ad ese* io controllare se lo scri t )unziona con un:altra shell o sta* are le tracce er la ricerca degli errori7 rbash nome_script.sh sh nome_script.sh bash -x nome_script.sh 8a shell s eci)icata artir! co*e sottoshell di quella corrente ed eseguir! lo scri t. 9uesto 3 )atto desiderate che lo scri t si avvii con s eci)iche o zioni o sotto s eci)iche condizioni non recisate nello scri t.

Ca itolo 2. 2crivere e correggere gli scri t

3$

2e non volete avviare una nuova shell *a eseguire lo scri t in quella corrente, dovete usare ource con esso7 source nome_script.sh source = . 8:integrato di -ash source 3 un sinoni*o del co*ando . H untoI della shell -ourne. 8o scri t non ha bisogno in questo caso del er*esso di esecuzione. I co*andi vengono eseguiti nel contesto della attuale shell, cosicch ogni *odi)ica a ortata al vostro a*biente sar! visibile al ter*ine dell:esecuzione dello scri t7
willy:~/scripts> source script1.sh --output ommitted-willy:~/scripts> echo $VALUE 9 willy:~/scripts>

2.2. Le basi degli script


2.2.1. <uale shell eseguir" lo script?
9uando )ate girare uno scri t in una sottoshell, dovreste stabilire quale shell dovrebbe )arlo )unzionare. Il ti o di shell in cui avete scritto lo scri t otrebbe non essere quella rede)inita del vostro siste*a, cosicch i co*andi da voi inseriti otrebbero restituire degli errori qualora eseguiti dalla shell sbagliata. 8a ri*a riga dello scri t deter*ina la shell d:avvio. I ri*i due caratteri della ri*a linea dovrebbero essere #!, seguiti oi dal ercorso della shell che dovrebbe inter retare i co*andi successivi. 8e linee vuote sono considerate anch:esse delle linee, erciE non iniziate il vostro scri t con una linea vuota. Per lo sco o di questo corso, tutti gli scri t inizieranno con la linea =>;bin;bash Co*e notato ri*a, questo i* lica che l:eseguibile di -ash si trovi in /bin.

2.2.2. 2ggiungere co))enti


+ovreste stare attenti al )atto che otreste non essere l:unica ersona a leggere il vostro codice. Ca itolo 2. 2crivere e correggere gli scri t 3&

=olti utenti ed a**inistratori di siste*a )anno girare scri t che sono stati scritti da altre ersone. 2e essi vogliono vedere co*e l:avete realizzato, i co**enti sono utili er illu*inare il lettore. I co**enti rendono ure i@ se* lice la vostra vita. +ite che avete dovuto leggere un *ucchio di agine *an er raggiungere un articolare risultato con qualche co*ando utilizzato nel vostro scri t. Potreste non ricordare i@ co*e )unzionava se avete necessit! di *odi)icare il vostro scri t do o oche setti*ane o *esi, a *eno che non abbiate co**entato cosa, co*e e;o erch lo avete )atto. Prendete l:ese* io script1.sh e co iatelo co*e script1-commentato.sh, che *odi)ichia*o in *odo che i co**enti ris ecchino ciE che )a lo scri t. /utto ciE che la shell incontra in una linea do o un segno di cancelletto viene ignorato ed 3 visibile solo con l:a ertura del )ile dello scri t di shell7
#!/bin/bash # Questo script pulisce il terminal2, mostra un saluto e fornisce informazioni # sugli utenti attualmente connessi. Le due variabili d'esempio vengono # impostate e mostrate. clear # pulisce la finestra di terminale

echo "Lo script inizia adesso." echo "Ciao, $USER!" # Il segno dollaro si usa per ottenere il contenuto di una variabile echo echo "Ora ti invio un elenco degli utenti connessi:" echo w # mostra chi collegato e echo # cosa sta facendo echo "Adesso sto impostando due variabili." COLORE="nero" # imposta una variabile locale di VALORE="9" # imposta una variabile locale di echo "Questa una stringa: $COLORE" # mostra il contenuto della echo "E questo un numero: $VALORE" # mostra il contenuto della echo echo "Ora ti restituisco l'invito." echo

shell shell variabile variabile

In uno scri t decente,le ri*e righe sono nor*al*ente dei co**enti su ciE che ci as etta. Poi ciascun grosso ezzo di co*andi verr! co**entato secondo necessita er ragioni di chiarezza. 4li scri t init di 8inuA, er ese* io, nella vostra directorG di siste*a init.d, di solito sono ben co**entati dal *o*ento che devono essere leggibili e *odi)icabili da chiunque )accia )unzionare 8inuA.

2.3. Caccia agli errori negli script Bash


2.3.1. Correzioni nell7intero script
9uando le cose non rocedono secondo i iani, dovete stabilire esatta*ente cosa deter*ini lo scri t a sbagliare. -ash )ornisce estese )unzionalit! er la caccia agli errori. 8a i@ co*une 3 quella di Ca itolo 2. 2crivere e correggere gli scri t 37

avviare la sottoshell con l:o zione <A, che )ar! girare lo scri t intero in *odalit! correzione H debug modeI. Il traccia*ento di ogni co*ando i@ i suoi argo*enti vengono sta* ati nella eri)erica rede)inita er l:e*issione dei dati H tandard outputI do o che i co*andi sono stati es ansi *a ri*a della loro esecuzione. 9uesto 3 lo scri t script1-commentato.sh )atto girare in *odalit! correzione. Notate nuova*ente che i co**enti aggiunti non sono visibili nei risultati dello scri t.
willy:~/scripts> bash -x ./script1.sh + clear

+ echo 'Lo script inizia adesso.' Lo script inizia adesso. + echo 'Ciao, willy!' Ciao, willy! + echo + echo 'Ora ti invio un elenco degli utenti connessi:' Ora ti invio un elenco degli utenti connessi: + echo + w 4:50pm up 18 days, 6:49, 4 users, load average: 0.58, 0.62, 0.40 USER TTY FROM LOGIN@ IDLE JCPU PCPU WHAT root tty2 Sat 2pm 5:36m 0.24s 0.05s -bash willy :0 Sat 2pm ? 0.00s ? willy pts/3 Sat 2pm 43:13 36.82s 36.82s BitchX willy ir willy pts/2 Sat 2pm 43:13 0.13s 0.06s /usr/bin/screen + echo + echo 'Adesso sto impostando due variabili.' Adesso sto impostando due variabili. + COLORE=nero + VALORE=9 + echo 'Questa una stringa: nero' Questa una stringa: nero + echo 'E questo un numero: 9' E questo un numero: 9 + echo + echo 'Ora ti restituisco l'\''invito.' Ora ti restituisco l'invito. + echo

,ra esiste un correttore HdebuggerI co* leto er -ash, dis onibile su 2ource.orge. 9ueste )unzioni er la correzione sono dis onibili nelle versioni i@ *oderne di -ash, a artire dalla 3.A.

2.3.2. Correzione su parte?i dello script


5tilizzando l:integrato di -ash set, otete )ar eseguire in *odalit! nor*ale quelle arti dello scri t di cui siete certi che non abbiano errori, e otete *ostrare le in)or*azioni er la correzione solo delle zone roble*atiche. +ite che non siete sicuri di ciE che )ar! il co*ando - nell:ese* io scri t1<co**entato.sh, quindi otre**o includerlo in uno scri t co*e questo7
set -x w set +x # attiva i controlli di correzione da qui # ferma i controlli di correzione da qui

Ca itolo 2. 2crivere e correggere gli scri t

3"

Il risultato sar! si*ile a questo7


willy:~/scripts> script1.sh Lo script inizia adesso. Ciao, willy! Ora ti invio un elenco degli utenti connessi: + w 5:00pm up 18 days, 7:0, 4 users, load average: 0.79, 0.39, 0.33 USER TTY FROM LOGIN@ IDLE JCPU PCPU WHAT root tty2 Sat 2pm 5:47m 0.24s 0.05s -bash willy :0 Sat 2pm ? 0.00s ? willy pts/3 Sat 2pm 54:02 36.88s 36.88s BitchX willyke willy pts/2 Sat 2pm 54:02 0.13s 0.06s /usr/bin/screen + set +x Adesso sto impostando due variabili. Questa una stringa: nero E questo un numero: Ora ti restituisco l'invito. willy:~/scripts>

Potete attivare e disattivare la *odalit! di correzione quante volte volete con lo stesso scri t. 8a tabella successiva o))re una anora*ica di altre utili o zioni di -ash7 Tabella .#1: Panoramica delle opzioni ?ota1ione abbre iata ?ota1ione estesa set <) set <v set <A set <o noglob set <o verbose set <o Atrace %ffetto +isabilita la generazione del no*e dl )ile usando *etacaratteri HglobbingI. 2ta* a le linee in entrata alla shell co*e esse vengono lette. 2ta* a il traccia*ento dei co*andi loro esecuzione. ri*a della

8a lineetta viene utilizzata er attivare una o zione di shell e un i@ er disattivarla. Non )atevi con)ondere da ciEV Nell:ese* io sottostante di*ostria*o queste o zioni nella linea di co*ando7
willy:~/scripts> set -v willy:~/scripts> ls ls script-commentati.sh willy:~/scripts> set +v set +v willy:~/scripts> ls * script-commentati.sh willy:~/scripts> set -f willy:~/scripts> ls * ls: *: No such file or directory

script1.sh

script1.sh

Ca itolo 2. 2crivere e correggere gli scri t

3%

willy:~/scripts> touch * willy:~/scripts> ls * script-commentati.sh willy:~/scripts> rm * willy:~/scripts> ls script-commentati.sh script1.sh

script1.sh

In alternativa, questi *odi ossono essere s eci)icati nello scri t stesso, aggiungendo le o zioni desiderate alla dichiarazione di shell nella ri*a linea. 8e o zioni ossono essere co*binate, co*e abitual*ente 3 il caso dei co*andi 5NIF7 =>;bin;bash -xv 5na volta che avete individuato la arte errata del vostro scri t, otete aggiungere le istruzioni echo ri*a di ogni co*ando di cui non vi )idate, in *odo che otrete vedere esatta*ente dove e erch le cose non )unzionano. Nello scri t d:ese* io scri t1<co**entato.sh, avrebbe otuto essere )atto co*e questo, su onendo ancora che l:elencazione degli utenti ci dia dei roble*i7
echo "messaggio della correzione: ora tentiamo di avviare il comando w"; w

In scri t i@ avanzati, echo uE essere inserita er *ostrare il contenuto di variabili in )asi diverse dello scri t, cosicch i di)etti ossono essere individuati7
echo "La variabile NOMEVAR ora impostata a $NOMEVAR."

2.#. 3o))ario
5no scri t di shell 3 una serie riutilizzabile di co*andi *essi in un )ile di testo eseguibile. 9ualsiasi editor di testo uE essere i* iegato er redigere degli scri t. 4li scri t iniziano con ,0 seguiti dal ercorso della shell che esegue i co*andi dello scri t. I co**enti vengono aggiunti ad uno scri t er vostro )uturo ro*e*oria ed anche er renderli co* rensibili ad altri utenti. 6: *eglio avere s iegazioni in eccesso iuttosto che insu))icienti. 8a ricerca di errori in uno scri t uE essere e))ettuata utilizzando le o zioni della shell. 8e o zioni della shell ossono venir usate er una caccia agli errori arziale o er analizzare l:intero scri t. Pure l:inseri*ento di co*andi echo in unti strategici 3 una co*une tecnica er eli*inare i roble*i.

2.$. ;sercizi
9uesto esercizio vi aiuter! a scrivere il vostro ri*o scri t. 1. 2crivete uno scri t utilizzando il vostro editor re)erito. 8o scri t dovrebbe *ostrare il ercorso alla vostra directorG ersonale ed il ti o di ter*inale che state usando. In aggiunta *ostra tutti i servizi attivati nel livello 3 del vostro siste*a Hsuggeri*ento7 usate HOME, TERM e ls /etc/rc3.d/S*I. Ca itolo 2. 2crivere e correggere gli scri t #(

2. 3. #. $.

1ggiungete co**enti al vostro scri t. 1ggiungete in)or*azioni er gli utenti del vostro scri t. Ca*biate i er*essi nel vostro scri t in *odo da oterlo eseguire. .ate girare lo scri t in *odalit! nor*ale ed in *odalit! di correzione. +ovrebbe )unzionare senza errori. &. Co**ettete errori nel vostro scri t7 osservate cosa succede se sbagliate a scrivere i co*andi, se di*enticate la ri*a linea o *ettete lD qualcosa di inco* rensibile, o se sbagliate a scrivere i no*i delle variabili di shell o li scrivete in caratteri *inuscoli do o che sono stati dichiarati in *aiuscolo. 0eri)icate cosa dicono i co**enti di correzione su ciE.

Ca itolo 2. 2crivere e correggere gli scri t

#1

Capitolo 3. L7a)biente di Bash


In questo ca itolo discutere*o sui vari *odi in cui l:a*biente di -ash in)luenzato7 =odi)icare i )ile di inizializzazione della shell 5sare variabili 5sare stili di virgolettature di))erenti 6seguire calcoli arit*etici 1ssegnare alias 5sare l:es ansione e la sostituzione uE essere

3.1. /ile di inizializzazione della shell


3.1.1. /ile di con(igurazione dell7intero siste)a
3.1.1.1. ?etc?pro(ile
9uando invocato interattiva*ente con l:o zione --login o co*e sh, -ash legge le istruzioni di /etc/profile. 9ueste di solito i* ostano le variabili PATH, USER, MAIL, HOSTNAME e HISTSIZE. In alcuni siste*i, il valore di umas! viene con)igurato in /etc/profileN in altri questo )ile contiene dei untatori ad altri )ile di con)igurazione co*e7 /etc/inputrc, il )ile di inizializzazione a lettura di linea del siste*a intero dove otete con)igurare lo stile della ca* anella della linea di co*ando Hcommand line bell# t!leI. la directorG /etc/profile.d, che contiene i )ile che deter*inano il co* orta*ento di s eci)ici rogra**i er l:intero siste*a. /utte le i* ostazioni che desiderate a licare a tutti gli a*bienti dei vostri utenti otrebbero stare in tale )ile, che otrebbe a arire co*e questo7
# /etc/profile # System wide environment and startup programs, for login setup PATH=$PATH:/usr/X11R6/bin # No core files by default ulimit -S -c 0 > /dev/null 2>&1 USER="`id -un`" LOGNAME=$USER MAIL="/var/spool/mail/$USER"

Ca itolo 3. 8:a*biente di -ash

#2

HOSTNAME=`/bin/hostname` HISTSIZE=1000 # Keyboard, bell, display style: the readline config file: if [ -z "$INPUTRC" -a ! -f "$HOME/.inputrc" ]; then INPUTRC=/etc/inputrc fi PS1="\u@\h \W" export PATH USER LOGNAME MAIL HOSTNAME HISTSIZE INPUTRC PS1 # Source initialization files for specific programs (ls, vim, less, ...) for i in /etc/profile.d/*.sh ; do if [ -r "$i" ]; then . $i fi done # Settings for program initialization source /etc/java.conf export NPX_PLUGIN_PATH="$JRE_HOME/plugin/ns4plugin/:/usr/lib/netscape/plugins" PAGER="/usr/bin/less" unset i

9uesto )ile di con)igurazione de)inisce alcune ele*entari variabili dell:a*biente della shell cosD co*e anche alcune variabili richieste dagli utenti che )anno girare Yava e;o a licazioni Yava nei loro navigatori di rete. 4uardate la 2ezione 3.2. +ate uno sguardo al Ca itolo 7 er *aggiori in)or*azioni sul condizionale if utilizzato in questo )ile7 il Ca itolo % tratta dei cicli co*e il costrutto for. Il sorgente di -ash contiene dei )ile profile di ese* io er uso generale o individuale. 9uesti e quello nell:ese* io recedente necessitano di *odi)iche er )arli )unzionare nel vostro a*bienteV

3.1.1.2. ?etc?bashrc
Nei siste*i che o))rono *olte lici ti i di shell, sarebbe *eglio *ettere delle con)igurazioni s eci)iche er -ash in tale )ile, dal *o*ento che ;etc; ro)ile; viene letto anche da altre shell, co*e la shell -ourne. 6rrori generati da shell che non co* rendono la sintassi di -ash si revengono se arando i )ile di con)igurazione er i diversi ti i di shell. In questi casi ~/.bashrc dell:utente otrebbe untare a /etc/bashrc er includerlo nel rocesso di inizializzazione della shell al *o*ento dell:autenticazione. Potreste anche trovare che nel vostro siste*a /etc/profile contiene solo l:a*biente di shell e le i* ostazioni d:avvio, *entre /etc/bashrc contiene le de)inizioni co* lessive del siste*a er le )unzioni di shell e gli alias. Il )ile /etc/bashrc otrebbe essere richia*ato in /etc/profile o nei )ile di inizializzazione shell di un singolo utente. Il sorgente contiene dei )ile bashrc d:ese* io, o ure otreste trovarne una co ia in /usr/share/doc/bash-2.05b/startup-files. 9uesto 3 una orzione del bashrc allegato alla docu*entazione di -ash7 Ca itolo 3. 8:a*biente di -ash #3

alias alias alias alias

ll='ls -l' dir='ls -ba' c='clear' ls='ls color'

alias mroe='more' alias pdw='pwd' alias sl='ls --color' pskill()


{ local pid pid=$(ps -ax | grep $1 | grep -v grep | gawk '{ print $1 }') echo -n "killing $1 (process $pid)..." kill -9 $pid echo "slaughtered." }

6scludendo gli alias generali, contiene degli utili alias che )anno )unzionare i co*andi anche quando li scrivete in *odo errato. Nella 2ezione 3.$.2 trattere*o degli alias. 9uesto )ile contiene una )unzione, ps!ill7 le )unzioni saranno studiate in dettaglio nel Ca itolo 11.

3.1.2. I file di configurazione del singolo utente


?on ho (uesti file5> 9uesti )ile otrebbero non esserci in origine nella vostra directorG ersonale7 createli se necessario.

3.1.2.1. ~/.bash_profile
9uesto 3 il )ile di con)igurazione re)erito er con)igurare i singoli a*bienti degli utenti. In questo )ile gli utenti ossono aggiungere delle con)igurazioni eAtra o ure ca*biare i valori rede)initi7
franky~> cat .bash_profile ################################################################# # # # .bash_profile file # # # # Executed from the bash shell when you log in. # # # ################################################################# source ~/.bashrc source ~/.bash_login case "$OS" in IRIX) stty sane dec stty erase ;; # SunOS) # stty erase # ;; *) stty sane

Ca itolo 3. 8:a*biente di -ash

##

;; esac

9uesto utente con)igura il carattere bac?s ace er l:autenticazione in di))erenti siste*i o erativi. 1 arte ciE, vengono letti .bashrc e .bash_login dell:utente.

3.1.2.2. ~/.bash_login
9uesto )ile contiene delle s eci)iche i* ostazioni che nor*al*ente vengono eseguite solo al *o*ento in cui vi autenticate nel siste*a. Nell:ese* io, lo usia*o er con)igurare il valore di umas! e er *ostrare un elenco degli utenti connessi al *o*ento della autenticazione H loginI. /ale utente ottiene anche il calendario del *ese corrente7
####################################################################### # # # Bash_login file # # # # commands to perform from the bash shell at login time # # (sourced from .bash_profile) # # # ####################################################################### # file protection umask 002 # all to me, read to group and others # miscellaneous w cal `date +"%m"` `date +"%Y"`

In *ancanza di ~/.bash_profile, verr! letto questo )ile.

3.1.2.3. ~/.profile
In assenza di ~/.bash_profile e di ~/.bash_login, viene letto ~/.profile. PuE tenere le stesse con)igurazioni, che oi sono accessibili anche dalle altre shell. 'icordatevi che altre shell otrebbero non co* rendere la sintassi di -ash.

3.1.2.#. Z;.bashrc
,ggi 3 i@ )requente utilizzare una shell senza autenticazione, er ese* io quando ci si 3 autenticati in a*biente gra)ico utilizzando le )inestre del ter*inale di F. 5na volta a erta una tale )inestra, l:utente non deve )ornire un no*e utente o una ass>ord7 non viene )atta nessuna autenticazione. 9uando ciE accade, -ash cerca ~/.bashrc a cui si )a ri)eri*ento nei )ile letti al *o*ento dell:autenticazione, il che signi)ica che non dovete inserire le stesse i* ostazioni in *olte lici )ile. In questo ~/.bashrc di utente una co ia di alias viene de)inita e vengono deter*inate delle variabili er s eci)ici rogra**i do o la lettura di /etc/bashrc dell:intero siste*a7
franky ~> cat .bashrc # /home/franky/.bashrc

Ca itolo 3. 8:a*biente di -ash

#$

# Source global definitions if [ -f /etc/bashrc ]; then . /etc/bashrc fi # shell options set -o noclobber # my shell variables export PS1="\[\033[1;44m\]\u \w\[\033[0m\] " export PATH="$PATH:~/bin:~/scripts" # my aliases alias cdrecord='cdrecord -dev 0,0,0 -speed=8' alias ss='ssh octarine' alias ll='ls -la' # mozilla fix MOZILLA_FIVE_HOME=/usr/lib/mozilla LD_LIBRARY_PATH=/usr/lib/mozilla:/usr/lib/mozilla/plugins MOZ_DIST_BIN=/usr/lib/mozilla MOZ_PROGRAM=/usr/lib/mozilla/mozilla-bin export MOZILLA_FIVE_HOME LD_LIBRARY_PATH MOZ_DIST_BIN MOZ_PROGRAM # font fix alias xt='xterm -bg black -fg white &' # BitchX settings export IRCNAME="frnk" # THE END franky ~>

2i ossono trovare *olti ese* i nel acchetto -ash. 'icordate che i )ile ca* ione otrebbero necessitare di *odi)iche er )unzionare nel vostro siste*a. 4li alias sono trattati nella 2ezione 3.$.

3.1.2.$. Z;.bashMlogout
9uesto )ile contiene istruzioni s eci)iche er la rocedura di chiusura della sessione HlogoutI. Nell:ese* io la )inestra di ter*inale viene cancellata al *o*ento della chiusura della sessione. CiE 3 utile er connessioni re*ote che lasceranno una )inestra ulita do o la loro chiusura.
franky ~> cat .bash_logout ####################################################################### # # # Bash_logout file # # # # commands to perform from the bash shell at logout time # # # #######################################################################

Ca itolo 3. 8:a*biente di -ash

#&

clear franky ~>

3.1.3. Ca)biare i (ile di con(igurazione


9uando e))ettuano delle *odi)iche ad uno qualsiasi dei )ile recedenti, gli utenti devono riconnettersi al siste*a od usare source con il )ile alterato a))inch i ca*bia*enti ossano avere e))etto. Inter retando lo scri t in questo *odo, le *odi)iche vengono a licate alla sessione corrente della shell7

)llu trazione 1/1#1/ )nviti differenti per utenti differenti 8a *aggioranza degli scri t vengono eseguiti in un a*biente rivato7 le variabili non vengono ereditate dai rocessi )igli a *eno che esse non siano es ortate dalla shell genitrice. 5sare source con un )ile contenente co*andi di shell 3 una *aniera er a licare le *odi)iche al vostro a*biente ersonale e er i* ostare le variabili nella shell corrente. 9uesto ese* io di*ostra anche l:utilizzo di inviti di))erenti da arte di utenti di))erenti. In tal caso rosso signi)ica ericolo. 9uando avete un invito verde, non reoccu atevi eccessiva*ente. Notate che source resourcefile 3 lo stesso di . resourcefile. 2e doveste erdervi tra tutti questi )ile di con)igurazione e ritrovarvi a con)ronto con i* ostazioni la cui origine non 3 chiara, utilizzate le istruzioni echo ro rio co*e er gli scri t di ricerca degli errori Hv. 2ezione 2.3.2I. Potreste aggiungere delle linee co*e questa7
echo "Ora in esecuzione .bash_profile.."

o co*e queste7 Ca itolo 3. 8:a*biente di -ash #7

echo "Ora si impsta PS1 in .bashrc:" export PS1="[valore qualsiasi]" echo "PS1 adesso impostato a $PS1"

3.2. 1ariabili
3.2.1. 0ipi di variabili
Co*e visto negli ese* i recedenti, le variabili di shell sono in caratteri *aiuscoli convenzione. -ash tiene un elenco di due ti i di variabili7 er

3.2.1.1. 1ariabili globali


8e variabili globali Ho variabili a*bientali O environment variable I sono dis onibili in tutte le shell. I co*andi en o printen ossono essere utilizzati er *ostrare le variabili a*bientali. 9uesti rogra**i sono co* resi nel acchetto h#util . 2otto c:3 un risultato ti o7
franky ~> printenv CC=gcc CDPATH=.:~:/usr/local:/usr:/ CFLAGS=-O2 -fomit-frame-pointer COLORTERM=gnome-terminal CXXFLAGS=-O2 -fomit-frame-pointer DISPLAY=:0 DOMAIN=hq.garrels.be e= TOR=vi FCEDIT=vi FIGNORE=.o:~ G_BROKEN_FILENAMES=1 GDK_USE_XFT=1 GDMSESSION=Default GNOME_DESKTOP_SESSION_ID=Default GTK_RC_FILES=/etc/gtk/gtkrc:/nethome/franky/.gtkrc-1.2-gnome2 GWMCOLOR=darkgreen GWMTERM=xterm HISTFILESIZE=5000 history_control=ignoredups HISTSIZE=2000 HOME=/nethome/franky HOSTNAME=octarine.hq.garrels.be INPUTRC=/etc/inputrc IRCNAME=franky JAVA_HOME=/usr/java/j2sdk1.4.0 LANG=en_US LDFLAGS=-s LD_LIBRARY_PATH=/usr/lib/mozilla:/usr/lib/mozilla/plugins LESSCHARSET=latin1 LESS=-edfMQ LESSOPEN=|/usr/bin/lesspipe.sh %s LEX=flex LOCAL_MACHINE=octarine

Ca itolo 3. 8:a*biente di -ash

#"

LOGNAME=franky LS_COLORS=no=00:fi=00:di=01;34:ln=01;36:pi=40;33:so=01;35:bd=40;33;01:cd=40;33;01 :or=01;05;37;41:MACHINES=octarine MAILCHECK=60 MAIL=/var/mail/franky MANPATH=/usr/man:/usr/share/man/:/usr/local/man:/usr/X11R6/man MEAN_MACHINES=octarine MOZ_DIST_BIN=/usr/lib/mozilla MOZILLA_FIVE_HOME=/usr/lib/mozilla MOZ_PROGRAM=/usr/lib/mozilla/mozilla-bin MTOOLS_FAT_COMPATIBILITY=1 MYMALLOC=0 NNTPPORT=119 NNTPSERVER=news NPX_PLUGIN_PATH=/plugin/ns4plugin/:/usr/lib/netscape/plugins OLDPWD=/nethome/franky OS=Linux PAGER=less PATH=/nethome/franky/bin.Linux:/nethome/franky/bin:/usr/local/bin:/usr/local/sbi n:/usr/X11R6/bin:/PS1=\[\033[1;44m\]franky is in \w\[\033[0m\] PS2=More input> PWD=/nethome/franky SESSION_MANAGER=local/octarine.hq.garrels.be:/tmp/.ICE-unix/22106 SHELL=/bin/bash SHELL_LOGIN=--login SHLVL=2 SSH_AGENT_PID=22161
SSH_ASKPASS=/usr/libexec/openssh/gnome-ssh-askpass SSH_AUTH_SOCK=/tmp/ssh-XXmhQ4fC/agent.22106 START_WM=twm TERM=xterm TYPE=type USERNAME=franky USER=franky _=/usr/bin/printenv VISUAL=vi WINDOWID=20971661 XAPPLRESDIR=/nethome/franky/app-defaults XAUTHORITY=/nethome/franky/.Xauthority XENVIRONMENT=/nethome/franky/.Xdefaults XFILESEARCHPATH=/usr/X11R6/lib/X11/%L/%T/%N%C%S:/usr/X11R6/lib/X11/%l/%T/%N%C %S:/usr/X11R6/lib/X11/%XKEYSYMDB=/usr/X11R6/lib/X11/XKeysymDB XMODIFIERS=@im=none XTERMID= XWINHOME=/usr/X11R6 X=X11R6 YACC=bison -y

3.2.1.2. Variabili locali


8e variabili locali sono dis onibili solo nella shell corrente. 5sando il co*ando integrato set senza alcuna o zione, a arir! un elenco di tutte le variabili Hco* rese quelle a*bientaliI e le )unzioni. Il risultato verr! ordinato secondo le correnti i* ostazioni locali e *ostrato in un )or*ato riutilizzabile. +i sotto c:3 un )ile di)) realizzato con)rontando i risultati di printen e set, do o aver eli*inato le )unzioni che vengono *ostrate dal co*ando set7
franky ~> diff set.sorted printenv.sorted | grep "<" | awk '{ print $2 }' BASE=/nethome/franky/.Shell/hq.garrels.be/octarine.aliases BASH=/bin/bash

Ca itolo 3. 8:a*biente di -ash

#%

BASH_VERSINFO=([0]="2" BASH_VERSION='2.05b.0(1)-release' COLUMNS=80 DIRSTACK=() DO_FORTUNE= EUID=504 GROUPS=() HERE=/home/franky HISTFILE=/nethome/franky/.bash_history HOSTTYPE=i686 IFS=$' LINES=24 MACHTYPE=i686-pc-linux-gnu OPTERR=1 OPTIND=1 OSTYPE=linux-gnu PIPESTATUS=([0]="0") PPID=10099 PS4='+ PWD_REAL='pwd SHELLOPTS=braceexpand:emacs:hashall:histexpand:history:interactive-comments:monitor THERE=/home/franky UID=504

7-! Il linguaggio di rogra**azione 4N5 1>? 3 s iegato nel Ca itolo &.

3.2.1.3. 1ariabili per contenuto


1 arte la distinzione delle variabili in locali e globali, ossia*o suddividerle anche in categorie in base al ti o dei loro contenuti. In base a ciE, le variabili sono di # ti i7 0ariabili stringa H tring variable I 0ariabili intere Hinteger variable I 0ariabili costanti Hcon tant variable I 0ariabili *atriciali Harra! variable I /rattere*o questi ti i nel Ca itolo 1(. Per ora lavorere*o con valori interi e stringa nelle nostre variabili.

3.2.2. Creazione delle variabili


+i base le variabili sono in lettere *aiuscole e sono sensibili a ciE. 1ttribuire alle variabili locali un no*e in *inuscolo 3 una convenzione che qualche volta viene a licata. /uttavia, siete liberi di usare i no*i che re)erite o di *ischiare *inuscole con *aiuscole. 8e variabili ossono contenere anche delle ci)re, *a non 3 er*esso un no*e che inizi con nu*eri7
prompt> export 1number=1 bash: export: `1number=1': not a valid identifier

Per i* ostare una variabile nella shell usate7 Ca itolo 3. 8:a*biente di -ash $(

VARNAME=" alore" 8:inseri*ento di s azi attorno al segno uguale causer! degli errori. 6: una buona usanza virgolettare le stringhe quando si assegnano dei valori alle variabili7 ciE ridurr! le ossibilit! di sbagliare. 1lcuni ese* i utilizzando *aiuscole e *inuscole, nu*eri e s azi7
franky ~> MYVAR1="2" franky ~> echo $MYVAR1 2 franky ~> first_name="Franky" franky ~> echo $first_name Franky franky ~> full_name="Franky M. Singh" franky ~> echo $full_name Franky M. Singh franky ~> MYVAR-2="2" bash: MYVAR-2=2: command not found franky ~> MYVAR1 ="2" bash: MYVAR1: command not found franky ~> MYVAR1= "2" bash: 2: command not found franky ~> unset MYVAR1 first_name full_name franky ~> echo $MYVAR1 $first_name $full_name <--no output--> franky ~>

3.2.3. ;sportare variabili


5na variabile creata co*e quelle dell:ese* io recedente 3 dis onibile soltanto nella shell corrente. 6: una variabile locale7 i rocessi )igli della shell corrente non si cureranno di questa variabile. Per assare variabili ad una sottoshell, abbia*o bisogno di e portarle utilizzando il co*ando integrato e+port. 8e variabili che vengono es ortate sono de)inite co*e variabili a*bientali. 8:i* ostazione e l:es ortazione nor*al*ente vengono realizzate in una sola *ossa7 e+port VARNAME=valore 5na sottoshell uE *odi)icare le variabili se ereditate dalla genitrice, *a i ca*bia*enti )atti dalla )iglia non in)luiscono sulla genitrice. CiE 3 di*ostrato nell:ese* io7
franky ~> full_name="Franky M. Singh" franky ~> bash franky ~> echo $full_name franky ~> exit

Ca itolo 3. 8:a*biente di -ash

$1

franky ~> export full_name franky ~> bash franky ~> echo $full_name Franky M. Singh franky ~> export full_name="Charles the Great" franky ~> echo $full_name Charles the Great franky ~> exit franky ~> echo $full_name Franky M. Singh franky ~>

9uando all:inizio si rova a leggere il valore di full_name in una sottoshell, esso non 3 l! H echo *ostra una stringa vuotaI. 8a sottoshell si chiude e full_name viene es ortato in quella genitrice O una variabile uE essere es ortata do o che le 3 stato assegnato un valore. Poi viene avviata una nuova sottoshell in cui 3 visibile la variabile es ortata dalla genitrice. 8a variabile viene *odi)icata er contenere un altro no*e, *a nella genitrice il valore di questa variabile resta lo stesso.

3.2.#. 1ariabili riservate


3.2.#.1. 1ariabili riservate della shell Bourne
-ash utilizza certe variabili di shell nello stesso *odo della shell -ourne. In alcuni casi -ash assegna un valore rede)inito alla variabile. 8a tabella qui sotto o))re una anora*ica di queste se* lici variabili di shell7 Tabella 1#1: 2ariabili ri ervate della hell 3ourne No*e della variabile CDPATH +e)inizione 5n elenco di directorG se arato dai due unti J7K e utilizzato quale ercorso di ricerca er il co*ando integrato cd. 8a directorG ersonale HhomeI dell:utente corrente7 quella rede)inita er l:integrato cd. Il valore di questa variabile 3 usato anche er l:es ansione della tilde JZK. 5n elenco di caratteri che se arano dei ca* i7 utilizzato quando la shell suddivide le arole co*e arte di un:es ansione. 2e questo ara*etro 3 de)inito con un no*e di )ile e la variabile MAILPATH non 3 i* ostata, -ash in)or*a l:utente dell:arrivo di osta nel )ile s eci)icato. 5n elenco di no*i di )ile se arato dai due unti J7K che la shell controlla eriodica*ente er nuova osta.

HOME

IFS

MAIL

MAILPATH

Ca itolo 3. 8:a*biente di -ash

$2

OPTARG OPTIND PATH PS1 PS2

Il valore dell:ulti*o argo*ento di o zioni elaborato dall:integrato getopts. 8:indice dell:ulti*o argo*ento di o zioni elaborato dall:integrato getopts. 5n elenco di directorG se arato dai due unti J7K in cui la shell cerca dei co*andi. 8a stringa ri*aria dell:invito HpromptI. Il valore rede)inito 3 [:Us<UvU\ :[. 8a stringa secondaria dell:invito HpromptI. Il valore rede)inito 3 [:T :[.

3.2.#.2. 1ariabili riservate di Bash


9ueste variabili sono de)inite od utilizzate da -ash, *a altre shell nor*al*ente non le trattano in *odo s eciale. Tabella 1#.: 2ariabili ri ervate di 3a h ?ome della ariabile auto_resume BASH @efini1ione 9uesta variabile controlla co*e la shell interagisce con l:utente ed il controllo dei job. 8:intero no*e del ercorso utilizzato er eseguire la corrente richiesta di -ash. 2e questa variabile 3 de)inita quando -ash viene invocato er eseguire uno scri t di shell, il suo valore viene es anso ed i* iegato quale no*e di un )ile di avvio da leggere ri*a dell:esecuzione dello scri t. Il nu*ero di versione della istanza corrente di -ash. 5na variabile *atriciale a sola lettura i cui ele*enti contengono le in)or*azioni di versione er questa istanza di -ash. 5tilizzata dall:integrato select er deter*inare la larghezza del ter*inale quando si sta* ano elenchi di selezione. I* ostata auto*atica*ente in base alla ricezione di un segnale 4)'5)6C7. 5n indice all:interno di ${COMP_WORDS} della l:attuale osizione del cursore. 8a corrente linea di co*ando. 8:indice dell:attuale osizione del cursore relativa all:inizio della corrente linea di co*ando. 5na variabile *atriciale che consiste nelle singole arole nella corrente linea di co*ando 5na variabile *atriciale da cui -ash legge i co* leta*enti ossibili generati da una )unzione di shell invocata dall:utilit! er il co* leta*ento rogra**abile. arola contenente

BASH_ENV BASH_VERSION BASH_VERSINFO

COLUMS

COMP_CWORD COMP_LINE COMP_POINT COMP_WORDS

COMPREPLY

Ca itolo 3. 8:a*biente di -ash

$3

DIRSTACK EUID FCEDIT FIGNORE FUNCNAME GLOBIGNORE GROUPS histchars HISTCMD HISTCONTROL HISTFILE HISTFILESIZE

5na variabile *atriciale con gli attuali contenuti della catasta H tackI delle directorG. Il reale I+ nu*erico dell:utente corrente. 8:editor utilizzato co*e integrato fc. rede)inito dall:o zione -e nel co*ando

5n elenco dei su))issi da ignorare se arato dai due unti J7K quando si esegue il co* leta*ento dei )ile. Il no*e di qualsiasi )unzione di shell attual*ente in esecuzione. 5n elenco, se arato dai due unti J7K, degli sche*i che de)iniscono l:insie*e dei no*i dei )ile da ignorare durante l:es ansione dei no*i. 5na variabile *atriciale che contiene l:elenco dei gru a artiene l:attuale utente. i a cui

.ino a tre carattere che controllano l:es ansione della cronologia, la sostituzione ra ida e la tokenizzazione. Il nu*ero cronologico, o l:indice nell:elenco della cronologia, del co*ando corrente. +eter*ina se un co*ando viene aggiunto al )ile della cronologia. Il no*e del )ile in cui viene salvata la cronologia dei co*andi. Il valore rede)inito 3 ~/.bash_history. Il nu*ero *assi*o di linee contenute nel )ile di cronologia, di solito $((. 5n elenco, suddiviso dai due unti J7K, degli sche*i utilizzati er decidere quali linee di co*ando debbano essere salvate nella lista della cronologia. Il nu*ero *assi*o di co*andi da ricordare nella lista della cronologia Hil valore rede)inito 3 $((I. Contiene il no*e di un )ile nello stesso )or*ato di /etc/hosts che dovrebbe essere letto quando la shell ha bisogno di co* letare un no*e di host. Il no*e del corrente host. 5na stringa che descrive la *acchina in cui sta girando -ash. Controlla il co* orta*ento della shell quando riceve un carattere %&co*e unico ingresso. Il no*e del )ile di inizializzazione 'eadline, che revale sul rede)inito /etc/inputrc. 5tilizzato er stabilire la categoria delle localizzazioni er tutte quelle categorie non selezionate s eci)icata*ente con una variabile che inizia con LC_. 9uesta variabile scavalca il valore di LANG e di ogni altra variabile LC_ che s eci)ica una categoria di localizzazione. 9uesta variabile deter*ina l:ordine di collazione utilizzato quando si $#

HISTIGNORE

HISTSIZE

HOSTFILE HOSTNAME HOSTTYPE IGNOREEOF INPUTRC

LANG

LC_ALL LC_COLLATE

Ca itolo 3. 8:a*biente di -ash

riordinano i risultati delle es ansioni dei no*i dei )ile, stabilisce il co* orta*ento di es ressioni di intervalli Hrange expre ion I, classi di equivalenze, e sequenze di racccolta Hcollating e8uence I con es ansione dei no*i di )ile e corris ondenza di sche*i Hpattern matchingI. LC_CTYPE 9uesta variabile deter*ina l:inter retazione dei caratteri e il co* orta*ento delle classi di caratteri con l:es ansione dei no*i dei )ile e la corris ondenza di sche*i Hpattern matchingI. 9uesta variabile deter*ina la localizzazione utilizzata stringhe tra do ie virgolette recedute da un segno Q\R. er tradurre

LC_MESSAGES LC_NUMERIC LINENO LINES

9uesta variabile deter*ina la categoria della localizzazione utilizzata er il )or*ato dei nu*eri. Il nu*ero di linea nello scri t o nella )unzione di shell attual*ente in esecuzione. 5tilizzato dall:integrato select er stabilire la lunghezza della colonna er gli elenchi di selezione di sta* a. 5na stringa che descrive nella sua interezza il ti o di siste*a in cui viene eseguito -ash, nel )or*ato standard 4N5 CP5<C,=P1NL< 2L2/6=. 9uanto s esso Hin secondiI la shell dovrebbe controllare la osta nei )ile s eci)icati nelle variabili MAILPATH o MAIL. 8a recedente directorG di lavoro i* ostata dall:integrato cd. 2e i* ostata con il valore 1, -ash *ostra i *essaggi di errore generati dall:integrato getopts. 5na stringa che descrive il siste*a o erativo in cui sta girando -ash. 5na variabile *atriciale contenente un elenco dei valori degli stati di uscita dai rocessi negli accoda*enti Hpipeline I in ri*o iano eseguiti i@ recente*ente Hche otrebbero contenere solo un singolo co*andoI. 2e questa variabile si trova nell:a*biente quando si avvia bash, la shell entra in *odalit! P,2IF. 8:I+ di rocesso del rocesso genitore della shell. 2e i* ostata, il valore viene inter retato co*e un co*ando da eseguire ri*a della sta* a di qualsiasi invito ri*ario Hprimar! prompt o PS1I. Il valore di questa variabile 3 utilizzato co*e invito del co*ando select. Il rede)inito 3 QP?R Il valore 3 l:invito sta* ato ri*a che la linea di co*ando venga resentata con echo quando 3 i* ostata l:o zione -x. Prei* ostato a Q]R. 8a directorG corrente di lavoro co*e de)inita dal co*ando integrato cd. ,gni volta che si )a ri)eri*ento a questo ara*etro, viene generato un nu*ero casuale co* reso tra ( e 327&7. 1ssegnare un valore a questa variabile seleziona il generatore di nu*eri casuali.

MACHTYPE

MAILCHECK OLDPWD OPTERR OSTYPE PIPESTATUS

POSIXLY_CORRECT PPID PROMPT_COMMAND PS3

PS4 PWD RANDOM

Ca itolo 3. 8:a*biente di -ash

$$

REPLY SECONDS SHELLOPTS SHLVL

8a variabile rede)inita er l:integrato read. 9uesta variabile au*enta con il nu*ero dei secondi da quando 3 stata avviata la shell. 5n elenco, se arato dai due unti J7K, delle o zioni di shell abilitate. Incre*entata di uno ogni volta che viene avviata una nuova istanza di -ash. Il valore di questo ara*etro viene i* iegato co*e stringa di )or*ato s eci)icante co*e le in)or*azioni di te* orizzazione degli accoda*enti H re)issate con la arola riservata timeI dovrebbero essere *ostrate. 2e in ostata con un valore *aggiore di zero, TMOUT viene trattata co*e il timeout rede)inito er la )unzione read. 8:attuale I+ utente nu*erico dell:utente corrente.

TIMEFORMAT

TMOUT UID

Controllate le agine *an, in)o o doc di -ash er in)or*azioni estese. 1lcune variabili sono di sola lettura, altre vengono i* ostate auto*atica*ente ed alcune erdono il loro signi)icato quando i* ostate con un valore diverso da quello rede)inito.

3.2.$.

Para)etri speciali

8a shell tratta in *odo s eciale diversi ara*etri. 9uesti ara*etri ossono essere solo re)erenziati7 un assegna*ento a loro non 3 consentito. Tabella 1#1: 2ariabili peciali di ba h )arattere $* @efini1ione 6s ansione ai ara*etri osizionali, iniziando da uno. 9uando avviene l:es ansione con gli a ici do i, essa si es ande ad una singola arola con il valore di ciascun ara*etro se arato dal ri*o carattere della variabile s eciale IFS. 6s ansione ai ara*etri osizionali, iniziando da uno. 9uando avviene l:es ansione con gli a ici do i, ciascun ara*etro si es ande in una arola se arata. 6s ansione al nu*ero di ara*etri osizionali in deci*ale. 6s ansione allo stato di uscita dell:accoda*ento in recente*ente ri*o iano eseguito i@

$@ $# $?

$$$ $!

5n trattino Hh!phenI si es ande alle correnti )lag delle o zioni co*e s eci)icato dall:invocazione, attraverso il co*ando integrato set, o quelle i* ostate dalla shell stessa Hco*e ad ese* io -iI. 2i es ande all:I+ di rocesso della shell. 2i es ande all:I+ di rocesso del co*ando in sotto)ondo HasincronoI eseguito i@

Ca itolo 3. 8:a*biente di -ash

$&

di recente. $0 2i es ande al no*e della shell o dello scri t di shell. 8a variabile con la sottolinea Hunder coreI viene i* ostata all:avvio della shell e contiene il no*e di )ile assoluto della shell o dello scri t che viene eseguito cosD co*e assato nella lista degli argo*enti. 0iene anche i* ostata con l:intero ercorso dei no*i di ciascun co*ando eseguito e iazzato nell:a*biente es ortato con quel co*ando. 9uando si controlla la osta, questo ara*etro contiene il no*e del )ile di osta. AB s. AC 8:i* le*entazione di Q\^R 3 stata se* re un roble*a e realistica*ente dovrebbe essere ri* iazzata con il co* orta*ento di Q\_R. In quasi tutti i casi in cui i rogra**atori usano Q\^R, quest:ulti*i intendono Q\_R. Q\^R uE causare errori ed anche )alle nella sicurezza del vostro so)t>are. I ara*etri osizionali sono le arole che seguono il no*e di uno scri t di shell. 6ssi sono collocati nelle variabili $1, $2, $3 e cosD via. 8unghe secondo necessit!, le variabili vengono aggiunte ad una *atrice interna. $# contiene il nu*ero totale dei ara*etri, co*e viene di*ostrato con questo se* lice scri t7
#!/bin/bash # positional.sh # Questo script legge 3 parametri posizionali e li stampa. POSPAR1="$1" POSPAR2="$2" POSPAR3="$3" echo echo echo echo echo "$1 il primo parametro posizionale, \$1." "$2 il secondo parametro posizionale, \$2." "$3 il terzo parametro posizionale, \$3." "Il numero totale di parametri posizionali $#."

$_

Con l:esecuzione uno otrebbe dare un qualsiasi nu*ero di argo*enti7


franky ~> positional.sh uno due tre quattro cinque uno il primo parametro posizionale, 1$. due il secondo parametro posizionale, $2. tre il terzo parametro posizionale, $3. Il numero totale di parametri posizionali 5. franky ~> positional.sh uno due uno il primo parametro posizionale, 1$. due il secondo parametro posizionale, $2. il terzo parametro posizionale, $3. Il numero totale di parametri posizionali 2.

+i i@ sulla valutazione di questi ara*etri nel Ca itolo 7 e nella 2ezione %.7. 1lcuni ese* i sugli altri ara*etri s eciali7
franky ~> grep dictionary /usr/share/dict/words dictionary

Ca itolo 3. 8:a*biente di -ash

$7

franky ~> echo $_ /usr/share/dict/words franky ~> echo $$ 10662 franky ~> mozilla & [1] 11064 franky ~> echo $! 11064 franky ~> echo $0 bash franky ~> echo $? 0 franky ~> ls nonesiste ls: nonesiste: No such file or directory franky ~> echo $? 1 franky ~>

8:utente frank! co*incia con l:inseri*ento del co*ando grep, che deter*ina l:assegna*ento della variabile _. 8:I+ del rocesso della sua shell 3 1(&&2. +o o aver *esso un lavoro H jobI in sotto)ondo, ! contiene l:I+ del rocesso del lavoro in sotto)ondo. 8a shell in )unzione 3 bash. 9uando si co**ette un errore, ? contiene un codice d:uscita diverso da ( HzeroI.

3.2.%. &iciclo degli script con le variabili


1 arte il rendere i@ leggibile lo scri t, le variabili vi consentiranno anche di a licare un scri t in un altro a*biente o er un altro uso. Considerate l:ese* io seguente, uno scri t *olto se* lice che esegue una co ia di salvataggio HbackupI della directorG ersonale di frank! su un server re*oto.
#!/bin/bash # Questo script esegue una copia di salvataggio della mia home directory. cd /home # Questo crea l'archivio tar cf /var/tmp/home_franky.tar franky > /dev/null 2>&1 # Per prima cosa rimuove il vecchio file bzip2. Redirige gli errori perch ne vengono # generati alcuni se l'archivio inesistente. Quindi crea un nuovo file compresso. rm /var/tmp/home_franky.tar.bz2 2> /dev/null bzip2 /var/tmp/home_franky.tar # Copia il file in un altro host abbiamo le chiavi ssh per fare questo lavoro senza # interventi. scp /var/tmp/home_franky.tar.bz2 bordeaux:/opt/backup/franky > /dev/null 2>&1 # Crea una marca temporale in un file di registrazione. date >> /home/franky/log/home_backup.log echo backup riuscito >> /home/franky/log/home_backup.log

Pri*a di tutto 3 i@ )acile che co**ettiate errori se indicate i no*i dei )ile e delle directorG *anual*ente ogni volta che vi servono. In secondo luogo su onete che frank! voglia dare il suo scri t a carol, oi carol dovr! e))ettuare abbastanza nu*erose *odi)iche ri*a di oter usare lo Ca itolo 3. 8:a*biente di -ash $"

scri t er salvare altre directorG. Per un )acile riciclaggio, rendete variabili tutti i )ile, directorG, no*i utente, no*i server, ecc. CosD, avrete bisogno di *odi)icare un valore er una volta, senza dover scorrere l:intero scri t er controllare dove 3 resente un ara*etro. 9uesto 3 un ese* io7
#!/bin/bash # Questo script fa una copia di salvataggio della mia directory personale. # Cambiate i valori delle variabili per far funzionare lo script per voi: BACKUPDIR=/home BACKUPFILES=franky TARFILE=/var/tmp/home_franky.tar BZIPFILE=/var/tmp/home_franky.tar.bz2 SERVER=bordeaux REMOTEDIR=/opt/backup/franky LOGFILE=/home/franky/log/home_backup.log cd $BACKUPDIR # Questo crea l'archivio tar cf $TARFILE $BACKUPFILES > /dev/null 2>&1 # Per prima cosa rimuove il vecchio file bzip2. Ridirige gli errori dal momento che # ne produce alcuni se l'archivio non esiste. Poi crea un nuovo file compresso. rm $BZIPFILE 2> /dev/null bzip2 $TARFILE # Copia il file in un altro host abbiamo le chiavi ssh per fare questo lavoro senza # bisogno di interventi. scp $BZIPFILE $SERVER:$REMOTEDIR > /dev/null 2>&1 # Crea una marca temporale in un file di registro. date >> $LOGFILE echo salvataggio riuscito >> $LOGFILE

@irector. oluminose e banda passante limitata 9uello so ra 3 solo un ese* io che ognuno uE co* rendere, usando una iccola directorG e un host sulla stessa sottorete. In base alla vostra larghezza di banda, la di*ensione della directorG e della osizione del server re*oto, esso uE richiedere una inso ortabile quantit! di te* o er eseguire le co ie di salvataggio con questo *eccanis*o. Per directorG i@ volu*inose e una larghezza di banda in)eriore, usate rs.nc er *antenere le directorG allineate ad entra*bi i ca i.

3.3. Caratteri tra gli apici


3.3.1. Perch?
=olti tasti hanno dei signi)icati s eciali in alcuni contesti. 8a virgolettatura Ho 8uotingI viene utilizzata er togliere il signi)icato s eciale dei caratteri e delle arole7 le virgolette Ho a iciI ossono disabilitare il tratta*ento dei caratteri s eciali, ossono revenire che arole riservate vengano riconosciute co*e tali e sono in grado di disabilitare l:es ansione dei ara*etri.

3.3.2. Caratteri di escape

Ca itolo 3. 8:a*biente di -ash

$%

I caratteri di esca e si usano er ri*uovere il signi)icato s eciale di un singolo carattere. 5na barra inversa Hback la hI senza a ici, U, viene i* iegata in -ash co*e carattere di esca e. 6ssa i* edisce il valore letterale del carattere i**ediata*ente successivo, ad eccezione della nuovalinea Hne$lineI. 2e un carattere di nuova linea a are subito do o la barra inversa, ciE segna la continuazione della linea quando 3 i@ lunga della larghezza del ter*inale7 la barra inversa viene ri*ossa dal )lusso in ingresso ed ignorata a tutti gli e))etti.
franky ~> data=20021226 franky ~> echo $data 20021226 franky ~> echo \$data $data

Nell:ese* io viene creata la variabile data ed i* ostata er contenere un valore. Il ri*o echo *ostra il valore della variabile, *a con il secondo il segno del dollaro viene reso con esca e.

3.3.3. 2pici singoli


4li a ici singoli H::I vengono utilizzati er conservare il valore letterale di ogni carattere racchiuso tra di loro. 5n a ice singolo non uE trovarsi tra a ici singoli, anche se receduto da una barra inversa. Continuia*o con l:ese* io recedente7
franky ~> echo '$data' $data

3.3.#. 2pici doppi


5sando gli a ici do i si conserva il valore letterale di tutti i caratteri, ad eccezione del segno del dollaro, gli a ici inversi Hvirgolette inverse o backtick O a ici singoli inversi, ``I e la barra inversa. Il segno del dollaro e gli a ici inversi *antengono il loro s eciale signi)icato con gli a ici HvirgoletteI do i. 8a barra inversa conserva il suo signi)icato solo quando 3 seguita dal dollaro, dagli a ici inversi, dagli a ici do i, da barra inversa o da nuovalinea. Con le virgolette do ie, le barre inverse vengono tolte dal )lusso in ingresso quando sono seguite da uno di questi caratteri. 8e barre inverse che recedono caratteri che non hanno signi)icati s eciali vengono lasciate senza *odi)iche er l:elaborazione dell:inter rete della shell. 5na virgoletta do ia uE essere tra virgolette do ie )acendola recedere da una barra inversa.

franky ~> echo $data 2((2122& franky ~> echo "`data`" Sun Apr 20 11:22:06 CEST 2003

Ca itolo 3. 8:a*biente di -ash

&(

franky ~> echo "I'd say: \"Go for it!\"" I'd say: "Go for it!" franky ~> echo "\" More input>" franky ~> echo "\\" \

3.3.$. 1irgolettatura 2 3I8C


Parole nella )or*a [\:2/'IN4:[ vengono trattate in *odo s eciale. 8a arola si es ande in una stringa con i caratteri di esca e tra*ite barra inversa sostituiti co*e s eci)icato dallo standard 1N2I<C. 8e sequenze di esca e tra*ite barra inversa si ossono trovare nella docu*entazione di -ash.

3.3.%. Locali
5na stringa tra virgolette do ie receduta da un segno di dollaro )ar! si che la stringa venga tradotta secondo la localizzazione HlocaleI corrente. 2e la localizzazione corrente 3 QCR o QP,2IFR, il segno dollaro viene ignorato. 2e la stringa viene tradotta e ri* iazzata, la sostituzione 3 tra a ici do i.

D.2. %spansione della shell D.2.1. In generale +o o che il co*ando 3 stato suddiviso in )ra**enti H tokenI Hv. 2ezione 1.#.1.1I, tali )ra**enti o arole vengono es ansi o risolti. Ci sono otto ti i di es ansione eseguita, che trattere*o nelle rossi*e sezioni, nell:ordine in cui vengono es ansi. +o o tutte le es ansioni, viene eseguita la ri*ozione degli a ici.

3.#.2. ;spansione delle parentesi gra((e 8:es ansione delle gra))e Hbrace expan ionI 3 un *eccanis*o con cui ossono essere generate delle stringhe arbitrarie. 4li sche*i HpatternI da sotto orre all:es ansione delle gra))e rendono la )or*a di un P9%:;3&L& o zionale, seguito da una serie di stringhe se arate da virgole tra una co ia di gra))e, seguita da un P&4T4C9)PT o zionale. Il rea*bolo 3 re)issato in base a ciascuna stringa contenuta tra le gra))e e il ostscri t viene agganciato a d ogni stringa risultante, con es ansione da sinistra a destra.

Ca itolo 3. 8:a*biente di -ash

&1

8e es ansioni delle gra))e ossono essere annidate. I risultati di ogni stringa es ansa non vengono riordinati, conservando l:ordine da sinistra a destra7
franky ~> echo p{a,e,i,o,u}zza pazza pezza pizza pozza puzza

8:es ansione delle gra))e viene eseguita ri*a di ogni altra es ansione e viene *antenuto qualsiasi carattere s eciale er le ulteriori es ansioni. -ash non a lica alcuna inter retazione sintattica al contesto dell:es ansione o del testo tra gra))e. Per evitare con)litti con l:es ansione dei ara*etri, la stringa Q\aQ non viene considerata co*e soggetta ad es ansione delle gra))e. 5na es ansione delle gra))e i* ostata corretta*ente deve contenere delle gra))e a erte e chiuse senza virgolette ed al*eno una virgola senza a ici. 9ualsiasi es ansione delle gra))e )or*ata in *odo errato viene lasciata senza *odi)iche.

3.#.3.

;spansione della tilde

2e una arola inizia con un carattere tilde non virgolettato HQZRI, tutti i caratteri )ino alla ri*a barra senza a ici Ho tutti i caratteri, se non c:3 una barra senza a iciI vengono considerati un prefi o della tilde Htilde#prefixI. 2e nessuno dei caratteri nel re)isso della tilde sta tra degli a ici, i caratteri nel re)isso della tilde successivi alla tilde stessa vengono trattati co*e un ossibile no*e er l:autenticazione HloginI. 2e il no*e di autenticazione 3 una stringa vuota H null tringI, la tilde viene sostituita dal valore della variabile di shell HOME. 2e HOME non 3 i* ostata, essa 3 sostituita con la directorG ersonale dell:utente che sta utilizzando la shell. 1ltri*enti il re)isso tilde viene ri* iazzato dalla directorG ersonale associata al no*e di autenticazione s eci)icato. 2e il re)isso tilde 3 QZ]R, il valore della variabile di shell PWD sostituisce il re)isso tilde. 2e quest:ulti*o 3RZ<R, il valore della variabile di shell OLDPWD, se i* ostato, viene sostituito. 2e i caratteri che seguono la tilde nel re)isso tilde consistono in un nu*ero N, eventual*ente re)issato da un Q]R o un Q<R, il re)isso della tilde viene sostituito dall:ele*ento corris ondente reso dalla catasta H tackI delle directorG, co*e otrebbe essere *ostrato tra*ite l:invocazione dell:integrato dirs con i caratteri che seguono la tilde nel re)isso tilde co*e argo*ento. 2e il re)isso tilde, senza la tilde, consiste in un nu*ero non receduto da Q]R oR<R, si intende Q]R. 2e il no*e di autenticazione non 3 valido o l:es ansione della tilde )allisce, la arola viene lasciata i**utata. ,gni assegnazione di variabile 3 veri)icata er re)issi tilde senza a ici che seguono i**ediata*ente un [7[ o [b[. In questo caso viene eseguita anche l:es ansione della tilde. +i conseguenza, uno uE usare no*i di )ile con la tilde nelle assegnazioni a PATH, MAILPATH e CDPATH, e la shell attribuir! il valore es anso. 6se* io7
franky ~> export PATH="$PATH:~/testdir"

~/testdir sar! es ansa a $HOME/testdir, cosicch se $HOME 3 /var/home/franky, la Ca itolo 3. 8:a*biente di -ash &2

directorG /var/home/franky/testdir verr! aggiunta al contenuto della variabile PATH.

3.#.#. I para)etri della shell e l7espansione delle variabili


Il carattere [\[ introduce l:es ansione dei ara*etri, la sostituzione dei co*andi o l:es ansione arit*etica. Il no*e o il si*bolo dei ara*etri da es andere ossono essere racchiusi tra gra))e, che sono o zionali *a servono er roteggere la variabile dall:essere es ansa dai caratteri i**ediata*ente seguenti, che otrebbe essere inter retata co*e arte del no*e. 9uando vengono utilizzate le gra))e, la gra))a di chiusura corris ondente 3 la ri*a [c[non resa con esca e dalla barra inversa o all:interno di una stringa tra virgolette e non dentro una es ansione arit*etica integrata, una sostituzione di co*andi o un:es ansione di ara*etri. 8a )or*a base dell:es ansione dei co*andi 3 [\aP1'1=6/',c[. Il valore di [aP1'1=6/',c[ viene sostituito. 8e gra))e sono richieste quando[P1'1=6/',[ 3 un ara*etro osizionale con i@ di una ci)ra o ure quando [P1'1=6/',[ 3 seguito da un carattere che non deve essere inter retato co*e arte del suo no*e. 2e il ri*o carattere di [P1'1=6/',[ 3 un unto escla*ativo, -ash utilizza il valore della variabile )or*ato dal resto di [P1'1=6/',[ co*e no*e della variabile. /ale variabile viene oi es ansa e quel valore viene usato nella restante sostituzione, iuttosto che il valore del [P1'1=6/',[ stesso. CiE 3 noto co*e e pan ione indiretta Hindirect expan ionI. 0i sar! sicura*ente )a*iliare l:es ansione diretta dei ara*etri, dal *o*ento che ca ita tutte le volte, anche nel caso i@ se* lice, co*e in quello recedente o quello che segue7
franky ~> echo $SHELL /bin/bash

Il successivo 3 un ese* io di es ansione indiretta7


franky ~> echo ${!N*} NNTPPORT NNTPSERVER NPX_PLUGIN_PATH

Notate che questa non 3 la stessa cosa di echo $N*. Il costrutto che segue consente la creazione della no*inata variabile se essa non esiste ancora7 ${VAR:=valore} 6se* io7
franky ~> echo $FRANKY franky ~> echo ${FRANKY:=Franky} Franky

Co*unque, i ara*etri s eciali, tra gli altri i ara*etri osizionali, ossono non essere assegnati in questo *odo.

Ca itolo 3. 8:a*biente di -ash

&3

Pi@ avanti discutere*o dell:uso delle arentesi tonde Hcurl! brace I er il tratta*ento delle variabili nel Ca itolo 1(. =aggiori in)or*azioni si ossono trovare nelle agine in)o di -ash.

3.#.$. La sostituzione dei co)andi


8a sostituzione dei co*andi er*ette al risultato di un co*ando di sostituire il co*ando stesso. 8a sostituzione dei co*andi avviene quando un co*ando 3 cosD de)inito7 A9comando: o ure co*e questo ricorrendo agli a ici inversi Hbacktick I7

EcomandoE -ash e))ettua l:es ansione eseguendo C,=1N+, e ri* iazzando la sostituzione dei co*andi con lo standard out ut del co*ando, con cancellazione di qualsiasi nuovalinea H ne$lineI resente. 8e nuovalinea incor orate non vengono cancellate, *a otrebbero essere ri*osse durante la sco* osizione delle arole H$ord plittingI.
franky ~> echo `date` gio feb 6 10:06:20 CET 2003

9uando si utilizza la )or*a di sostituzione ad a ici inversi vecchio stile, la barra inversa *antiene il suo signi)icato letterale, eccetto quando 3 seguita da [\[, [`[ o [U[. I ri*i a ici inversi non receduti da una barra inversa ter*inano la sostituzione dei co*andi.. 9uando si usa la )or*a [\ HC,=1N+,I[, tutti i caratteri )ra arentesi )or*ano il co*ando7 nessuno 3 trattato in *odo s eciale. 8a sostituzione dei co*andi uE essere annidata. Per annidare quando si utilizza la )or*a ad a ici inversi, create un esca e degli a ici inversi con le barre inverse. 2e la sostituzione a are tra a ici do vengono attuate sui risultati. i, la sco* osizione delle arole e l:es ansione dei no*i non

3.#.%. ;spansione arit)etica


8:es ansione arit*etica consente la valutazione di un:es ressione arit*etica e la sostituzione del risultato. Il )or*ato dell:es ansione arit*etica 37 A99%S6F%SSIG?%:: 8:es ressione 3 trattata co*e se )osse tra a ici do i, *a virgoletta do ia all:interno delle arentesi non viene trattata in *odo s eciale. /utti i )ra**enti H token I nell:es ressione sono sotto osti a es ansione dei ara*etri, sostituzione dei co*andi e ri*ozione degli a ici. 8e sostituzioni Ca itolo 3. 8:a*biente di -ash &#

arit*etiche ossono essere annidate. 8a valutazione delle es ressioni arit*etiche 3 eseguita in interi di lunghezza )issa senza controllo di strari a*ento O sebbene la divisione er zero venga intercettata e riconosciuta co*e errore. 4li o eratori sono se* lice*ente gli stessi del linguaggio di rogra**azione C. In ordine decrescente di recedenza, la lista si resenta co*e questa7 Tabella 1#<: &peratori aritmetici Gperatore 01']] e 01'<< ]]01' e <<01' <e] VeZ ^^ ^,; e d ]e< ee e TT eb, Tb, e e T bb e Vb f g X ff XX eA r ? eA r 7 eA r , Significato Post<incre*ento e ost<decre*ento della variabile Pre<incre*ento e re<decre*ento della variabile *eno e i@ unario negazione logica e a livello bit Hbit>iseI es onenziazione *olti licazione, divisione, resto addizione e sottrazione s osta*ento a livello bit Hbit>iseI a sinistra e a destra o eratori di con)ronto uguaglianza e disuguaglianza 1N+ a livello bit Hbit>iseI ,' esclusivo a livello bit Hbit>iseI ,' a livello bit Hbit>iseI 1N+ logico ,' logico valutazione condizionale se aratore tra es ressioni

b, ^b, ;b, db, ]b, <b, eeb, TTb, fb, gb e Xb assegna*enti

8e variabili di shell sono er*esse co*e o erandi7 l:es ansione dei ara*etri viene eseguita ri*a che sia valutata l:es ressione. 1ll:interno di un:es ressione le variabili di shell ossono essere re)erenziate er no*e senza usare la sintassi dell:es ansione dei ara*etri. Il valore di una variabile 3 valutato co*e es ressione arit*etica quando 3 re)erenziato. 5na variabile di shell non deve avere attivato il suo attributo intero er essere utilizzata in un:es ressione. 8e costanti che iniziano er ( HzeroI vengono inter retate co*e nu*eri ottali. 5no [(A[ o [(F[ denota un esadeci*ale. 1ltri*enti, i nu*eri assu*ono la )or*a [J-126:P:KN[, dove [-126[ 3 un nu*ero deci*ale tra 2 e &#, che ra resenta la base arit*etica, e N 3 un nu*ero in quella base. 2e viene o*esso [-126P[, allora viene usata una base 1(. 8e ci)re *aggiori di % vengono ra resentate con lettere *inuscole, lettere *aiuscole, [_[ e [M[, in quest:ordine. se [-126[ 3 *inore o uguale a 3&, le lettere *inuscole e *aiuscole ossono essere utilizzate indi))erente*ente er ra resentare i nu*eri tra 1( e 3$.

Ca itolo 3. 8:a*biente di -ash

&$

4li o eratori vengono valutati er ordine di recedenza. 8e sottoes ressioni tra arentesi sono valutate er ri*e e ossono scavalcare le so rastanti regole di recedenza. +ove ossibile, gli utenti di -ash dovrebbero rovare ad usare la sintassi con le arentesi quadre7 A" %S6F%SSIG?% # /uttavia, ciE calcoler! solo il risultato di %4P9%44)&6%, e non eseguir! controlli7
franky ~> echo $[365*24] 8760

0. )ra le altre la 2ezione 7.1.2.2. er ese* i ratici di scri t.

3.#.'. 3ostituzione dei processi


8a sostituzione dei rocessi viene su ortata nei rocessi che hanno l:incanala*ento no*inato Hnamed pipeI H.I.,I o il *etodo /dev/fd di deno*inazione dei )ile a erti. CiE assu*e la )or*a H9%L%?)G: o I9%L%?)G: Il rocesso 686NC, viene avviato con i suoi dati in ingresso e uscita H input e outputI connessi ad un .I., o a un qualche )ile in /dev/fd. Il no*e di questo )ile viene assato co*e argo*ento all:attuale co*ando co*e risultato dell:es ansione. 2e si usa la )or*a [TH686NC,I[, la scrittura nel )ile )ornir! dati in ingresso er ELENCO. 2e si usa la )or*a [eH686NC,I[, il )ile assato co*e argo*ento dovrebbe essere letto er ottenere i dati in uscita di ELENCO. Notate che non dovrebbero esserci s azi tra i segni e e T e le arentesi a sinistra, altri*enti il costrutto sarebbe inter retato co*e una ridirezione. 9uando dis onibile, la sostituzione dei rocessi viene eseguita conte* oranea*ente all:es ansione dei ara*etri e delle variabili, alla sostituzione dei co*andi ed all:es ansione arit*etica. =aggiori in)or*azioni nella 2ezione ".2.3.

3.#.*. 3co)posizione delle parole


8a shell analizza nella sco* osizione delle arole i risultati dell:es ansione dei ara*etri, della sostituzione dei co*andi e dell:es ansione arit*etica che non si trovano all:interno di a ici do i. 8a shell tratta ciascun carattere di $IFS co*e un deli*itatore e sco* one i risultati delle altre Ca itolo 3. 8:a*biente di -ash &&

es ansioni in arole su questi caratteri. 2e I.2 non 3 de)inito o il suo valore 3 esatta*ente [es azioTetabTenuovalineaT[ Hquello rede)initoI, allora qualsiasi sequenza di caratteri IFS serve er deli*itare le arole. 2e IFS ha un valore diverso da quello base, allora le sequenze dei caratteri degli s azi bianchi [s azio[ e [/ab[ vengono ignorate all:inizio e alla )ine della arola er tutto il carattere di s azio bianco resente nel valore di IFS Hun carattere di s azio bianco IFSI. 9ualsiasi carattere nell:IFS che non sia uno s azio bianco di IFS, insie*e ad ogni adiacente carattere di s azio bianco di IFS, deli*ita un ca* o. 5na sequenza di caratteri di s azio bianco IFS viene considerata anche co*e un deli*itatore. 2e il valore di IFS 3 nullo, non avviene alcuna sco* osizione delle arole. 4li argo*enti nulli es liciti H[[[[ o [::[I vengono *antenuti. 4li argo*enti nulli i* liciti non tra a ici vengono ri*ossi oich rovengono dall:es ansione di ara*etri che non hanno valori. 2e un ara*etro senza valore viene es anso all:interno di a ici do i, ne deriva un argo*ento nullo e viene *antenuto. %spansione e scomposi1ione delle parole 2e l:es ansione non avviene, non si esegue la sco* osizione.

3.#.,. ;spansione del no)e dei (ile


+o o la sco* osizione delle arole, a *eno che non sia stata i* ostata l:o zione <) Hv. 2ezione 2.3.2I, -ash analizza ogni arola alla ricerca dei caratteri [^[, [?[ e [J[. 2e co* are uno di questi caratteri, allora la arola 3 considerata co*e uno 4C7%;: HP:TT%96I e ri* iazzata con un elenco ordinato al)abetica*ente dei no*i di )ile che co*baciano con lo sche*a. 2e non si trovano no*i di )ile co*bacianti, e l:o zione della shell nullglob 3 disabilitata, la arola viene lasciata senza *odi)iche. 2e l:o zione nullglob 3 de)inita e non esistono corris ondenze, la arola viene ri*ossa. 2e 3 i* ostata l:o zione di shell nocaseglob e non ci sono corris ondenze, la arola viene ri*ossa. 2e 3 i* ostata l:o zione di shell nocaseglob, la corris ondenza viene eseguita senza alcuna considerazione er le *aiuscole o *inuscole dei caratteri al)abetici. 9uando uno sche*a viene utilizzato er la generazione di un no*e di )ile, il carattere [.[ all:inizio del no*e del )ile o che segue i**ediata*ente una barra inversa deve essere )atto coincidere es licita*ente, a *eno che non sia i* ostata l:o zione di shell dotglob. 9uando un no*e di )ile coincide, il carattere della barra deve essere se* re )atto corris ondere es licita*ente. In altri casi, il carattere [.[ non 3 trattato in *odo s eciale. 8a variabile di shell GLOBIGNORE uE essere utilizzata er restringere l:insie*e dei no*i di )ile che corris ondono allo sche*a. 2e GLOBIGNORE 3 de)inito, ciascun no*e di )ile coincidente che corris onde anche ad uno degli sche*i in GLOBIGNORE 3 ri*osso dalla lista delle coincidenze. I )ile dei no*i . e .. vengono ignorati se* re, anche quando GLOBIGNORE 3 de)inito. /uttavia, l:i* ostazione di GLOBIGNORE ha l:e))etto di abilitare l:o zione di shell dotglob, cosicch tutti gli altri no*i di )ile inizianti er [.[ coincideranno. Per ottenere il vecchio co* orta*ento di ignorare i no*i di )ile inizianti con [.[, create uno degli sche*i in GLOBIGNORE con [.^[. 8:o zione dotglob 3 disabilitata quando GLOBIGNORE non 3 de)inita.

Ca itolo 3. 8:a*biente di -ash

&7

3.$. 2lias
3.$.1. Cosa sono gli alias?
5n alias consente ad una stringa di essere la sostituta di una arola quando essa 3 utilizzata co*e la ri*a arola di un se* lice co*ando. 8a shell conserva un elenco degli alias che ossono essere de)initi ed eli*inati con i co*andi integrati alias e unalias. .ornite alias senza o zioni er *ostrare un elenco di alias noto alla shell corrente.
franky: ~> alias alias ..='cd ..' alias ...='cd ../..' alias ....='cd ../../..' alias PAGER='less -r' alias Txterm='export TERM=xterm' alias XARGS='xargs -r' alias cdrecord='cdrecord -dev 0,0,0 -speed=8' alias e='vi' alias egrep='grep -E' alias ewformat='fdformat -n /dev/fd0u1743; ewfsck' alias fgrep='grep -F' alias ftp='ncftp -d15' alias h='history 10' alias fformat='fdformat /dev/fd0H1440' alias j='jobs -l' alias ksane='setterm -reset' alias ls='ls -F --color=auto' alias m='less' alias md='mkdir' alias od='od -Ax -ta -txC' alias p='pstree -p' alias ping='ping -vc1' alias sb='ssh blubber' alias sl='ls' alias ss='ssh octarine' alias tar='gtar' alias tmp='cd /tmp' alias unaliasall='unalias -a' alias vi='eval `resize`;vi' alias vt100='export TERM=vt100' alias which='type' alias xt='xterm -bg black -fg white &' franky ~>

4li alias sono utili er s eci)icare la versione rede)inita di un co*ando che esiste in diverse versioni nel vostro siste*a o ure er indicare le o zioni rede)inite di un co*ando. 5n altro uso degli alias 3 er correggere degli errori di scrittura. 8a ri*a arola di ogni se* lice co*ando, se riva di a ici, viene controllata er vedere se ha un alias. 2e cosD 3, quella arola viene sostituita dal testo dell:alias. Il no*e degli alias e il testo di ri* iazzo uE contenere qualsiasi valido dato in ingresso di shell, co* resi i *etacaratteri della shell, eccetto che il no*e dell:alias non uE contenere [b[. 8a ri*a arola di un testo di ri* iazzo viene controllata er la resenza di alias, *a una arola che 3 identica ad un alias da es andere non viene es ansa una seconda volta. CiE signi)ica che uno uE creare un alias ls di ls -F, er ese* io, e -ash non cercher! di es andere ricorsiva*ente il testo di ri* iazzo. 2e l:ulti*o carattere di un valore di alias 3 uno s azio o un carattere tab, allora la successiva arola del co*ando che segue l:alias verr! anche controllata er l:es ansione degli alias.

Ca itolo 3. 8:a*biente di -ash

&"

4li alias non vengono es ansi quando la shell non 3 interattiva, a *eno che non venga i* ostata l:o zione expand_aliases *ediante l:integrato di shell shopt.

3.$.2. Creazione e ri)ozione degli alias


4li alias si creano usando l:integrato di shell alias. Per un uso er*anente, inserite l: alias in uno dei vostri )ile di inizializzazione della shell7 se inserite l:alias unica*ente nella riga di co*ando, esso viene riconosciuto solo all:interno della shell corrente.
franky ~> alias dh='df -h' franky ~> dh Filesystem /dev/hda7 /dev/hda1 /dev/hda2 /dev/hda3 none /dev/hda6 /dev/hda5

Size 1.3G 121M 13G 13G 243M 3.9G 5.2G

Used 272M 9.4M 8.7G 5.3G 0 3.2G 4.3G

Avail 1018M 105M 3.7G 7.1G 243M 572M 725M

Use% 22% 9% 70% 43% 0% 85% 86%

Mounted on / /boot /home /opt /dev/shm /usr /var

franky ~> unalias dh franky ~> dh bash: dh: command not found franky ~>

-ash legge se* re al*eno una linea co* leta di dati in ingresso ri*a di eseguire uno qualsiasi dei co*andi di quella linea. 4li alias vengono es ansi quando viene letto un co*ando, non quando esso viene eseguito. +unque, una de)inizione di alias che co* are nella stessa linea co*e altro co*ando non ha e))etto )ino a che non viene letta la successiva linea in ingresso. I co*andi che seguono la de)inizione di alias in quella linea non sono in)luenzati dal nuovo alias. /ale co* orta*ento 3 anche un roble*a quando vengono eseguite delle )unzioni. 4li alias vengono es ansi quando viene letta la de)inizione di una )unzione, non quando la )unzione viene eseguita, erch la de)inizione di una )unzione 3 essa stessa un co*ando co* osto. +i conseguenza, gli alias de)initi in una )unzione non sono dis onibili se non do o l:esecuzione di quella )unzione. Per essere sicuri, *ettete se* re le de)inizioni degli alias in una riga se arata, e non utilizzate alias in co*andi co* osti. I rocessi )igli non ereditano gli alias. 8a shell -ourne HshI non riconosce gli alias. +i i@ sulle )unzioni nel Ca itolo 11.

Le fun1ioni sono piJ eloci 4li alias vengono resi in considerazione do o le )unzioni e cosD la risoluzione 3 i@ lenta. =entre gli alias sono i@ se* lici da co* rendere, le )unzioni di shell sono re)erite in luogo degli alias er quasi ogni sco o.

Ca itolo 3. 8:a*biente di -ash

&%

3.%. 6lteriori opzioni di Bash


3.%.1. .pzioni di visualizzazione
1bbia*o gi! trattato di una co ia di o zioni che sono utili er correggere i vostri scri t. In questa sezione dare*o uno sguardo i@ a ro)ondito alle o zioni di -ash. 5sate l:o zione -o er dire a set di*ostrare tutte le o zioni di shell7
willy:~> set -o allexport braceexpand emacs errexit hashall histexpand history ignoreeof interactive-comments keyword monitor noclobber noexec noglob nolog notify nounset onecmd physical posix privileged verbose vi xtrace off on on off on on on off on off on off off off off off off off off off off off off off

+ate un:occhiata alle agine In)o di -ash, sezione 2hell -uilt<in Co**ands<T/he 2et -uilt<in er una descrizione di ogni o zione. 5na quantit! di o zioni ha una scorciatoia da un carattere7 er ese* io, l:o zione xtrace corris onde a set -x.

3.%.2. .pzioni di )odi(ica


8e o zioni di shell ossono essere i* ostate in *odo diverso dai valori rede)initi sia al *o*ento della chia*ata della shell, sia durante l:o erativit! della shell stessa. Possono essere anche incluse nei )ile di con)igurazione delle risorse di shell. Il seguente co*ando esegue uno scri t in *odalit! co* atibile P,2IF7
willy:~/scripts> bash --posix script.sh

Per *odi)icare te* oranea*ente il corrente a*biente, o er l:utilizzo in uno scri t, otre**o usare set. 5sate il trattino O Hda hI. er abilitare un:o zione, ] er disabilitarla7
willy:~/test> set -o noclobber willy:~/test> touch test willy:~/test> date > test

iuttosto

Ca itolo 3. 8:a*biente di -ash

7(

bash: test: cannot overwrite existing file willy:~/test> set +o noclobber willy:~/test> date > test

8:ese* io so rastante *ostra l:o zione noclobber, che reviene la sovrascrittura dei )ile esistenti da arte di o erazioni di ridirezione. 8o stesso vale er le o zioni a singolo carattere, er ese* io -u, che tratteranno le variabili non de)inite co*e errore quando de)inite, con uscita di una shell non interattiva quando si incontrano tali errori.
willy:~> echo $VAR

willy:~> set -u willy:~> echo $VAR bash: VAR: unbound variable

9uesta o zione 3 utile anche er sco rire assegna*enti scorretti alle variabili7 lo stesso errore, er ese* io, ca iter! ure quando si assegna una stringa di caratteri ad una variabile che era stata dichiarata es licita*ente co*e una contenente solo valori nu*erici interi. +i seguito un ulti*o ese* io che *ostra l:o zione noglob, che reviene l:es ansione di caratteri s eciali7
willy:~/testdir> set -o noglob willy:~/testdir> touch * willy:~/testdir> ls -l * -rw-rw-r-- 1 willy willy 0 Feb 27 13:37 *

3.'. 3o))ario
8:a*biente -ash uE essere con)igurato global*ente ed in base al singolo utente. 2i usano vari )ile di con)igurazione er de)inire in *odo articolareggiato il co* orta*ento della shell. 9uesti )ile contengono o zioni di shell, i* ostazioni er variabili, de)inizioni di )unzioni e diversi altri blocchi di costruzione er crearci un a*biente con)ortevole. 1d eccezione dei ara*etri riservati della shell -ourne, di -ash e quelli s eciali, i no*i delle variabili ossono essere scelti i@ o *eno libera*ente. 2icco*e arecchi caratteri hanno do i o tri li signi)icati in base all:a*biente, -ash utilizza un siste*a di virgolettature er eli*inare i signi)icati s eciali da uno o i@ caratteri quando non si desidera un tratta*ento s eciale. -ash i* iega vari *etodi di es ansione dei dati inseriti nella riga di co*ando er decidere quali co*andi eseguire.

Ca itolo 3. 8:a*biente di -ash

71

3.*. ;sercizi
Per questo esercizio dovrete leggere le agine *an di useradd, erch stia*o er usare la directorG /etc/skel er conservare i )ile rede)initi della con)igurazione della shell, che vengono co iati nella directorG ersonale di ogni utente a ena aggiunto. Per ri*a cosa eseguire*o alcuni esercizi generali sulla de)inizione e la variabili. resentazione delle

1. Create 3 variabili, VAR1, VAR2 e VAR3N inizializzatele er tenere ris ettiva*ente i valori [tredici[, [13[ e [-uon co* leanno[. 2. =ostrate i valori di tutte tre le variabili. 3. 9ueste sono variabili locali o globali? #. 'i*uovete VAR3. $. Potete vedere le restanti due variabili in una nuova )inestra di ter*inale? &. =odi)icate /etc/profile in *odo che tutti gli utenti vengano salutati al *o*ento della autenticazione H rovate questoI. 7. Per l:account root, i* ostate l:invito con qualcosa co*e [PericoloVV root sta )acendo cose in U>[, re)eribil*ente in un colore vivace co*e il rosso o rosa, o ure in *odalit! video invertito. ". 1ccertatevi che anche gli utenti a ena creati abbiano un invito ersonalizzato carino che li in)or*i su quale directorG di quale siste*a stiano lavorando. 2 eri*entate le vostre *odi)iche aggiungendo un nuovo utente ed autenticandovi co*e quello. %. 2crivete uno scri t in cui assegnate due valori interi a due variabili. 8o scri t dovrebbe calcolare la su er)icie di un rettangolo che ha queste *isure. +ovrebbe essere corredato di co**enti e generare dei risultati eleganti. Non scordatevi di a licare chmod ai vostri scri tV

Ca itolo 3. 8:a*biente di -ash

72

Capitolo #. Le espressioni regolari


In questo ca itolo discutia*o di7 uso delle es ressioni regolari *etacaratteri delle es ressioni regolari ricerca di sche*i in )ile o dati in uscita intervalli e classi di caratteri in -ash

#.1. ;spressioni regolari


#.1.1. Cosa sono le espressioni regolari?
5na e pre ione regolare 3 uno sche*a che descrive un insie*e di stringhe/ 8e es ressioni regolari sono costruite in *odo analogo alle es ressioni *ate*atiche utilizzando vari o eratori er *ettere insie*e delle es ressioni i@ iccole. Il blocchi )onda*entali er realizzarle sono delle es ressioni regolari che coincidono con un singolo carattere. 8a *aggior arte dei caratteri, co* rese tutte le lettere e le ci)re, sono es ressioni regolari di er se stessi. 9ualsiasi *etacarattere con signi)icato s eciale uE essere [quotato[ H 8uotedI )acendolo recedere da una barra inversa.

#.1.2. I )etacaratteri delle espressioni regolari


5na es ressione regolare H*etacaratteriI7 uE essere seguita da uno degli svariati o eratori di ri etizione

Tabella <#1: &peratori delle e pre ioni regolari Gperatore %ffetto . ? ^ ] aNc aN,c aN.=c < Corris onde ad ogni carattere. 8:oggetto che recede 3 o zionale e sar! )atto corris ondere al*eno una volta. 8:oggetto che recede sar! )atto corris ondere da zero a i@ volte. 8:oggetto che recede sar! )atto corris ondere da una a i@ volte. 8:oggetto che recede sar! )atto corris ondere esatta*ente N volte. 8:oggetto che recede sar! )atto corris ondere da N a i@ volte. 8:oggetto che recede sar! )atto corris ondere al*eno N volte, *a non i@ di = volte. 'a resenta l:intervallo se non 3 il ri*o o l:ulti*o di un elenco o il unto )inale di un 73

Ca itolo #. 8e es ressioni regolari

intervallo in un elenco. g \ Ub UUe UT Corris onde alla stringa vuota all:inizio di una linea. 'a resenta anche i caratteri non co* resi nell:intervallo della lista. Corris onde alla stringa vuota alla )ine di una riga. Corris onde alla stringa vuota all:estre*it! di una arola. Corris onde alla stringa vuota )ornita che non 3 all:edge della arola. Corris onde alla stringa vuota all:inizio della arola. Corris onde alla stringa vuota alla )ine della arola.

+ue es ressioni regolari ossono essere concatenate7 la risultante es ressione regolare corris onde a qualsiasi stringa )or*ata concatenando le due sottostringhe che corris ondono ris ettiva*ente alle due sottoes ressioni concatenate. +ue es ressioni regolari ossono essere unite con l:o eratore in)iA [X[7 la risultante es ressione regolare corris onde ad ogni stringa coincidente con entra*be le sottoes ressioni. 8a ri etizione ha la recedenza sul concatena*ento, il quale invece ha la recedenza sull:alternanza. 5na sottoes ressione intera uE essere racchiusa tra arentesi er scavalcare queste regole di recedenza.

#.1.3. ;spressioni regolari ele)entari contro estese


Nelle es ressioni regolari ele*entari i *etacaratteri [?[, [][, [a[, [X[, [H[, e [I[ erdono il loro signi)icato s eciale7 usate invece le versioni con barra inversa [U?[, [U][, [Ua[, [UX[, [UH[, e [UI[. 0eri)icate nella docu*entazione del vostro siste*a se i co*andi che usano es ressioni regolari su ortano le es ressioni estese.

#.2. ;se)pi di utilizzo di grep


#.2.1. Cos74 grep?
gre ricerca nei )ile inseriti le linee contenenti la corris ondenza ad un deter*inato elenco di *odelli. 9uando riscontra una coincidenza in una linea, co ia Hdi consuetoI la linea nello standard out ut, o ure in qualsiasi altro genere di dati in uscita voi abbiate richiesto con le o zioni. 2ebbene gre si as etti di eseguire la co* arazione su un testo, non ha li*iti nella lunghezza della linea in ingresso ad eccezione della *e*oria dis onibile e uE co* arare caratteri arbitrari all:interno di una riga. 2e il bGte )inale di un )ile in ingresso non 3 un nuovalinea, gre ne )ornisce uno in *odo tacito. +al *o*ento che un nuovalinea 3 ure un se aratore in un elenco di *odelli, non c:3 *odo di con)rontare dei caratteri di nuovalinea in un testo. Ca itolo #. 8e es ressioni regolari 7#

1lcuni ese* i7
cathy ~> grep root /etc/passwd root:x:0:0:root:/root:/bin/bash operator:x:11:0:operator:/root:/sbin/nologin cathy ~> grep -n root /etc/passwd 1:root:x:0:0:root:/root:/bin/bash 12:operator:x:11:0:operator:/root:/sbin/nologin cathy ~> grep -v bash /etc/passwd | grep -v nologin sync:x:5:0:sync:/sbin:/bin/sync shutdown:x:6:0:shutdown:/sbin:/sbin/shutdown halt:x:7:0:halt:/sbin:/sbin/halt news:x:9:13:news:/var/spool/news: mailnull:x:47:47::/var/spool/mqueue:/dev/null xfs:x:43:43:X Font Server:/etc/X11/fs:/bin/false rpc:x:32:32:Portmapper RPC user:/:/bin/false7 nscd:x:28:28:NSCD Daemon:/:/bin/false named:x:25:25:Named:/var/named:/bin/false squid:x:23:23::/var/spool/squid:/dev/null ldap:x:55:55:LDAP User:/var/lib/ldap:/bin/false apache:x:48:48:Apache:/var/www:/bin/false cathy ~> grep -c false /etc/passwd 7 cathy ~> grep -i ps ~/.bash* | grep -v history /home/cathy/.bashrc:PS1="\[\033[1;44m\]$USER is in \w\[\033[0m\] "

Con il ri*o co*ando l:utente cath! *ostra dal )ile /etc/passwd le linee contenenti la stringa root. Poi *ostra i nu*eri di linea contenenti questa stringa di ricerca. Con il terzo co*ando controlla quali utenti non stanno bash, *a gli acccount con la shell nologin non vengono *ostrati. 9uindi conta il nu*ero di account che hanno /bin/false co*e shell. 8:ulti*o co*ando *ostra le linee da tutti i )ile nella sua directorG ersonale che iniziano con ~/.bash, escludendo le coincidenze con la stringa hi tor!, in *odo da tralasciare i con)ronti con ~/.bash_history che otrebbe contenere la *edesi*a stringa, in *aiuscolo o in *inuscolo. .ate attenzione che la ricerca 3 er la tringa [ s[ e non er il comando ps. ,ra vedia*o che cos:altro ossia*o )are con gre , utilizzando le es ressioni regolari.

#.2.2. 5rep e le espressioni regolari


Se non siete su Linu+ Noi usia*o in questi ese* i 4N5 gre , il quale su orta le es ressioni regolari estese. 4N5 gre 3 di base nei siste*i 8inuA. 2e state lavorando su siste*i ro rietari, veri)icate con l:o zione <0 che versione state utilizzando. 4N5 gre uE essere scaricato da htt 7;;gnu.org;directorG;.

Ca itolo #. 8e es ressioni regolari

7$

#.2.2.1. 2ncore delle linee e delle parole


+all:ese* io recedente ora voglia*o esclusiva*ente *ostrare le linee che iniziano con la stringa [root[7
cathy ~> grep ^root /etc/passwd root:x:0:0:root:/root:/bin/bash

2e desideria*o vedere quali account non hanno er nulla una shell assegnata, cerchia*o linee che ter*inano con [7[7
cathy ~> grep :$ /etc/passwd news:x:9:13:news:/var/spool/news:

Per controllare che PATH venga es ortato in ~/.bashrc, selezionate ri*a le linee [eA ort[ e oi cercate quelle che iniziano con la stringa [P1/B[, in *odo da non *ostrare MANPATH e d altri ossibili ercorsi7
cathy ~> grep export ~/.bashrc | grep '\<PATH' export PATH="/bin:/usr/lib/mh:/lib:/usr/bin:/usr/local/bin:/usr/ucb:/usr/dbin:$PATH"

In *aniera si*ile, UT corris onde alla )ine di una arola. 2e volete trovare una stringa che sia una arola se arata Hracchiusa tra s aziI, 3 *eglio utilizzare la -w, co*e in questo ese* io in cui *ostria*o delle in)or*azioni sulla artizione di root7
cathy ~> grep -w / /etc/fstab LABEL=/ / ext3 defaults 1 1

2e non si usa l:o zione, saranno *ostrate tutte le linee dalla tabella del )ile sGste*.

#.2.2.2. Classi di caratteri


5na e pre ione tra parente i 3 un elenco di caratteri racchiusi tra [J[ e [K[. 6ssa con)ronta ogni singolo carattere di quella lista7 se il ri*o carattere dell:elenco 3 l:accento circon)lesso,[g[, allora co* arer! qualsiasi carattere N,N resente in esso. Per ese* io, l:es ressione regolare [J(123#$&7"%K[ con)ronta ogni singola ci)ra. 1ll:interno di un:es ressione tra arentesi, una e pre ione di intervallo 3 )or*ata da due caratteri se arati da un trattino. 6ssa )a corris ondere ogni singolo carattere co* reso tra i due caratteri non esclusi, utilizzando la sequenza di con)ronto e l:insie*e dei caratteri del singolo siste*a. Per ese* io, nello s eci)ico a*biente C, [Ja<dK[ 3 equivalente a [JabcdK[. =olti a*bienti ordinano i caratteri secondo l:ordine del dizionario e in questi a*bienti [Ja<dK[ nor*al*ente non equivale a [JabcdK[7 er ese* io otrebbe essere equivalente a [J1a-bCc+dK[. Per ottenere l:inter retazione tradizionale delle es ressioni regolari, otete usare l:a*biente C i* ostando la variabile a*bientale LC_ALL con il valore [C[. In)ine, certe classi deno*inate di caratteri sono rede)inite all:interno delle es ressioni tra arentesi. 0edete il *an di grep o le agine in)o er *aggiori in)or*azioni su tali es ressioni rede)inite.
cathy ~> grep [yf] /etc/group sys:x:3:root,bin,adm tty:x:5: mail:x:12:mail,postfix ftp:x:50:

Ca itolo #. 8e es ressioni regolari

7&

nobody:x:99: floppy:x:19: xfs:x:43: nfsnobody:x:65534: postfix:x:89:

Nell:ese* io vengono *ostrate tutte le linee contenenti o un carattere [G[ o [)[.

#.2.2.3. 9etacaratteri @wildcardA


5sate il [.[ er la corris ondenza di un solo carattere. 2e volete ottenere un elenco di tutte le arole del dizionario inglese che iniziano er [c[ e ter*inano con [h[ Hutile er risolvere arole incrociateI7
cathy ~> grep '\<c...h\>' /usr/share/dict/words catch clash cloth coach couch cough crash crush

2e volete *ostrare le linee contenenti il carattere letterale unto, usate l:o zione -F con grep. Per co* arare *olte lici caratteri, usate l:asterisco. 9uesto ese* io seleziona tutte le arole che iniziano con [c[ e ter*inano con [h[ nel dizionario di siste*a7
cathy ~> grep '\<c.*h\>' /usr/share/dict/words caliph cash catch cheesecloth cheetah --output omesso--

2e desiderate trovare il carattere letterale asterisco in un )ile o nei dati in uscita, usate degli a ici singoli. Nell:ese* io seguente CathG ri*a rova a trovare il carattere asterisco in /etc/profile senza usare gli a ici, cosa che non restituisce alcuna linea. 5sando gli a ici viene rodotto un risultato7
cathy ~> grep * /etc/profile cathy ~> grep '*' /etc/profile for i in /etc/profile.d/*.sh ; do

#.3. Co)parazione dei )odelli utilizzando le (unzionalit" di Bash


.3.1. Inter!alli dei caratteri
1 arte grep e le es ressioni regolari, ci sono *olte co* arazioni di *odelli che otete eseguire diretta*ente nella shell senza dover ricorrere ad un rogra**a esterno. Ca itolo #. 8e es ressioni regolari 77

Co*e gi! sa ete, l:asterisco H^I e il unto di do*anda H?I corris ondono ris ettiva*ente a qualsiasi stringa ed a qualsiasi singolo carattere. Ponete )ra a ici questi caratteri s eciali er )arli corris ondere alla lettera7
cathy ~> touch "*" cathy ~> ls "*" *

Potete usare anche le arentesi quadre er con)rontare ogni carattere o intervallo di caratteri inclusi, se le co ie di caratteri sono se arati da un trattino. 5n ese* io7
cathy ~> ls -ld [a-cx-z]* drwxr-xr-x 2 cathy drwxrwxr-x 4 cathy drwxrwxr-x 2 cathy drwxr-xr-x 7 cathy drwxrwxr-x 3 cathy cathy cathy cathy cathy cathy 4096 4096 4096 4096 4096 Jul 20 2002 app-defaults/ May 25 2002 arabic/ Mar 4 18:30 bin/ Sep 2 2001 crossover/ Mar 22 2002 xml/

CiE elenca tutti i )ile nella directorG ersonale di cath!, iniziando da [a[,[b[, [c[, [A[, [G[, o [z[. 2e il ri*o carattere tra arentesi 3 [V[ o [g[, verr! co* arato qualsiasi carattere non incluso. Per con)rontare il trattino H[<[I, includetelo co*e ri*o o ulti*o carattere dell:insie*e. 8:ordina*ento di ende dall:a*biente corrente e dal valore della variabile LC_COLLATE, se i* ostata. 'icordatevi che altri a*bienti otrebbero inter retare [Ja<cA<zK[ co*e [Ja-bCcFALGhzK[ se l:ordina*ento viene eseguito in ordine del dizionario. 2e volete essere sicuri di avere l:inter retazione tradizionale degli intervalli, )orzatene questo co* orta*ento i* ostando LC_COLLATE o LC_ALL a [C[.

#.3.2. Classi di caratteri


8e classi di caratteri si ossono s eci)icare all:interno delle arentesi quadre utilizzando la sintassi J7C81227K, dove C8122 3 de)inita nello standard P,2IF ed ha uno dei valori [alnu*[, [al ha[, [ascii[, [blan?[, [cntrl[, [digit[, [gra h[, [lo>er[, [ rint[, [ unct[, [s ace[, [u er[, [>ord[ o [Adigit[. 1lcuni ese* i7
cathy ~> ls -ld [[:digit:]]* drwxrwxr-x 2 cathy cathy cathy ~> ls -ld [[:upper:]]* drwxrwxr-3 cathy cathy drwxrwxr-x 4 cathy cathy -rw-rw-r-1 cathy cathy 4096 Apr 20 13:45 2/

4096 Sep 30 2001 Nautilus/ 4096 Jul 11 2002 OpenOffice.org1.0/ 997376 Apr 18 15:39 Schedule.sdc

9uando 3 attiva l:o zione di shell extglob Hutilizzando l:integrato shoptI, vengono riconosciuti diversi o eratori estesi di co* arazione dei *odelli. 8eggete di i@ nelle agine in)o di -ash, sezione -asic shell )eatures<T2hell 6A ansions<T.ilena*e 6A ansion<TPattern =atching.

Ca itolo #. 8e es ressioni regolari

7"

#.#. 3o))ario
8e es ressioni regolari sono degli stru*enti otenti er selezionare delle linee articolari dai )ile o dai dati in uscita. =olti co*andi 5NIF usa es ressioni regolari7 im, perl, il database Postgre298 e cosD via. 2i ossono *ettere a dis osizione in qualsiasi linguaggio o a licazione utilizzando librerie esterne e si sono di))use anche nei siste*i non 5NIF. Per ese* io, le es ressioni regolari sono utilizzate nel )oglio elettronico 6Acel che viene )ornito con la suite =icroso)t Cindo>s ,))ice. In questo ca itolo abbia*o reso con)idenza con il co*ando grep, che 3 )onda*entale in qualsiasi a*biente 5NIF. Il co*ando grep uE )are di i@ ris etto ai ochi co* iti che qui abbia*o tratttato7 l:abbia*o usato soltanto co*e ese* io er le es ressioni regolari. 8a versione 4N5 di grep giunge con dovizia di docu*entazione, che siete calda*ente consigliati di leggereV -ash ha delle )unzionalit! integrate er co* arare *odelli e uE riconoscere classi e intervalli di caratteri.

#.$. ;sercizi
9uesti esercizi vi aiuteranno a adroneggiare le es ressioni regolari. 1. 2. 3. #. $. &. 7. ". %. 1(. 11. 12. =ostrate un elenco di tutti gli utenti nel vostro siste*a che si sono autenticati con la shell -ash co*e rede)inita. +alla directorG /etc/group/ *ostrate tutte le linee che iniziano con la stringa [dae*on[. 2ta* ate tutte le linee dallo stesso )ile che non contengono la stringa recedente. =ostrate le in)or*azioni di localhost dal )ile /etc/hosts, il nu*ero di linee che soddis)ano la stringa di ricerca e contate quante volte ricorre la stringa. =ostrate un elenco delle sottodirectorG /usr/share/doc contenenti in)or*azioni sulla shell. 9ueste sottodirectorG quanti )ile README contengono? Non contate nulla che abbia la )or*a di ['61+=6.unaMstringa[. .ate un elenco dei )ile della vostra directorG ersonale che sono stati *odi)icati *eno di 1( ore )a, utilizzando grep, *a tralasciando le directorG. =ettere questi co*andi in uno scri t di shell che generi dei risultati co* rensibili. Potete trovare un:alternativa a -c -1 utilizzando grep? 5sando la tabella del )ile sGste* H er ese* io, etc/fstabI, elencate le unit! disco locali. 'ealizzate uno scri t che veri)ichi se un utente esiste in /etc/passwd. Per ora otete s eci)icare il no*e utente nello scri t, non dovete lavorare con argo*enti e condizioni in questa )ase. =ostrate i )ile di con)igurazione in /etc contenenti nu*eri nei loro no*i.

Ca itolo #. 8e es ressioni regolari

7%

Capitolo $. L7editor di (lussi 5 6 sed


1l ter*ine di questo ca itolo avrete a reso gli argo*enti seguenti7 Cos:3 sed? 5so interattivo di sed 6s ressioni regolari e *odi)ica dei )lussi 5tilizzo dei co*andi di sed negli scri t Questa 4 una introdu1ione /ali s iegazioni sono lontane dall:essere esaustive e certa*ente non vanno ritenute utilizzabili co*e il de)initivo *anuale utente di sed. 9uesto ca itolo 3 stato incluso sola*ente er *ostrare alcuni dei i@ interessanti argo*enti dei ca itoli successivi e erch ogni utente es erto ossa avere una conoscenza di base sulle cose che si ossono )are con questo editor. Per in)or*azioni dettagliate, )ate ri)eri*ento alle agine in)o e *an di sed.

$.1. Introduzione
$.1.1. Che cosa 4 sed
5no 2trea* 6+itor Heditor di )lussiI si usa er eseguire delle se* lici tras)or*azioni in testi da un )ile o da un incanala*ento H pipeI. Il risultato viene inviato allo standard out ut. 8a sintassi del co*ando sed non ha s eci)iche di un )ile in uscita, *a i risultati si ossono salvare in un )ile utilizzando la redirezione dei dati in uscita. 8:editor non *odi)ica gli originali dati in ingresso. CiE che distingue sed da altri editor, co*e i e ed, 3 la sua ca acit! di )iltrare testi che riceve da )onti di incanala*ento. Non vi serve interagire con l:editor *entre sta )unzionando7 questo 3 il *otivo er cui sed talvolta viene de)inito un batch editor. /ale caratteristica consente di utilizzare dei co*andi di *odi)ica negli scri t, se* li)icando enor*e*ente i co* iti ri etitivi di revisione. 9uando si resenta la necessit! di sostituire del testo in un grande nu*ero di )ile, sed 3 di grande aiuto.

$.1.2. I co)andi di sed


Il rogra**a sed uE eseguire sostituzioni e cancellazioni di *odelli di testo utilizzando le es ressioni regolari co*e quelle usate con il co*ando grep7 v. 2ezione #.2. I co*andi di *odi)ica sono si*ili a quelli usati nell:editor i7

Ca itolo $. 8:editor di )lussi 4N5 sed

"(

Tabella =#1 ) comandi di ed per la modifica )omando aU cU d iU r s > Fisultato 1ggiunge HappendI del testo sotto la linea corrente. Ca*bia HchangeI il testo nella linea corrente con quello nuovo. Cancella HdeleteI il testo. Inserisce Hin ertI il testo al di so ra della linea corrente. 2ta* a HprintI il testo. 8egge HreadI un )ile. 'icerca H earchI e sostituisce un testo. 2crive H$riteI in un )ile.

1 arte la *odi)ica dei co*andi, otete assegnare delle o zioni a sed. Nella tabella successiva c:3 una anora*ica7 Tabella =#. &pzioni di ed Gp1ione -e SCRIPT -f -n -V %ffetto 1ggiunge il co*andi in 2C'IP/ all:insie*e dei co*andi da )ar )unzionare *entre si stanno elaborando i dati in ingresso. 1ggiunge i co*andi contenuti nel )ile 2C'IP/<.I86 all:insie*e dei co*andi da )ar )unzionare *entre si stanno elaborando i dati in entrata. =odo silenzioso. 2ta* a le in)or*azioni sulla versione ed esce.

8e agine in)o di sed contengono *aggiori in)or*azioni7 qui elenchia*o solo i co*andi e le o zioni utilizzati i@ )requente*ente.

$.2. 9odi(ica interattiva


$.2.1. 3ta)pa delle linee contenenti un )odello
9uesto 3 qualcosa che otreste )are con grep, *a non otreste eseguire un [trova e sostituisci[ utilizzando tale co*ando. CiE 3 solo er iniziare. 9uesto 3 il nostro )ile testuale d:ese* io7
sandy ~> 1 2 3 4 5 6 sandy ~> cat -n esempio Questa la prima linea di un testo di esempio. E' un testo con erori. Molti erori. Cos tanti erori. Tutti questi erori mi fanno impazzire. Questa una linea che non contiene errori. Questa l'ultima linea.

0oglia*o sed er trovare le linee che contengono il nostro *odello di ricerca, in questo caso Ca itolo $. 8:editor di )lussi 4N5 sed "1

[erori[. 5sia*o la p er conseguire il risultato7


sandy ~> sed '/erori/p' esempio Questa la prima linea di un testo di esempio. E' un testo con erori. E' un testo con erori. Molti erori. Molti erori. Cos tanti erori. Tutti questi erori mi fanno impazzire. Cos tanti erori. Tutti questi erori mi fanno impazzire. Questa una linea che non contiene errori. Questa l'ultima linea. sandy ~>

Co*e otete osservare, sed sta* a il )ile intero, *a le linee contenenti la stringa di ricerca vengono sta* ate due volte. Non 3 ciE che voglia*o. Per sta* are sola*ente quelle linee che soddis)ano il nostro *odello, utilizzia*o l:o zione -n7
sandy ~> sed -n '/erori/p' esempio E' un testo con erori. Molti erori. Cos tanti erori. Tutti questi erori mi fanno impazzire. sandy ~>

$.2.2. Cancellazione delle linee in ingresso contenenti un )odello


5tilizzia*o lo stesso )ile testuale co*e ese* io. ,ra voglia*o sola*ente vedere le linee che non contengono la stringa di ricerca7
sandy ~> Questa Questa Questa sandy ~> sed '/erori/d' esempio la prima linea di un testo di esempio. una linea che non contiene errori. l'ultima linea.

Il co*ando d agisce escludendo la ra resentazione delle linee. 8e linee con)rontate che iniziano con un certo *odello e ter*inano con un secondo *odello vengono *ostrate in questo *odo7
sandy ~> sed -n '/^Questa.*errori.$/p' esempio Questa una linea che non contiene errori. sandy ~>

Notate che l:ulti*o unto deve essere receduto da un carattere di esca e er oterlo real*ente con)rontare. Nel nostro ese* io l:es ressione con)ronta se* lice*ente qualsiasi carattere, co* reso l:ulti*o unto.

$.2.3. Intervalli di linee


9uesta volta voglia*o estrarre le linee che contengono gli errori. Nell:ese* io queste sono le linee da 2 a #. 2 eci)icate tale intervallo er inviarlo insie*e al co*ando d7 Ca itolo $. 8:editor di )lussi 4N5 sed "2

sandy ~> Questa Questa Questa sandy ~>

sed '2,4d' esempio la prima linea di un testo di esempio. una linea che non contiene errori. l'ultima linea.

Per sta* are il )ile artendo da una certa linea sino alla )ine del )ile, utilizzate un co*ando si*ile a questo7
sandy ~> sed '3,$d' esempio Questa la prima linea di un testo di esempio. E' un testo con erori. sandy ~>

CiE sta* a sola*ente le ri*e due linee del )ile di ese* io. Il co*ando seguente sta* a la ri*a linea che contiene il *odello [un testo[, )ino a e co* rendendo la successiva linea contenente il *odello [una linea[7
sandy ~> sed -n '/un testo/,/una linea/p' esempio Questa la prima linea di un testo di esempio. E' un testo con erori. Molti erori. Cos tanti erori. Tutti questi erori mi fanno impazzire. Questa una linea che non contiene errori. sandy ~>

$.2.#. Cerca e sostituisci con sed


Nel )ile d:ese* io ora cerchere*o e sostituire*o gli errori invece di HdeIselezionare le linee contenenti la stringa di ricerca.
sandy ~> sed 's/erori/errori/' esempio Questa la prima linea di un testo di esempio. E' un testo con errori. Molti errori. Cos tanti errori. Tutti questi erori mi fanno impazzire. Questa una linea che non contiene errori. Questa l'ultima linea. sandy ~>

Co*e otete vedere, questo non 3 esatta*ente l:e))etto desiderato7 nella linea # solo la ri*a ricorrenza della stringa di ricerca 3 stata sostituita e lD er*ane ancora un [erore[. 5tilizzate il co*ando g er indicare a sed che dovrebbe esa*inare la linea intera invece di )er*arsi alla ri*a ricorrenza della vostra stringa7
sandy ~> sed 's/erori/errori/g' esempio Questa la prima linea di un testo di esempio. E' un testo con errori. Molti errori. Cos tanti errori. Tutti questi errori mi fanno impazzire. Questa una linea che non contiene errori. Questa l'ultima linea. sandy ~>

Per inserire una stringa all:inizio di ogni linea, ad ese* io er *ettere gli a ici7 Ca itolo $. 8:editor di )lussi 4N5 sed "3

sandy ~> sed 's/^/> /' esempio > Questa la prima linea di un testo di esempio. > E' un testo con erori. > Molti erori. > Cos tanti erori. Tutti questi erori mi fanno impazzire. > Questa una linea che non contiene errori. > Questa l'ultima linea. sandy ~>

Inserite una stringa qualsiasi alla )ine di ogni linea7


sandy ~>sed 's/$/EOL/' esempio Questa la prima linea di un testo di esempio.EOL E' un testo con erori.EOL Molti erori.EOL Cos tanti erori. Tutti questi erori mi fanno impazzire.EOL Questa una linea che non contiene errori.EOL Questa l'ultima linea.EOL sandy ~>

I co*andi *ulti li di ricerca e sostituzione sono se arati con singole o zioni -e:
sandy ~> sed -e 's/erori/errori/g' -e 's/ultima/ultimissima/g' esempio Questa la prima linea di un testo di esempio. E' un testo con errori. Molti errori. Cos tanti errori. Tutti questi errori mi fanno impazzire. Questa una linea che non contiene errori. Questa l'ultimissima linea. sandy ~>

/enete in *ente che nor*al*ente sed sta* a i suoi risultati nell:uscita standard, *olto robabil*ente la vostra )inestra di ter*inale. 2e desiderate salvare in un )ile i dati in uscita, redirigeteli7
sed opzione 'qualche/espressione' file_da_elaborare > sed_uscita_verso_un_file

Klteriori esempi 6se* i in quantit! su sed si ossono trovare negli scri t di avvio della vostra *acchina, che nor*al*ente si trovano in /etc/init.d o in /etc/rc.d/init.d. 2 ostatevi nella directorG contenente gli initscri t del vostro siste*a e i* artite il co*ando seguente7 grep sed *

$.3. 9odi(iche non interattive


$.3.1. Lettura dei co)andi di sed da un (ile
2i ossono *ettere *olte lici co*andi di sed in un )ile ed eseguirli utilizzando l:o zione -f. 9uando create un tale )ile, assicuratevi che7 Non vi siano s azi bianchi al ter*ine della lineaN non vengano utilizzati a iciN Ca itolo $. 8:editor di )lussi 4N5 sed "#

quando si aggiunge o sostituisce un testo, tutte, tranne l:ulti*a, le linee )iniscano con una barra inversa.

$.3.2. 3crittura dei (ile dei dati in uscita


8a scrittura dei dati in uscita HoutputI si esegue utilizzando l:o eratore di redirezione di uscita >. 9uesto 3 uno scri t di ese* io usato er creare dei )ile *olto se* lici in B/=8 da nor*ali )ile di testo.
sandy ~> cat script.sed 1i\ <html>\ <head><title>html generato da sed</title></head>\ <body bgcolor="#ffffff">\ <pre> $a\ </pre>\ </body>\ </html> sandy ~> cat txt2html.sh #!/bin/bash # Questo un semplice script che potete usare per convertire testi in HTML. # Primo, togliamo tutti i caratteri di nuovalinea, in modo che avvenga solo una volta # l'aggiunta, poi sostituiamo i nuovelinea. echo "conversione $1..." SCRIPT="/home/sandy/scripts/script.sed" NAME="$1" TEMPFILE="/var/tmp/sed.$PID.tmp" sed "s/\n/^M/" $1 | sed -f $SCRIPT | sed "s/^M/\n/" > $TEMPFILE mv $TEMPFILE $NAME echo "finito." sandy ~>

$1 contiene il ri*o argo*ento di un dato co*ando, in questo caso il no*e del )ile da convertire7
sandy ~> cat test linea1 linea2 linea3

+i i@ sui ara*etri osizionali nel Ca itolo 7.


sandy ~> txt2html.sh test conversione test... finito. sandy ~> cat test <html> <head><title>html generato da sed</title></head> <body bgcolor="#ffffff"> <pre> linea1 linea2 linea3 </pre> </body> </html>

Ca itolo $. 8:editor di )lussi 4N5 sed

"$

sandy ~>

9uesto non 3 co*e dovrebbe essere )atto in realt!7 tale ese* io di*ostra sola*ente delle ca acit! di sed. 4uardate la 2ezione &.3 er una soluzione i@ decente di questo roble*a, utilizzando i costrutti 3%')6 e %6D di a-!. sed facile 4li editor avanzati, con su orto della evidenziazione della sintassi, sono in grado di riconoscere la sintassi di sed. CiE uE risultare di grande aiuto se tendete a di*enticare barre inverse e si*ili.

$.#. 3o))ario
8:editor di )lussi sed 3 uno stru*ento otente a linea di co*ando che ha la ca acit! di *aneggiare )lussi di dati7 uE ricevere linee in ingresso da un incanala*ento H pipeI. CiE lo rende adatto ad un uso non interattivo. 8:editor sed usa co*andi si*il< i ed accetta es ressioni regolari. 8o stru*ento sed uE leggere co*andi da linea di co*ando o da uno scri t. 0iene utilizzato s esso er eseguire delle o erazioni cerca<e<sostituisci su linee contenenti un *odello.

$.$. ;sercizi
9uesti esercizi sono diretti a di*ostrare ulterior*ente cosa sed uE )are. 1. 2ta* ate un elenco delle linee nella vostra directorG scripts ter*inanti con [.sh[. 'icordatevi che otreste dover togliere l:alias a ls. =ettete il risultato in un )ile te* oraneo. 2. .ate un elenco dei )ile in ;usr;bin che hanno la lettera [a[ co*e secondo carattere. =ettete il risultato in un )ile te* oraneo. 3. Cancellate le ri*e 3 linee di ogni )ile te* oraneo. #. 2ta* ate nell:uscita standard soltanto le linee contenenti il *odello [an[. $. Create un )ile contenente i co*andi di sed er eseguire i due co* iti recedenti. 1ggiungete a questo )ile un co*ando eAtra che attacchi una stringa co*e [^^^ CiE otrebbe avere qualcosa a che )are con *an e le agine *an ^^^[ nella linea che recede ogni ricorrenza della stringa [*an[. Controllate i risultati. &. 5n lungo elenco della directorG radice, ;,viene usato co*e dato in ingresso. Create un )ile contenente co*andi di sed che veri)ichino collega*enti si*bolici e )ile nor*ali. 2e un )ile 3 un collega*ento si*bolico, )atelo recedere da una linea co*e [<<9uesto 3 un collega*ento si*bolico<<[. 2e il )ile 3 un nor*ale )ile, aggiungete una stringa nella stessa linea con un co**ento co*e [e<<< questo 3 un )ile nor*ale[. 7. Create uno scri t che *ostri le linee contenenti degli s azi bianchi da un )ile. 9uesto scri t dovrebbe utilizzare uno scri t sed e *ostrare delle in)or*azioni sensate all:utente.

Ca itolo $. 8:editor di )lussi 4N5 sed

"&

Capitolo %. Il linguaggio di progra))azione 5 6 aBC


In questo ca itolo discutere*o di7 Cos:3 ga>?? 5so dei co*andi di ga>? nella linea di co*ando Co*e )or*attare il testo con ga>? Co*e ga>? usa le es ressioni regolari 4a>? negli scri t 4a>? e variabili 6er renderlo piJ di ertente Co*e con sed, sono stati scritti libri interi sulle varie versioni di a-!, 9uesta introduzione 3 lontana dall:essere esaustiva ed 3 intesa solo er la co* rensione degli ese* i nei ca itoli seguenti. Per *aggiori in)or*azioni, 3 *eglio iniziare con la docu*entazione allegata a G?K a-!$ L41CS7 6))ective 1CS Progra**ing7 1 5ser:s 4uide )or 4N5 1>?[.

%.1. Introduzione a gaBC


%.1.1. Cos74 gaBC?
4a>? 3 la versione 4N5 del rogra**a 5NIF co*une*ente dis onibile a-!, un altro di))uso editor di )lussi. +al *o*ento che il rogra**a a-! 3 s esso solo un lin? a ga-!, noi )are*o ri)eri*ento ad esso co*e a-!. 8a )unzione basilare di a-! 3 di cercare nei )ile linee od altre unit! di testo contenenti uno o i@ *odelli. 9uando una linea corris onde ad uno dei *odelli, vengono eseguite delle s eciali azioni su quella linea. I rogra**i in a-! sono diversi da quelli della *aggior arte degli altri linguaggi oich i rogra**i a-! sono [guidati dai dati[ H data#drivenI7 voi descrivete i dati su cui volete lavorare e quindi cosa )are quando li trovate. 9uando si lavora con linguaggi rocedurali, di solito 3 i@ di))icile descrivere chiara*ente i dati che il vostro rogra**a elaborer!. Per tale *otivo i rogra**i a-! sono s esso iacevoli da leggere e scrivere. Cosa signi)ica vera*ente? Ca itolo &. Il linguaggio di rogra**azione 4N5 a>? "7

/e* o )a negli anni :7( tre rogra**atori decisero di creare questo linguaggio. I loro no*i erano 1ho, Sernighan e Ceinberger. Presero il ri*o carattere di ciascuno dei loro no*i e li *isero assie*e. CosD il no*e del linguaggio avrebbe otuto essere stato tuttal i@ [>a?[.

".1.2. I comandi di ga#$


9uando )ate girare a-!, s eci)icate un programma a-! che dice ad a-! cosa )are. Il rogra**a consiste in una serie di regole Hrule I7 uE anche contenere de)inizioni di )unzioni, cicli, condizioni ed altri costrutti di rogra**azione, )unzionalit! avanzate che er ora ignorere*o. ,gni regola recisa un solo *odello da cercare ed una o erazione da eseguire nel *o*ento in cui si riscontra il *odello. Ci sono diversi *odi er avviare a-!. 2e il rogra**a 3 breve, 3 i@ se* lice lanciarlo da linea di co*ando. 9uesto otrebbe a arire cosD7 a>? -f FILEPROGRAMMA fileiningresso

%.2. Il progra))a print


%.2.1. 3ta)pa di ca)pi selezionati
Il co*ando print in a-! e*ette dei dati selezionati dal )ile in ingresso. 9uando a-! legge una linea di un )ile, la divide in ca* i basandosi sullo s eci)ico eparatore di campi in ingre o Hinput field eparato o FSI che 3 una variabile di a-! Hv. 2ezione &.3.2I 9uesta variabile 3 rede)inita er essere di uno o i@ s azi o tabulazioni. 8e variabili $1, $2, $3, , $N contengono i valori del ri*o, secondo, terzo )ino all:ulti*o ca* o di una linea in ingresso. 8a variabile $0 HzeroI contiene il valore dell:intera linea. CiE viene illustrato nella i**agine successiva, dove vedia*o sei colonne in uscita del co*ando df7

Ca itolo &. Il linguaggio di rogra**azione 4N5 a>? ""

-igura >#1/ Campi in a$k

Nei dati in uscita di ls -l, ci sono % colonne. 8:istruzione print usa questi )ile nel *odo seguente7
kelly@octarine ~/test> ls -l | awk '{ print $5 $9 }' 160orig 121script.sed 120temp_file 126test 120twolines 441txt2html.sh kelly@octarine ~/test>

9uesto co*ando ha sta* ato la quinta colonna di un lungo elenco di )ile, che contiene la di*ensione dei )ile, e l:ulti*a colonna, il no*e del )ile. 9uesti dati in uscita non sono *olto leggibili a *eno che utilizziate il *odo u))iciale di ri)eri*ento alle colonne, che 3 quello di se arare con una virgola quelle che volete sta* are. In tal caso il carattere se aratore di uscita rede)inito, di solito uno s azio, verr! inserito tra ciascun ca* o in uscita. )onfigura1ione locale Notate che la con)igurazione dei dati in uscita del co*ando ls 'l otrebbe essere di))erente nel vostro siste*a. 8a resentazione di ora e data di ende dalle vostre i* ostazioni d:a*biente.

".2.2. Formattare i campi


2enza )or*attare, utilizzando solo il se aratore dei dati in uscita, quest:ulti*i a arirebbero Ca itolo &. Il linguaggio di rogra**azione 4N5 a>? "%

iuttosto scarni. Inserendo una co ia di tabulazioni e una stringa er indicare che ti o di dati sono questi, li render! di as etto *olto i@ gradevole7
kelly@octarine ~/test> ls -ldh * | grep -v total | \ awk '{ print "La dimensione is " $5 " byte per " $9 }' La dimensione 160 byte per orig La dimensione 121 byte per script.sed La dimensione 120 byte per temp_file La dimensione 126 byte per test La dimensione 120 byte per twolines La dimensione 441 byte per txt2html.sh kelly@octarine ~/test>

,sservate l:uso della barra inversa, che )a continuare i lunghi dati in ingresso nella riga successiva senza che la shell inter reti ciE co*e un co*ando se arato. =entre i vostri dati in ingresso nella linea di co*ando ossono essere di lunghezza virtual*ente illi*itata, il vostro *onitor non lo 3, e certa*ente non lo 3 neanche la carta sta* ata. 8:utilizzo della barra inversa consente anche la co ia e l:incollaggio delle linee so rastanti in una )inestra di ter*inale. 8:o zione -h con ls viene usata er )ornire dei )or*ati di*ensionali u*ana*ente leggibili er i )ile i@ grandi. 0iene e*essa una lunga lista che *ostra la quantit! totale dei blocchi nella directorG quando l:argo*ento 3 una directorG. 9uesta linea ci 3 inutile, quindi aggiungia*o un asterisco. 1ggiungia*o ure l:o zione -d er la *edesi*a ragione, nel caso l:asterisco si es anda ad una directorG. 8a barra inversa in questo ese* io segna la continuazione di una linea. 0. 2ezione 3.3.2. Potete estrarre qualsiasi nu*ero di colonne ed anche invertirne l:ordine. Nell:ese* io successivo ciE viene di*ostrato er *ettere in luce le artizioni i@ critiche7
kelly@octarine ~> df -h | sort -rnk 5 | head 5-3 | \ awk '{ print "Partizione " $6 "\t: " $5 " piena!" }' Partizione /var : 86% piena! Partizione /usr : 85% piena! Partizione /home : 70% piena! kelly@octarine ~>

8a tabella sottostante o))re una anora*ica dei caratteri s eciali di )or*attazione7 Tabella >#1/ Caratteri di formattazione per ga$k Se(uen1a Ua Un Ut Significato Carattere ca* anello Carattere nuovalinea /abulazione

1 ici, segni del dollaro ed altri *etacaratteri dovrebbero essere resi con l:esca e di una barra inversa.

%.2.3. Il co)ando print e le espressioni regolari


Ca itolo &. Il linguaggio di rogra**azione 4N5 a>? %(

5na es ressione regolare si uE usare co*e *odello includendola tra barre. 6ssa viene controllata ris etto al testo intero di ogni record. 8a sintassi 3 co*e segue7
kelly is in ~> df -h | awk '/dev\/hd/ { print $6 "\t: " $5 }' / : 46% /boot : 10% /opt : 84% /usr : 97% /var : 73% /.vol1 : 8% kelly is in ~>

oi

4li a ici devono essere sotto esca e, oich hanno un signi)icato s eciale er il rogra**a in a-!. +i sotto un altro ese* io in cui cerchia*o nella directorG ;etc dei )ile che ter*inano er [.con)[ ed iniziano o con [a[ o con [A[, utilizzando le es ressioni regolari estese7
kelly is in /etc> ls -l | awk '/\<(a|x).*\.conf$/ { print $9 }' amd.conf antivir.conf xcdroast.conf xinetd.conf kelly is in /etc>

9uesto ese* io illustra il signi)icato s eciale del unto nelle es ressioni regolari7 il ri*o indica che voglia*o cercare qualsiasi carattere do o la ri*a stringa di ricerca, il secondo 3 sotto esca e erch )a arte di una stringa da ricercare Hla )ine del no*e del )ileI.

".2. . %odelli speciali


Per )ar recedere l:e*issione da co**enti, utilizzate l:istruzione B%GI?N
kelly is in /etc> ls -l | \ awk 'BEGIN { print "File trovati:\n" } /\<[a|x].*\.conf$/ { print $9 }' File trovati: amd.conf antivir.conf xcdroast.conf xinetd.conf kelly is in /etc>

8:istruzione %?@ si uE aggiungere er inserire del testo do o che l:intera i**issione H inputI dei dati 3 stata elaborata7
kelly is in /etc> ls -l | \ awk '/\<[a|x].*\.conf$/ { print $9 } END { print \ "Posso fare qualcosa ancora per lei, signora?" }' amd.conf antivir.conf xcdroast.conf xinetd.conf Posso fare qualcosa ancora per lei, signora? kelly is in /etc>

Ca itolo &. Il linguaggio di rogra**azione 4N5 a>? %1

%.2.$. 5li script in gaBC


Non a ena i co*andi tendono ad essere un o: i@ lunghi, otreste desiderare di *etterli in uno scri t, in *odo da riutilizzarli. 5no scri t a-! contiene istruzioni in a-! che de)iniscono *odelli ed azioni. Co*e illustrazione, realizzere*o un ra orto che *ostri le nostre artizioni i@ iene. 0. 2ezione &.2.2.
kelly is in ~> cat diskrep.awk BEGIN { print "*** ALLARME ALLARME ALLARME ***" } /\<[8|9][0-9]%/ { print "Partizione " $6 "\t: " $5 " piena!" } END { print "*** Sgancia soldi per nuovi dischi URGENTE! ***" } kelly is in ~> df -h | awk -f diskrep.awk *** ALLARME ALLARME ALLARME *** Partizione /usr : 97% piena! *** Sgancia soldi per nuovi dischi URGENTE! *** kelly is in ~>

Per ri*a cosa a-! sta* a un *essaggio iniziale, oi )or*atta tutte le linee che contengono un otto o un nove all:inizio di una arola, seguiti da un altro nu*ero e segno di ercentuale. 2i aggiunge un *essaggio )inale. % iden1ia1ione della sintassi 1>? 3 un linguaggio di rogra**azione. 8a sua sintassi 3 riconosciuta dalla *aggioranza degli editor che eseguono l:evidenziazione della sintassi er altri linguaggi, co*e C, -ash, B/=8, ecc...

%.3. Le variabili di gaBC


=entre a-! sta elaborando il )ile i**esso, usa diverse variabili. 1lcune sono *odi)icabili, altre a sola lettura.

%.3.1. Il separatore di ca)pi i))essi


Il eparatore di campi, che uE essere sia un singolo carattere sia un:es ressione regolare, controlla il *odo in cui a-! s ezzettata in ca* i un record i**esso. Il record i**esso viene scandito alla ricerca di sequenze di caratteri che corris ondano alla de)inizione del se aratore7 i ca* i stessi sono il testo tra le corris ondenze. Il se aratore di ca* i viene ra resentato nella variabile integrata FS. Notate che questa 3 un o: diversa dalla variabile IFS usata dalle shell aderenti a P,2IF. Il valore della variabile del se aratore di ca* i uE essere ca*biata nel rogra**a in a-! con Ca itolo &. Il linguaggio di rogra**azione 4N5 a>? %2

l:o eratore di assegnazione b. 2 esso il *o*ento giusto er )are ciE 3 all:inizio dell:esecuzione ri*a che qualsiasi i**issione sia stata elaborata, cosicch ro rio il ri*o record viene letto con il corretto se aratore. Per )are questo, usate il *odello s eciale B%GI?. Nell:ese* io sottostante, realizzia*o un co*ando che *ostri tutti gli utenti nel vostro siste*a con una descrizione7
kelly is in ~> awk 'BEGIN { FS=":" } { print $1 "\t" $5 }' /etc/passwd --output omitted-kelly Kelly Smith franky Franky B. eddy Eddy White willy William Black cathy Catherine the Great sandy Sandy Li Wong kelly is in ~>

In uno scri t a-!, otrebbe a arire co*e questo7


kelly is in ~> cat printnames.awk BEGIN { FS=":" } { print $1 "\t" $5 } kelly is in ~> awk -f printnames.awk /etc/passwd --output omitted--

2cegliete con attenzione il ca* o di i**issione er evitare roble*i. 5n ese* io er illustrare ciE7 cercate di avere un:i**issione in )or*a di linee che a aia si*ile a questa7 [2andG 8. Cong, &# hoo 2t., 1nt>er , 2(((F[ 2crivete una linea di co*ando o uno scri t che sta* i il no*e della ersona in quel record7 a-! &B%GI? M FSNL/L O M print A1/ AP/ AD O& inputfile =a una ersona otrebbe essere laureata e il record otrebbe essere scritto in questo *odo7 [2andG 8. Cong, Ph+, &# hoo 2t., 1nt>er , 2(((F[ Il vostro a-! )ornir! un:e*issione errata er questa linea. 2e necessario, usate un a-! o sed eAtra er uni)or*are i )or*ati di i**issione dei dati. Il se aratore dei ca* i in ingresso rede)inito 3 uno o i@ s azi bianchi o tabulazioni.

%.3.2. I separatori di e)issione


%.3.2.1. Il separatore dei ca)pi in e)issione
Nor*al*ente i ca* i sono se arati da s azi nell:e*issione. CiE diventa chiaro quando usate la sintassi corretta er il co*ando print, dove gli argo*enti vengono se arati da virgole7 Ca itolo &. Il linguaggio di rogra**azione 4N5 a>? %3

kelly@octarine ~/test> cat test record1 data1 record2 data2 kelly@octarine ~/test> awk '{ print $1 $2}' test record1data1 record2data2 kelly@octarine ~/test> awk '{ print $1, $2}' test record1 data1 record2 data2 kelly@octarine ~/test>

2e non *ettete le virgole, print tratter! le voci in uscita co*e un solo argo*ento, o*ettendo cosD l:uso del eparatore di emi ione rede)inito, OFS. 9ualsiasi stringa di caratteri uE essere utilizzata co*e se aratore di ca* i in e*issione i* ostando questa variabile integrata.

%.3.2.2. Il separatore dei record in uscita


8:e*issione di un a intera istruzione print 3 chia*ata record in u cita. ,gni co*ando print d! co*e risultato un solo record in uscita e e oi e*ette una stringa chia*ata eparatore dei record in u cita, ORS. Il valore rede)inito di questa variabile 3 [Un[, un carattere di nuovalinea. CosD ogni istruzione print roduce una linea se arata. Per *odi)icare il *odo in cui vengono se arati i ca* i ed i record in uscita, assegnate nuovi valori a OFS ed a ORS7
kelly@octarine ~/test> awk 'BEGIN { OFS=";" ; ORS="\n-->\n" } \ { print $1,$2}' test record1;data1 --> record2;data2 --> kelly@octarine ~/test>

2e il valore di ORS non contiene un nuovalinea, l:e*issione del rogra**a avviene tutta insie*e su una linea singola.

%.3.3. Il nu)ero di record


8:integrato NR contiene il nu*ero dei record che vengono elaborati. 0iene incre*entato do o la lettura di una nuova linea di i**issione. 8o otete utilizzare alla )ine er contare il nu*ero totale dei record,o ure in ciascun record di e*issione7
kelly@octarine ~/test> cat processed.awk BEGIN { OFS="-" ; ORS="\n--> fatto\n" } { print "Record numero " NR ":\t" $1,$2 } END { print "Numero di record elaborati: " NR }

Ca itolo &. Il linguaggio di rogra**azione 4N5 a>? %#

kelly@octarine ~/test> awk -f processed.awk test Record numero 1: record1-data1 --> fatto Record numero 2: record2-data2 --> fatto Numero di record elaborati: 2 --> fatto kelly@octarine ~/test>

%.3.#. 1ariabili de(inite dall7utente


1 arte le variabili integrate, otete de)inirne di ro rie. 9uando a-! incontra un ri)eri*ento ad una variabile che non esiste Hche non 3 redeter*inataI, viene creata la variabile ed inizializzata co*e stringa vuota. Per tutti i ri)eri*enti successivi, il valore della variabile 3 qualsiasi valore sia stato assegnato er ulti*o. 8e variabili ossono essere un valore nu*erico o stringa. Il contenuto dei )ile da i**ettere uE anche essere assegnato alle variabili. I valori ossono essere assegnati diretta*ente utilizzando l:o eratore b, o valore attuale della variabile in co*binazione con altri o eratori7
kelly@octarine ~> 20021009 20021013 20021015 20021020 20021112 20021123 20021204 20021215 cat entrate consulenze BigComp 2500 addestramento EduComp 2000 appdev SmartComp 10000 addestramento EduComp 5000

ure otete usare il

kelly@octarine ~> cat totale.awk { totale=totale + $5 } { print "Inviare conto per " $5 " dollari a " $4 } END { print "---------------------------------\nTotale entrate: " total } kelly@octarine ~> awk -f totale.awk test Inviare conto per 2500 dollari a BigComp Inviare conto per 2000 dollari a EduComp Inviare conto per 10000 dollari a SmartComp Inviare conto per 5000 dollari a EduComp --------------------------------Totale entrate: 19500 kelly@octarine ~>

2ono a**esse abbreviazioni ti o C co*e VAR*N valore.

%.3.$. 6lteriori ese)pi


8:ese* io della 2ezione $.3.2 diviene *olto i@ se* lice quando usia*o uno scri t a-!7
kelly@octarine ~/html> cat make-html-from-text.awk BEGIN { print "<html>\n<head><title>HTML generato da awk</title></head>\n<body bgcolor=\"#ffffff\">\{ print $0 } END { print "</pre>\n</body>\n</html>" }

6 ure il co*ando da eseguire 3 i@ i**ediato quando si utilizza a-! al osto di sed7


kelly@octarine ~/html> awk -f make-html-from-text.awk testfile > file.html

Ca itolo &. Il linguaggio di rogra**azione 4N5 a>? %$

%sempi di a-! nel ostro sistema .accia*o di nuovo ri)eri*ento alla directorG contenente gli initscri t nel vostro siste*a. Inserite un co*ando si*ile al seguente er vedere i@ ese* i ratici dell:uso ad a* io s ettro del co*ando a-!7 grep awk /etc/init.d/*

%.3.%. Il progra))a print(


Per un controllo *aggior*ente reciso sul )or*ato di e*issione ris etto a quello che nor*al*ente viene )ornito da print, utilizzate printf. Il co*ando printf uE essere usato er s eci)icare la lunghezza del ca* o da utilizzare er ciascuna voce cosD co*e varie scelte di )or*ato er i nu*eri Hco*e quale base di e*issione i* iegare, se sta* are un es onente, se sta* are un segno e quante ci)re sta* are do o la virgola deci*aleI. CiE si )a )ornendo una stringa, chia*ata tringa di formato, che controlla co*e e dove sta* are gli altri argo*enti. 8a sintassi 3 la stessa dell:istruzione printf del linguaggio C7 v. la vostra guida introduttiva del C. 8e agine in)o di ga-! contengono s iegazioni esaurienti.

%.#. 3o))ario
Il rogra**a di utilit! ga-! inter reta un linguaggio di rogra**azione dagli sco i s eciali, gestendo delle se* lici *ansioni di ri)or*attazione dei dati con a ena una *anciata di linee di codice. 6: la versione libera del generale co*ando a-! di 5NIF. 9uesto stru*ento legge linee di dati i**essi e uE riconoscere )acil*ente le e*issioni in colonna. Il rogra**a print 3 il i@ co*une er il )iltraggio e la ri)or*attazione di ca* i de)initi. 8a dichiarazione al volo di variabili 3 diretta e consente se* lici calcoli di so**e, statistiche ed altre o erazioni sul )lusso dei dati i**essi. 0ariabili e co*andi si ossono inserire negli scri t a-! er l:elaborazione di sotto)ondo Hbackground proce ingI. 1ltre cose che dovreste conoscere di a-!7 Il linguaggio resta ben conosciuto su 5NIF e si*ili, *a er l:esecuzione di co* iti si*ili ora si utilizza i@ )requente*ente Perl. /uttavia a-! ha una curva di a rendi*ento i@ accentuata Hsigni)ica che i* arate *olte cosa in un te* o iuttosto ristrettoI. In altri ter*ini, Perl 3 i@ di))icile da a rendere. 2ia Perl che a-! condividono la re utazione di essere inco* rensibili, anche er i reali autori dei rogra**i che usano tali linguaggi. PerciE docu*entate il vostro codiceV

Ca itolo &. Il linguaggio di rogra**azione 4N5 a>? %&

%.$. ;sercizi
9uesti sono alcuni ese* i ratici in cui a-! uE essere utile.

1.

Co*e ri*o esercizio i vostri dati in ingresso sono linee nella )or*a seguente7

Nomeutente:Nome:Cognome:Numero telefonico

'ealizzate uno scri t a-! che converta tali linee in un record 8+1P di questo )or*ato7
dn: uid=Nomeutente, dc=esempio, dc=com cn: Nome Cognome sn: Cognome numerotelefonico: Numero telefonico

Create un )ile contenente una co

ia di record di rova e controllate.

2. 'ealizzate uno scri t -ash, utilizzando a-! e i co*andi standard di 5NIF, che *ostri i rinci ali tre utenti dello s azio su disco nel )ilesGste* /home Hse non avete la directorG contenente le directorG ersonali su artizione se arata, create lo scri t er la artizione /7 questa 3 resente in ogni siste*a 5NIFI. Per ri*a cosa eseguite i co*andi da linea di co*ando. 9uindi inseriteli in uno scri t. 8o scri t dovrebbe creare un:e*issione sensata Hsensate er essere letta dal ca oI. 2e tutto si di*ostra )unzionante, )ate in *odo che lo scri t vi invii un *essaggio elettronico con i suoi risultati Hutilizzate, er ese* io, mail -s Uso spazio su disco <voi@vostro_comp> < risultatoI. 2e il de*one quota 3 in )unzione, usate tale in)or*azione, altri*enti usate find. 3. Create un :e*issione in stile F=8 da un elenco se arato da tabulazioni nella )or*a seguente7
Sta per una linea molto lunga con un sacco di descrizione sta per un'altra lunga linea un altro sta per prova sta per una linea pi lunga luuuuuuuuuuuuunga linea, ma proprio luuuuuuuuuuuuuuuuuuuunga

8:e*issione dovrebbe leggere7


<row> <entry>Sta per</entry> <entry> linea molto lunga </entry> </row> <row> <entry>sta per</entry> <entry> lunga linea </entry> </row> <row> <entry>un altro sta per</entry> <entry> linea pi lunga </entry> </row> <row> <entry>prova sta per</entry> <entry>luuuuuuuuuuuuunga linea, ma proprio luuuuuuuuuuuuuuuuuuuunga </entry> </row>

In aggiunta, se sa ete qualcosa di F=8, scrivere uno scri t -64IN e 6N+ er co* letare la tabella o ure )atelo in B/=8. Ca itolo &. Il linguaggio di rogra**azione 4N5 a>? %7

Capitolo '. Istruzioni condizionali


In questo ca itolo discutere*o dell:uso delle condizioni negli scri t -ash. CiE co* rende i seguenti argo*enti7 l:istruzione if l:uso dello stato di uscita di un co*ando il con)ronto e la veri)ica delle i**issioni e dei )ile i costrutti if;then;else i costrutti if;then;elif;else l:utilizzo e la rova dei ara*etri osizionali le istruzioni if annidate le es ressioni booleane l:uso delle istruzioni case

'.1. Introduzione a i(
'.1.1. In generale
1lle volte vi serve s eci)icare in uno scri t di shell diverse *odalit! d:azione da intra renderei n base al successo od al )alli*ento di un co*ando. Il costrutto if vi er*ette di s eci)icare tali condizioni. 8a sintassi i@ co* atta del co*ando if 37 if )GQ7?@I'T%ST$ then )GQ7?@I')G?S%GK%?TI$ fi 0iene eseguito l:elenco dei )GQ7?@I'T%ST e, se il suo stato di ritorno 3 zero, viene eseguito anche l:elenco dei )GQ7?@I')G?S%GK%?TI. 8o stato di rientro Hreturn tatu I 3 lo stato di uscita dell:ulti*o co*ando eseguito o zero, se nessuna delle condizioni testate 3 vera. )GQ7?@I'T%ST i* lica s esso test di con)ronti nu*erici o stringa, *a uE essere anche qualsiasi co*ando che restituisce uno stato zero quando ha successo e qualche altro stato quando )allisce. 2 esso si usano le es ressioni unarie er esa*inare lo stato di un )ile. 2e l:argo*ento FILE di una sola delle ri*itive 3 nella )or*a /dev/fd/N, allora viene veri)icato il descrittore di )ile [N[. 1nche stdin, stdout e stderr e i loro ris ettivi descrittori di )ile ossono essere utilizzati er controlli.

Ca itolo 7. Istruzioni condizionali

%"

'.1.1.1. ;spressioni usate con i(


8a tabella sottostante contiene una anora*ica delle cosiddette [ ri*itive[ che con)igurano il co*ando o la lista di co*andi )GQ7?@I'T%ST. 9ueste ri*itive sono *esse tra arentesi quadre er indicare la veri)ica di un:es ressione condizionale. Tabella ?#1/ % pre ioni primitive 6rimiti a [-a FILE] [-b FILE] [-c FILE] [-d FILE] [-e FILE] [-f FILE] [-g FILE] [-h FILE] [-k FILE] [-p FILE] [-r FILE] [-s FILE] [-t FD] [-u FILE] [-w FILE] [-x FILE] [-O FILE] [-G FILE] [-L FILE] [-N FILE] [-S FILE] [FILE1 -nt FILE2] [FILE1 -ot FILE2] [FILE1 -ef FILE2] [-o OPTIONNAME] [-z STRINGA] Significato 0ero se FILE esiste. 0ero se .I86 esiste ed 3 uno s eciale )ile a blocchi. 0ero se FILE esiste ed 3 uno s eciale )ile a caratteri. 0ero se FILE esiste ed 3 una directorG. 0ero se FILE esiste. 0ero se FILE esiste ed 3 un )ile regolare. 0ero se FILE esiste ed il suo bit 24I+ 3 attivo. 0ero se FILE esiste ed 3 un collega*ento si*bolico. 0ero se FILE esiste ed il suo bit stic?G 3 i* ostato. 0ero se FILE esiste ed 3 un incanala*ento no*inato, named pipe H.I.,I. 0ero se FILE esiste ed 3 leggibile. 0ero se FILE esiste ed ha una di*ensione *aggiore di zero. 0ero se il descrittore di )ile .+ 3 a erto e si ri)erisce ad un ter*inale. 0ero se FILE esiste ed il suo bit 25I+ H2et 5ser I+I 3 i* ostato. 0ero se FILE esiste ed 3 scrivibile. 0ero se FILE esiste ed 3 eseguibile. 0ero se FILE esiste ed 3 osseduto dall:attuale I+ di utente 0ero se FILE esiste ed 3 osseduto dall:attuale I+ di gru 0ero se FILE esiste ed 3 un collega*ento si*bolico 0ero se FILE esiste ed 3 stato *odi)icato dall:ulti*a lettura 0ero se FILE esiste ed 3 un soc?et 0ero se FILE1 3 stato *odi)icato i@ recente*ente di FILE2, o se FILE1 esiste e FILE2 no. 0ero se FILE1 3 i@ vecchio di FILE2, o FILE1 no. ure o

ure se FILE2 esiste e

0ero se FILE1 e FILE2 si ri)eriscono alla stessa unit! e nu*eri di inode. 0ero se 3 abilitata l:o zione di shell [,P/I,NN1=6[ 0ero se la lunghezza di [2/'IN41[ 3 zero. %%

Ca itolo 7. Istruzioni condizionali

[-n STRINGA] o [STRINGA] [STRINGA1 == STRINGA2] [STRINGA1 != STRINGA2] [STRINGA1 < STRINGA2] [STRINGA1 < STRINGA2]

ure

0ero se la lunghezza di [2/'IN41[ 3 diversa da zero. 0ero se le stringhe sono uguali. 2i uE usare [b[ al osto di [bb[ er stretta co* atibilit! con P,2IF. 0ero se le stringhe non sono uguali. 0ero se [2/'IN411[ viene ri*a di [2/'IN412[ in ordine al)abetico secondo i ara*etri locali. 0ero se [2/'IN411[ viene do o di [2/'IN412[ in ordine al)abetico secondo i ara*etri locali. [,P[ 3 uno tra -eq, -ne, -lt, -le, -gt o -ge. 9uesti o eratori binari arit*etici restituiscono vero se, ris ettiva*ente, [1'41[ 3 uguale a, diverso da, *inore di, *inore o uguale a, *aggiore di, ovvero *aggiore o uguale a [1'4[. [1'41[ e [1'42[ sono degli interi.

[ARG1 OP ARG2]

8e es ressioni si ossono co*binare utilizzando i seguenti o eratori, elencati in ordine decrescente di recedenza7 Tabella ?#./ Combinazioni di e pre ioni Gpera1ione JV6FP'K JH6FP'IK J6FP'1 <a 6FP'2K J6FP'1 <o 6FP'2K %ffetto 0ero se %R6F 3 )also 'estituisce il valore di %R6F. CiE uE essere usato er scavalcare la nor*ale recedenza degli o eratori. 0ero se %R6F1 ed %R6FP sono entra*bi veri. 0ero se o %R6F1 o %R6FP 3 vero.

8:integrata J Ho testI valuta le es ressioni condizionali usando un insie*e di regole basate sul nu*ero di argo*enti. =aggiori in)or*azioni su questa *ateria si ossono trovare nella docu*entazione di -ash. Pro rio co*e if viene chiuso con fi, la arentesi quadra a erta deve essere chiusa do o l:elencazione delle condizioni.

'.1.1.2. Co)andi successivi all7istruzione then


8:elenco )GQ7?@I')G?S%GK%?TI che segue l:istruzione then uE essere qualsiasi valido co*ando 5NIF, rogra**a eseguibile, scri t di shell eseguibile o istruzione di shell, ad eccezione del fi di chiusura. 6: i* ortante ricordare che then e fi sono considerati co*e istruzioni se arate nella shell. +:altra arte, quando vengono inseriti nella linea di co*ando, essi sono se arati da un unto e virgola. In uno scri t le diverse arti dell:istruzione if nor*al*ente sono ben distinte. +i seguito, un aio di se* lici ese* i.

Ca itolo 7. Istruzioni condizionali

1((

'.1.1.3. Controllo dei (ile


Il ri*o ese* io veri)ica l:esistenza di un )ile7
anny ~> cat msgcheck.sh #!/bin/bash echo "Questo script verifica l'esistenza del file messages." echo "Verifica..." if [ -f /var/log/messages ] then echo "/var/log/messages esiste." fi echo echo "...fatto." anny ~> ./msgcheck.sh Questo script verifica l'esistenza del file messages. Verifica... /var/log/messages esiste. ...fatto.

'.1.1.#. Controllo delle opzioni di shell


+a aggiungere tra i vostri )ile di con)igurazione di -ash7
# Queste linee stamper un messaggio se non stata impostata l'opzione noclobber: if [ -o noclobber ] then echo "I tuoi file sono protetti da sovrascritture accidentali usando la redirezione." fi

L&ambiente 8:ese* io so rastante )unzioner! quando inserito nella linea di co*ando7


anny ~> if [ -o noclobber ] ; then echo ; echo "I tuoi file sono protetti da sovrascritture" ; echo ; fi I tuoi file sono protetti da sovrascritture anny ~>

/uttavia, se utilizzate controlli delle condizioni che di endono dall:a*biente, otreste ottenere dei risultati di))erenti dando lo stesso co*ando in uno scri t, oich quest:ulti*o a rir! una nuova shell in cui le variabili e le o zioni attese otrebbero non essere state de)inite auto*atica*ente.

'.1.2. 3e)plici applicazioni di i(


'.1.2.1. 1eri(ica dello stato d7uscita
8a variabile ? contiene lo stato d:uscita del co*ando eseguito in recedenza Hil i@ recente*ente co* letato rocesso in ri*o iano HforegroundI. Ca itolo 7. Istruzioni condizionali 1(1

8:ese* io seguente *ostra una se* lice veri)ica7


anny ~> if [ $? -eq 0 ] More input> then echo 'Quello stato un be lavoro!' More input> fi Quello stato un be lavoro! anny ~>

8:ese* io successivo di*ostra che )GQ7?@I'T%ST otrebbe essere un qualsiasi co*ando 5NIF che restituisca uno stato d:uscita, e che if restituisce nuova*ente uno stato d:uscita ari a zero7
anny ~> if ! grep $USER /etc/passwd More input> then echo "Il tuo account di utente non gestito localmente"; fi Il tuo account di utente non gestito localmente anny > echo $? 0 anny >

8o stesso risultato si uE ottenere co*e segue7


anny > grep $USER /etc/passwd anny > if [ $? -ne 0 ] ; then echo "non un account locale" ; fi non un account locale anny >

'.1.2.2. Con(ronti nu)erici


4li ese* i sottostanti usano i con)ronti nu*erici7
anny > num=`wc -l lavoro.txt` anny > echo $num 201 anny > if [ "$num" -gt "150" ] Ancora immissione> then echo ; echo "per oggi hai lavorato sodo a sufficienza." Ancora immissione> echo ; fi per oggi hai lavorato sodo a sufficienza.

anny >

9uesto scri t viene eseguito da cron ogni do*enica. 2e il nu*ero di setti*ana 3 ari, vi ricorda di *ettere )uori il bidone della s azzatura7
#!/bin/bash # Calcola il numero della settimana usando il comando date: NUMSETTIMANA=$[ $(date +"%V") % 2 ] # Controlla se abbiamo un resto. Se non c', questa una settimana pari e perci # invia un messaggio. In caso contrario non fa nulla. if [ $NUMSETTIMANA -eq "0" ]; then echo "Domenica sera: metti fuori i bidoni della spazzatura." | mail -s "Bidoni spazzatura fuori" your@your_domain.fi

Ca itolo 7. Istruzioni condizionali

1(2

'.1.2.3. Con(ronti di stringhe


5n ese* io di con)ronto tra stringhe er rovare l:I+ utente7
if [ "$(whoami)" != 'root' ]; then echo "Non hai il permessso di avviare $0 in quanto utente non root." exit 1; fi

Con -ash, otete abbreviare questo ti o di costrutto. 8:equivalente co* atto della rova so rastante 3 co*e segue7
[ "$(whoami)" != 'root' ] && ( echo stai usando un account non privilegiato; exit 1 )

2i*ile all:es ressione [\\[ che indica cosa )are se la rova da er risultato vero, [XX[ s eci)ica cosa )are se la rova d! )also. 2i ossono usare anche le es ressioni condizionali nei con)ronti7
anny > genere="femminile" anny > if [[ "$genere" == f* ]] Ancora immissione > then echo "Piacere di conoscerla, Signora."; fi Piacere di conoscerla, Signora. anny >

Seri programmatori 8a *aggior arte dei rogra**atori re)erisce usare il co*ando integrato test, che equivale all:uso delle arentesi quadre er i con)ronti, co*e questo7
test "$(whoami)" != 'root' && (echo state usando account senza privilegi; exit 1)

?essuna uscita5 2e invocate e+it in una sottoshell, questa non asser! le variabili a quella genitrice. 5sate a e c al osto di HeI se non volete che -ash si divida in una sottoshell. 0edete le agine in)o di -ash er *aggiori in)or*azione sulle co* arazioni dei *odelli con i costrutti [HH62P'622I,N6II[ e [JJ62P'622I,N6KK.

'.2. 6so di i( piD avanzato


'.2.1. Costrutti i(?then?else
'.2.1.1. ;se)pio banale
9uesto 3 il costrutto da i* iegare er intra rendere una strada d:azione se i co*andi if danno vero, e un:altra se danno )also. 5n ese* io7
freddy scripts> genere="maschile" freddy scripts> if [[ "$genere" == "f*" ]]

Ca itolo 7. Istruzioni condizionali

1(3

Ancora immissione> then echo "Piacere di conoscerla, Signora." Ancora immissione> else echo "Come mai la signora non ha ancora da bere?" Ancora immissione> fi Come mai la signora non ha ancora da bere? freddy scripts>

"# contro ""## Contraria*ente a @, @@ i* edisce la divisione in arole dei valori di variabile. CosD, se 01'b[var con spazi[, non vi serve raddo iare gli a ici a $VAR in una rova O anche se l:uso degli a ici resta una buona abitudine. Inoltre [[ reviene l:es ansione dei no*i di ercorso, er cui le stringhe letterali con *etacaratteri non cercano di es andersi nei no*i dei )ile. 5sando [[, == e != inter retano le stringhe a destra co*e *odelli di glob di shell er con)rontarli ris etto al valore a sinistra, er ese* io7 [[ "valore" == val* ]]/ Co*e l:elenco )GQ7?@I')G?S%GK%?TI che segue l:istruzione then, l:elenco )GQ7?@I' )G?S%GK%?TI'7LT%F?7TISI che segue l:istruzione else uE contenere qualsiasi co*ando che restituisca uno stato d:uscita. 5n altro ese* io che a* lia quello della 2ezione 7.1.2.17
anny ~> su Password: [root@elegance root]# if ! grep ^$USER /etc/passwd 1> /dev/null > then echo "Il tuo account di utente non gestito localmente" > else echo "il tuo account gestito dal file locale /etc/passwd" > fi il tuo account gestito dal file locale /etc/passwd [root@elegance root]#

Passia*o all:account root er *ostrare l:e))etto dell:istruzione else < il vostro root di solito 3 un account locale *entre l:account di utente otrebbe essere gestito da un siste*a centrale, co*e un server 8+1P.

'.2.1.2. Controllo degli argo)enti a linea di co)ando


Invece di i* ostare una variabile e oi eseguire uno scri t, s esso 3 i@ elegante *ettere i valori delle variabili nella linea di co*ando. Per il nostro sco o utilizzia*o i ara*etri osizionali $1, $2, i, $N. $# )a ri)eri*ento al nu*ero degli argo*enti a linea di co*ando. $0 si ri)erisce al no*e dello scri t. 9uello seguente 3 un se* lice ese* io7

Ca itolo 7. Istruzioni condizionali

1(#

-igura ?#1/ Controllo di un argomento a linea di comando con if 6cco qui un altro ese* io che usa due argo*enti7
anny ~> cat peso.sh #!/bin/bash # Questo script stampa un messaggio sul vostro peso se glielo date in chili e l'altezza # in centimetri. peso="$1" altezza="$2" pesoideale=$[$altezza - 110] if [ $peso -le $pesoideale ] ; then echo "Dovreste mangiare un poco di grassi in pi." else echo "Dovreste mangiare un poco di frutta in pi." fi anny ~> bash -x peso.sh 55 169 + peso=55 + altezza=169 + pesoideale=59 + '[' 55 -le 59 ']' + echo 'dovreste mangiare un poco di grassi in pi.' Dovreste mangiare un poco di grassi in pi.

'.2.1.3. Controllo del nu)ero degli argo)enti


8:ese* io seguente *ostra co*e *odi)icare lo scri t recedente in *odo che sta* i un *essaggio se vengono )orniti i@ o *eno di due argo*enti7
anny ~> cat peso.sh #!/bin/bash # Questo script stampa un messagio sul vostro peso se glielo date in chili e l'altezza # in centimetri. if [ ! $# == 2 ]; then echo "Uso: $0 peso_in_kili altezza_in_centimetri"

Ca itolo 7. Istruzioni condizionali

1($

exit fi peso="$1" altezza="$2" pesoideale=$[$altezza 110] if [ $peso -le $pesoideale ] ; then echo "Dovreste mangiare un poco di grassi in pi." else echo "Dovreste mangiare un poco di frutta in pi." fi anny ~> peso.sh 70 150 Dovreste mangiare un poco di frutta in pi. anny ~> peso.sh 70 150 33 Uso: $0 peso_in_kili altezza_in_centimetri

Il ri*o argo*ento viene identi)icato co*e $1, il secondo co*e $2 e cosD via. Il nu*ero totale di argo*enti viene conservato in $#. 6sa*inate la 2ezione 7.2.$ er un *odo i@ elegante di sta* are *essaggi sull:utilizzo.

'.2.1.#. Controllare che un (ile esista


9uesto controllo viene svolto in *oltissi*i scri t oich 3 inutile avviare un sacco di rogra**i se sa ete che non )unzioneranno7
#!/bin/bash # Questo script fornisce informazioni su un file. NOMEFILE="$1" echo "Propriet di $NOMEFILE:" if [ -f $NOMEFILE ]; then echo "Dimensione: $(ls -lh $NOMEFILE | awk '{ print $5 }')" echo "Tipo: $(file $NOMEFILE | cut -d":" -f2 -)" echo "Numero di inode: $(ls -i $NOMEFILE | cut -d" " -f1 -)" echo "$(df -h $NOMEFILE | grep -v Montato | awk '{ print "Si",$1", \ in partizione",$6,"."}')" else echo "File inesistente." fi

,sservate che il )ile 3 stato ri)erito ad una variabile7 in questo caso 3 il ri*o argo*ento dello scri t. In alternativa, quando non si )orniscono argo*enti, le locazioni dei )ile vengono solita*ente conservate in variabili all:inizio di uno scri t ed al loro contenuto ci si ri)erisce usando le variabili. CosD, quando volete *odi)icare un no*e di un )ile in uno scri t, dovete )arlo una volta sola. ?omi di file con spa1i 8:ese* io so rastante )allir! se il valore di \1 uE essere esa*inato co*e a arole *ulti le. In tal caso il co*ando if va corretto o utilizzando i do i a ici attorno al no*e del )ile, o usando @@ il luogo di @.

Ca itolo 7. Istruzioni condizionali

1(&

'.2.2. I costrutti i(?then?else


'.2.2.1. In generale
9uesta 3 la )or*a co* leta dell:istruzione if7 if )GQ7?@I'6FGS7$ then )GQ7?@I')G?S%GK%?TI$ elif 7LTFI')GQ7?@I'6FGS7$ then 7LTFI')GQ7?@I')G?S%GK%?TI$ else )GQ7?@I')G?S%GK%?TI'7LT%F?7TISI$ fi 8:elenco dei )GQ7?@I'6FGS7 viene eseguito e, se lo stato di ritorno 3 zero, viene eseguita la lista dei )GQ7?@I')G?S%GK%?TI. 2e )GQ7?@I'6FGS7 restituisce uno stato diverso da zero, viene eseguita invece ogni lista elif e, se il suo stato di uscita 3 zero, va in esecuzione la lista 7LTFI')GQ7?@I')G?S%GK%?TI ed il co*ando 3 co* leto. 2e else 3 seguito da un elenco )GQ7?@I')G?S%GK%?TI'7LT%F?7TISI ed il co*ando )inale nell:ulti*a clausola if o elif ha uno stato di uscita diverso da zero, allora va in esecuzione )GQ7?@I')G?S%GK%?TI' 7LT%F?7TISI. 8o stato di ritorno 3 lo stato d:uscita dell:ulti*o co*ando eseguito o zero se non viene trovata vera nessuna condizione.

'.2.2.2. ;se)pio
9uesto 3 un ese* io che otete inserire nel vostro crontab er un:esecuzione quotidiana7
anny /etc/cron.daily> cat testdischi.sh #!/bin/bash # Questo script esegue una prova semplicissima per controllare lo spazio su disco. spazio=`df -h | awk '{print $5}' | grep % | grep -v Use | sort -n | tail -1 | cut -d "%" -f1 -` valoreallarme="80" if [ "$spazio" -ge "$valoreallarme" ]; then echo "Almeno uno dei dischi quasi pieno!" | mail -s "test quotidiano dischi" root else echo "Spazio disco normale" | mail -s "test quotidiano dischi" root fi

'.2.3. Istruzioni i( annidate

Ca itolo 7. Istruzioni condizionali

1(7

1ll:interno dell:istruzione if otete usare un:altra istruzione if. Potete usare tanti livelli di if annidati quanti siete in grado di gestire logica*ente. 9uesto 3 un ese* io veri)ica gli anni bisestili7
anny ~/testdir> cat provabisestili.sh #!/bin/bash # Questo script verificher se siamo o meno in un anno bisestile. anno=`date +%Y` if [ $[$anno % 400] -eq "0" ]; then echo "Questo un anno bisestile. Febbraio ha 29 giorni." elif [ $[$anno % 4] -eq 0 ]; then if [ $[$anno % 100] -ne 0 ]; then echo "Questo un anno bisestile. Febbraio ha 29 giorni." else echo "Questo non un anno bisestile. Febbraio ha 28 giorni." fi else echo "Questo non un anno bisestile. Febbraio ha 28 giorni." fi anny ~/testdir> date Tue Jan 14 20:37:55 CET 2003 anny ~/testdir> provabisestile.sh Questo non un anno bisestile.

'.2.#. .perazioni booleane


8o scri t so ra uE essere abbreviato utilizzando gli o eratori booleani [1N+[ HffI e [,'[ HXXI.

-igura ?#./ % empio dell"u o degli operatori booleani Noi utilizzia*o le arentesi do ie er rovare un:es ressione arit*etica Hv. 2ezione 3.#.&I. CiE equivale alla istruzione let. 9ui )inirete nei guai utilizzando delle arentesi quadre se tenterete qualcosa co*e A"Aanno T 2UU# erch in questo caso le arentesi quadre non ra resentano un vero co*ando di er se stesse. .ra gli altri editor, g im 3 uno di quelli che su ortano gli sche*i di colore a seconda del )or*ato del )ile7 tali editor sono utili er sco rire errori nel vostro codice.

Ca itolo 7. Istruzioni condizionali

1("

'.2.$. 6so dell7istruzione eEit e i(


1bbia*o gi! incontrato breve*ente l:istruzione e+it nella 2ezione 7.2.1.3. 6sso ter*ina l:esecuzione dell:intero scri t ed 3 usato *olto s esso se 3 scorretta l:i**issione di dati da arte dell:utente, se un:istruzione non )unziona con successo o ure se ca ita qualche altro errore. 8:istruzione e+it accetta un argo*ento o zionale. 9uesto argo*ento 3 il codice in nu*ero intero del lo stato di uscita, che viene restituito al [genitore[ e conservato nella variabile $?. 5n argo*ento zero signi)ica che lo scri t ha )unzionato con successo. 9ualsiasi altro valore uE essere usato dai rogra**atori er restituire *essaggi di))erenti al rocesso [genitore[, in *odo che ossono essere intra rese azioni diverse in base al )alli*ento o al successo del rocesso [)iglio[. 2e non viene dato alcun argo*ento al co*ando e+it, la shell genitrice utilizza il valore corrente della variabile $?. +i seguito c:3 un ese* io con lo scri t pinguino.sh legger*ente adattato, che restituisce il suo codice di uscita al genitore cibo.sh7
anny ~/testdir> cat pinguino.sh #!/bin/bash # Questo script ti lascia presentare diversi menu a Tux. Lui sar felice solo # quando gli sar dato pesce. Abbiamo aggiunto anche un delfino e (presumibilmente) # un cammello. if [ "$menu" == "pesce" ]; then if [ "$animale" == "pinguino" ]; then echo "Hmmmmmm pesce... Tux felice!" elif [ "$animale" == "delfino" ]; then echo "Pweetpeettreetppeterdepweet!" else echo "*prrrrrrrt*" fi else if [ "$animale" == "pinguino" ]; then echo "A Tux non piace quello. Tux vuole pesce!" exit 1 elif [ "$animale" == "delfino" ]; then echo "Pweepwishpeeterdepweet!" exit 2 else echo "Leggerai questo segno?!" exit 3 fi fi

9uesto scri t 3 richia*ato nel rossi*o, che d:altra arte es orta le sue variabili menu e animale7
anny ~/testdir> cat cibo.sh #!/bin/bash # Questo script agisce in base allo stato di uscita dato da pinguino.sh export menu="$1" export animale="$2" cibo="/nethome/anny/testdir/pinguino.sh" $cibo $menu $animal case $? in 1)

Ca itolo 7. Istruzioni condizionali

1(%

echo "Guardia: Meglio che tu dia loro un pesce, altrimenti diventano violenti..." ;; 2) echo "Guardia: E' a causa della gente come te che lasciano la terra tutto il tempo..." ;; 3) echo "Guardia: Compra il cibo che lo Zoo fornisce agli animali, tu ***, come pensi che sopravvivano??" ;; *) echo "Guardia: Non scordare la guida!" ;; esac anny ~/testdir> ./cibo.sh mela pinguino A Tux non piace quello. Tux vuole pesce! Guardia: Meglio che tu dia loro un pesce, altrimenti diventano violenti...

Co*e otete vedere, i codici di stato d:uscita ossono essere scelti libera*ente. +i solito i co*andi esistenti hanno una serie di codici deter*inati7 guardate il *anuale del rogra**atore di ciascun co*ando er *aggiori in)or*azioni.

'.3. 6so delle istruzioni case


'.3.1. Condizioni se)pli(icate
8e istruzioni if annidate otrebbero essere belle, *a non a ena avete a che )are con una co ia di ossibili diverse azioni da intra rendere, esse tendono a con)ondere. Per le condizioni i@ co* lesse, utilizzate la sintassi di case7 case ESPRESSIONE in CASE1: LIST7')GQ7?@I$$ )7S%P: LIST7')GQ7?@I$$ ... CASEN: LIST7')GQ7?@I$$ esac ,gni case 3 un:es ressione che corris onde ad un *odello. I co*andi in LIST7')GQ7?@I er la ri*a coincidenza vengono eseguiti. 2i usa il si*bolo [X[ er se arare *olte lici *odelli e l:o eratore [I[ ter*ina un elenco di *odelli Hpattern li tI. Ciascun case e i suoi relativi co*andi vengono de)initi clau ola Hclau eI. ,gni clausola va ter*inata con [NN[. /utte le istruzioni case ter*inano con l:istruzione esac. Nell:ese* io di*ostria*o l:uso dei case er inviare un *essaggio di avverti*ento i@ selettivo con lo scri t disktest.sh7
anny ~/testdir> cat disktest.sh #!/bin/bash # Questo script effettua un test molto semplice per verificare lo spazio su disco. spazio=`df -h | awk '{print $5}' | grep % | grep -v Use | sort -n | tail -1 | cut -d "%" -f1 -` case $spazio in [1-6]*) Messaggio="Tutto tranquillo." ;; [7-8]*) Messaggio="Inizia a pensare di cancellare qualcosa. C' una partizione piena per $spazio %." ;; 9[1-8])

Ca itolo 7. Istruzioni condizionali

11(

Messaggio="Meglio sbrigarsi con quel nuovo disco... Una partizione piena al $spazio %." ;; 99) Messaggio="Qui mi sommergono! C' una partizione a $spazio %!" ;; *) Messaggio="Mi sembra di funzionare con una quantit inesistente di spazio su disco..." ;; esac echo $Messaggio | mail -s "rapporto dischi `date`" anny anny ~/testdir> You have new mail. anny ~/testdir> tail -16 /var/spool/mail/anny From anny@octarine Tue Jan 14 22:10:47 2003 Return-Path: <anny@octarine> Received: from octarine (localhost [127.0.0.1]) by octarine (8.12.5/8.12.5) with ESMTP id h0ELAlBG020414 for <anny@octarine>; Tue, 14 Jan 2003 22:10:47 +0100 Received: (from anny@localhost) by octarine (8.12.5/8.12.5/Submit) id h0ELAltn020413 for anny; Tue, 14 Jan 2003 22:10:47 +0100 Date: Tue, 14 Jan 2003 22:10:47 +0100 From: Anny <anny@octarine> Message-Id: <200301142110.h0ELAltn020413@octarine> To: anny@octarine Subject: disk report Tue Jan 14 22:10:47 CET 2003 Inizia a pensare di cancellare qualcosa. C' una partizione piena per 87 %. anny ~/testdir>

Natural*ente dovreste a rire il vostro rogra**a di osta er veri)icare i risultati7 questo 3 solo er di*ostrare che lo scri t invia un decente *essaggio elettronico con linee di intestazione [17[, [,ggetto7[ e [+a7[. =olti altri ese* i dell:uso delle istruzioni case si ossono trovare nella directorG di scri t init del vostro siste*a. 4li scri t di avvio usano i casi start e stop er )ar artire o )er*are i rocessi del siste*a. 5n ese* io teorico si uE trovare nella rossi*a sezione.

'.3.2. ;se)pio di initscript


4li initscri t Ho cript di inizializzazioneI s esso )anno uso delle istruzioni case er avviare, )er*are ed interrogare servizi di siste*a. 9uesto 3 un estratto dello scri t che avvia 1nacron, un de*one che attiva co*andi eriodica*ente con una )requenza s eci)icata in giorni.
case "$1" in start) start ;; stop) stop ;; status) status anacron ;; restart)

Ca itolo 7. Istruzioni condizionali

111

stop start ;; condrestart) if test "x`pidof anacron`" != x; then stop start fi ;; *) echo $"Uso: $0 {start|stop|restart|condrestart|status}" exit 1 esac

I co* iti da eseguire in ciascun caso, co*e )er*are ed attivare il de*one, sono de)initi nelle )unzioni, che traggono arzial*ente origine dal )ile /etc/rc.d/init.d/functions. 0. il Ca itolo 11 er *aggiori s iegazioni.

'.#. 3o))ario
In questo ca itolo abbia*o i* arato co*e realizzare delle condizioni nei nostri scri t in *odo che di))erenti azioni ossano essere intra rese in base al successo o al )alli*ento di un co*ando. 8e azioni si ossono deter*inare *ediante l:uso dell:istruzione if. CiE vi consente di eseguire con)ronti arit*etici e testuali, e di veri)icare codici d:uscita, i**issioni e )ile necessari agli scri t. 5n se* lice test if;then;fi s esso recede dei co*andi in uno scri t di shell er revenire la generazione di e*issioni, in *odo lo scri t uE essere avviato sullo s)ondo H backgroundI o attraverso il rogra**a di utilit! cron. +e)inizioni i@ co* lesse delle condizioni vengono di solito inserite in una istruzione case.

'.$. ;sercizi
9ui ci sono alcune idee er )arvi iniziare ad usare if negli scri t7 1. 5sate un costrutto if;then;elif;else che sta* i le in)or*azioni sul *ese corrente. 8o scri t dovrebbe sta* are il nu*ero di giorni in questo *ese e )ornire in)or*azioni sugli anni bisestili se il *ese attuale 3 )ebbraio. 2. .ate lo stesso, usando un:istruzione case e un utilizzo alternativo del co*ando date. 3. =odi)icate /etc/profile in *odo da ottenere un *essaggio s eciale di saluto quando vi connettete al siste*a co*e root. #. =odi)icate lo scri t provabisestile.sh della 2ezione 7.2.# in *odo che richieda un unico argo*ento, l:anno. 0eri)icate che venga )ornito esatta*ente un solo argo*ento. $. 2crivete uno scri t chia*ato qualedemone.sh che controlli se i de*oni httpd e init stanno girando nel vostro siste*a. 2e sta )unzionando httpd, lo scri t dovrebbe sta* are un Ca itolo 7. Istruzioni condizionali 112

*essaggio co*e7 [9uesta *acchina sta )acendo girare un server >eb[. 5sate ps controllare i rocessi.

er

&. 2crivete uno scri t che esegua una co ia di sicurezza della vostra directorG ersonale in una *acchina re*ota usando scp. 8o scri t dovrebbe )are ra orto in un )ile di registro, er ese* io ~/log/homebackup.log. 2e non avete una seconda *acchina a cui inviare la co ia, usate scp er rovare a co iare in localhost. CiE richiede chiavi 22B tra i due host, o ure che dobbiate )ornire una ass>ord. 8a creazione di chiavi 22B 3 s iegata in man shh-keygen. 7. 1dattate lo scri t del ri*o ese* io in 2ezione 7.3.1 er includere i casi di uso dello s azio su disco al %(d esatto e *inore del 1(d. 8o scri t dovrebbe usare tar cf er la creazione della co ia di riserva e g1ip o b1ipP er co* ri*ere il )ile .tar. =ettete tutti i no*i di )ile in variabili. =ettete i no*i del server re*oto e della directorG re*ota in variabili. CiE vi se* li)icher! il riutilizzo dello scri t o l:e))ettuazione di *odi)iche su di esso nel )uturo. 8o scri t dovrebbe controllare l:esistenza di un archivio co* resso. 2e esiste, er ri*a cosa ri*uovetelo onde evitare la roduzione di dati in uscita. 8o scri t dovrebbe ure veri)icare lo s azio dis onibile su disco. /enete in *ente che in qualsiasi *o*ento otreste avere i dati nella vostra directorG ersonale, i dati nel )ile .tar e i dati nell:archivio co* resso tutti insie*e nel vostro disco. 2e non ci )osse abbastanza s azio su disco, uscite con un *essaggio d:errore nel )ile di registro. 8o scri t dovrebbe ri ulire l:archivio co* resso ri*a di uscire.

Ca itolo 7. Istruzioni condizionali

113

Capitolo *. &edigere script interattivi


In questo ca itolo trattere*o di co*e interagire con gli utenti dei nostri scri t7 2ta* ando *essaggi co* rensibili e s iegazioni Intercettando le i**issioni degli utenti =ostrando l:invito er le i**issioni degli utenti 5sando i descrittori dei )ile er leggere da e scrivere in *olte lici )ile

*.1. Presentare dei )essaggi per gli utenti


*.1.1. Interattivi o )eno?
1lcuni scri t )unzionano del tutto senza nessuna interazione con l:utente. I vantaggi degli scri t non interattivi co* rendono7 8o scri t )unziona ogni volta in *odo revedibile. 8o scri t uE essere )atto girare in sotto)ondo. =olti scri t, co*unque, richiedono un:i**issione di dati da arte dell:utente o ure di e*ettere dei dati in uscita all:utente *entre stanno )unzionando. I vantaggi degli scri t interattivi sono, tra le altre cose7 2i ossono realizzare scri t i@ )lessibili. 4li utenti ossono ersonalizzare lo scri t *entre sta girando o )arlo co* ortare in *odi diversi. 8o scri t uE ri ortare il suo avanza*ento *entre sta )unzionando. 9uando si scrivono gli scri t interattivi, non bisogna lesinare nei co**enti. 5no scri t che sta* i dei *essaggi a ro riati 3 *olto i@ a*ichevole e uE essere corretto dagli errori in *odo i@ se* lice. 5no scri t otrebbe svolgere un lavoro corretto, *a riceverete un sacco intero di chia*ate er su orto se non in)or*erete l:utente su cosa esso stia )acendo. PerciE inserite *essaggi che dicano all:utente di attendere un:e*issione erch 3 in corso un calcolo. 2e ossibile, rovate a )ornire un:indicazione di quanto a lungo dovr! attendere. 2e l:attesa richieder! regolar*ente un te* o lungo durante l:esecuzione di un certo co* ito, otreste rendere in considerazione di integrare alcune indicazioni sull:elaborazione nei dati in uscita del vostro scri t. 9uando si resenta un invito all:utente er un:i**issione, sarebbe *eglio )ornire in)or*azioni in i@, iuttosto che in *eno, sul genere di dati da inserire. CiE si ri)erisce ure alla veri)ica degli argo*enti e al relativo *essaggio sull:uso. -ash ossiede i co*andi echo e printf er sotto orre dei co**enti agli utenti, e, sebbene voi dovreste essere gi! in con)idenza al*eno con l:uso di echo gi! adesso, non trattere*o ancora alcuni Ca itolo ". 'edigere scri t interattivi 11#

ese* i nelle rossi*e sezioni.

*.1.2. 6so del co)ando integrato echo


Il co*ando integrato echo e*ette i suoi argo*enti, se arati da s azi e ter*inati con un carattere di nuovalinea. 8o stato di ritorno 3 se* re zero. echo accetta una co ia di o zioni7 -e7 inter reta i caratteri di esca e con la barra inversa. -n7 so ri*e i nuovalinea in *ezzo al testo.

Co*e ese* io di aggiunta di co**enti, *igliorere*o un o: i rogra**i cibo.sh e inguino.sh della 2ezione 7.2.1.27
michel ~/test> cat pinguino.sh #!/bin/bash # Lo script vi lascia presentare menu differenti a Tux. Lui sar felice solo quando # gli sar dato un pesce. Per renderlo pi divertente, abbiamo aggiunto in pi una coppia # di animali. if [ "$menu" == "pesce" ]; then if [ "$animale" == "pinguino" ]; then echo -e "Hmmmmmm pesce... Tux felice!\n" elif [ "$animale" == "delfino" ]; then echo -e "\a\a\aPweetpeettreetppeterdepweet!\a\a\a\n" else echo -e "*prrrrrrrt*\n" fi else if [ "$animale" == "pinguino" ]; then echo -e "A Tux non piace quello. Tux vuole pesce!\n" exit 1 elif [ "$animale" == "delfino" ]; then echo -e "\a\a\a\a\a\aPweepwishpeeterdepweet!\a\a\a" exit 2 else echo -e "Sai leggere il segnale?! Non dare da mangiare al "$animale"!\n" exit 3 fi fi michel ~/test> cat cibo.sh #!/bin/bash # Lo script agisce in base allo stato di uscita dato da pinguino.sh if [ "$#" != "2" ]; then echo -e "Uso dello script cibo:\t$0 cibonelmenu animale-nome\n" exit 1 else export menu="$1" export animale="$2" echo -e "Nutriamo con $menu il $animale...\n" cibo="/nethome/anny/testdir/pinguino.sh" $cibo $menu $animale risultato="$?" echo -e "Pasto eseguito.\n"

Ca itolo ". 'edigere scri t interattivi

11$

case "$risultato" in 1) echo -e "Guardia: violenti...\"\n" ;; 2) echo -e "Guardia: ;; 3) echo -e "Guardia: echo -e "Guardia: ;; *) echo -e "Guardia: ;; esac fi echo "Uscendo..." echo -e "\a\a\aGrazie per la visita allo Zoo, speriamo di vedervi presto di nuovo!\n" michel ~/test> cibo.sh mela cammello Nutrire con una mela un cammello... Sai leggere il segnale?! Non dare da mangiare al cammello! Pasto eseguito. Guardia: "Compra il cibo che fornisce lo Zoo all'entrata. Tu ***"" Guardia: "Vuoi avvelenarli sul serio?" Uscendo... Grazie per la visita allo Zoo, speriamo di vedervi presto di nuovo! michel ~/test> cibo.sh mela Uso dello script cibo: ./cibo.sh cibo-in-menu nome-animale \"Sarebbe meglio dare loro un pesce, altrimenti diventano

\"Nessuna meraviglia se abbandonano il nostro pianeta...\"\n"

\"Compra il cibo che fornisce lo Zoo all'entrata. Tu ***\"\n" \"Vuoi avvelenarli sul serio?\"\n"

\"Non scordare la guida!\"\n"

2i uE trovare di i@ sui caratteri esca e nella 2ezione 3.3.2. 8a tabella seguente o))re una anora*ica delle sequenze riconosciute dal co*ando echo7 Tabella 8-1. Sequenze di escape utilizzate dal comando echo Se(uen1a
\a \b \c \e \ \n \r \t \! \\ \0""" Significato

1llar*e Hca* anelloI. 2 azio indietro o back pace/ 2o ri*e i nuovalinea in *ezzo al testo 6sca e. .or* )eed Nuovalinea 'itorno carrello o C' HCarriage 9eturnI. /abulazione orizzontale /abulazione verticale -arre inverse Il carattere a otto bit il cui valore 3 il valore ottale NNN Hda zero a tre ci)re ottaliI. 11&

Ca itolo ". 'edigere scri t interattivi

\""" \#$$

Il carattere a otto bit il cui valore 3 il valore ottale NNN Hda una a tre ci)re ottaliI. Il carattere a otto bit il cui valore 3 il valore esadeci*ale Huna o due ci)re esadeci*aliI

Per *aggiori in)or*azioni sul co*ando printf ed il *odo in cui vi consente di )or*attare le e*issioni, v. le agine in)o di -ash. /enete in *ente che otrebbero esserci delle di))erenze tra le diverse versioni di -ash.

*.2. Cattura dell7i))issione dell7utente


*.2.1. 6so del co)ando integrato read
Il co*ando integrato read 3 la contro artita dei co*andi echo e printf. 8a sintassi del co*ando read 3 la seguente7 read [opzioni] NOME1 NOME2 ... NOMEN 5na sola linea viene letta dall:i**issione standard H tandard inputI o dal descrittore del )ile )orniti co*e argo*ento all:o zione -u. 8a ri*a arola della linea viene assegnata al ri*o no*e, NOME1, la seconda arola al secondo no*e e cosD via, con le arole restanti e i loro relativi se aratori assegnati all:ulti*o no*e, NOMEN. 2e ci sono *eno arole da leggere nel )lusso d:ingresso ris etto ai no*i, ai no*i restanti si assegnano dei valori vuoti. I caratteri nel valore della variabile IFS vengono utilizzati er dividere la linea i**essa in arole o )ra**enti HtokenI7 v. 2ezione 3.#.". Il carattere barra inversa uE essere utilizzato er ri*uovere qualsiasi signi)icato s eciale al successivo carattere da leggere e er la rosecuzione della linea. 2e non vengono )orniti no*i, la linea da leggere viene assegnata alla variabile REPLY. Il codice di ritorno del co*ando read 3 zero, a *eno che non sia stato incontrato un carattere di )ine<)ile H6,. o end#of#fileI se read 3 andato )uori te* o Htime outI o se 3 stato )ornito un descrittore dei )ile invalido co*e argo*ento dell:o zione -u. 8:integrato di -ash read su orta le seguenti o zioni7

Tabella A#./ &pzioni dell"integrato read Gp1ione -a ANAME Significato 2i assegnano le arole a indici sequenziali della variabile *atriciale ANAME, iniziante er (. /utti gli ele*enti vengono ri*ossi da ANAME ri*a dell:assegnazione. 1ltri argo*enti NAME vengono ignorati. Il ri*o carattere di +68I= viene usato er ter*inare la linea i**essa, al osto di nuovalinea. readline viene usato er ottenere la linea 117

-d DELIM -e

Ca itolo ". 'edigere scri t interattivi

-n NCHARS

read ritorna do o la lettura dei caratteri NCHARS iuttosto di attendere l:intera linea di i**issione. =ostra PROMPT senza nuovalinea in *ezzo ri*a di tentare di leggere qualsiasi i**issione. 8:invito HpromptI viene *ostrato solo se l:i**issione roviene da un ter*inale. 2e viene data questa o zione, la barra inversa non si co* orta co*e carattere di esca e. 8a barra inversa viene considerata a artenente alla linea. In articolare, una co ia barra inversa<nuovalinea otrebbe non essere utilizzata co*e rosecuzione di linea. =odalit! silenziosa. 2e l:i**issione roviene da un ter*inale, i caratteri non vengono ri ortati con echo. +eter*ina read ad andare )uori te* o *assi*o e a restituire un )alli*ento se non 3 stata letta una linea intera entro i secondi di TIMEOUT. /ale o zione non ha e))etti se read non sta leggendo i**issioni da ter*inale o da un incanala*ento HpipeI. 8egge i**issioni dal descrittore di )ile FD.

-p PROMPT

-r

-s

-t TIMEOUT

-u FD

9uesto 3 un chiaro ese* io che *igliora lo scri t provabisestile.sh del recedente ca itolo7
michel ~/test> cat leaptest.sh #!/bin/bash # Questo script verificher se avete dato un anno bisestile o meno. echo "Batti l'anno che desideri controllare (4 cifre), seguito da [INVIO]:" read anno if (( ("$anno" % 400) == "0" )) || (( ("$anno" % 4 == "0") && ("$anno" % 100 != "0") )); then echo "$anno un anno bisestile." else echo "Tquesto non un anno bisestile." fi michel ~/test> provabisestile.sh Batti l'anno che desideri controllare (4 cifre), seguito da [INVIO]: 2000 2000 un anno bisestile.

*.2.2. &ichieste di i))issione dati dagli utenti


8:ese* io seguente *ostra co*e otete usare gli inviti HpromptI er s iegare ciE che l:utente dovrebbe inserire.
michel ~/test> cat amici.sh #!/bin/bash # Questo un programma che conserva aggiornata la vostra rubrica degli indirizzi. amici="/var/tmp/michel/amici" echo "Ciao, "$USER". Questo script ti registrer nel database degli amici di Michel." echo -n "Inserisci il tuo nome e premi [INVIO]: " read nome echo -n "Inserisci il tuo genere (maschio/femmina) e premi [ENTER]: "

Ca itolo ". 'edigere scri t interattivi

11"

read -n 1 genere echo grep -i "$nome" "$amici" if [ $? == 0 ]; then echo "Sei gi registrato, chiusura in corso." exit 1 elif [ "$genere" == "m" ]; then echo "Sei stato aggiunto alla lista degli amici di Michel." exit 1 else echo -n "Quanti anni hai? " read anni if [ $anni -lt 25 ]; then echo -n "Di che colore sono i tuoi capelli? " read colore echo "$nome $anni $colore" >> "$amici" echo "Sei stato aggiunto alla lista degli amici di Michel. Tante grazie!" else echo "Sei stato aggiunto alla lista degli amici di Michel." exit 1 fi fi michel ~/test> cp amici.sh /var/tmp; cd /var/tmp michel ~/test> touch amici; chmod a+w amici michel ~/test> amici.sh Ciao, michel. Questo script ti registrer nel database degli amici di Michel. Inserisci il tuo nome e premi [INVIO]:michel Inserisci il tuo genere (maschio/femmina) e premi [ENTER]: :m Sei stato aggiunto alla lista degli amici di Michel. michel ~/test> cat amici

Notate che qui non 3 stato o*esso alcun risultato. 8o scri t conserva solo le in)or*azioni che interessano a =ichel, *a vi dir! se* re che siete stati aggiunti alla lista, a *eno che non ci siate gi!. ,ra altre ersone ossono eseguire lo scri t7
[anny@octarine tmp]$ amici.sh Ciao, anny. Questo script ti registrer nel database degli amici di Michel. Inserisci il tuo nome e premi [INVIO]:anny Inserisci il tuo genere (maschio/femmina) e premi [ENTER]: :f Quanti anni hai? 22 Di che colore sono i tuoi capelli? nero Sei stato aggiunto alla lista degli amici di Michel.

+o o un o: la lista amici inizier! ad a arire co*e questa7


tille 24 black anny 22 black katya 22 blonde maria 21 black --output omitted--

Natural*ente tale situazione non 3 ideale dal *o*ento che chiunque uE *odi)icare H*a non cancellareI i )ile di =ichel. Potete risolvere questo roble*a utilizzando delle s eciali *odalit! di accesso al )ile dello scri t Hv. SKI@ e SGI@ nella guida [Introduzione a 8inuA[I.

Ca itolo ". 'edigere scri t interattivi

11%

*.2.3. &edirezione e descrittori dei (ile


*.2.3.1. In generale
Co*e sa ete dall:utilizzo ele*entare della shell, l:i**issione e l:e*issione di un co*ando uE essere rediretta ri*a che sia eseguito i* iegando una notazione s eciale O gli o eratori di redirezione O inter retata dalla shell. 8a redirezione uE essere usata anche er a rire e chiudere )ile del a*biente di esecuzione della shell corrente. 8a redirezione uE ure ca itare in uno scri t, in *odo che quest:ulti*o uE ricevere i**issioni da arte di un )ile, er ese* io, o ure indirizzare le e*issioni verso un )ile. In seguito l:utente uE rivedere il )ile di e*issione o uE usarlo co*e i**issione er un altro scri t. 8e i**issioni HinputI ed e*issioni HoutputI di )ile si ottengono grazie a dei gestori di interi che tracciano tutti i )ile a erti di un dato rocesso. 9uesti valori nu*erici sono conosciuti co*e descrittori di )ile Hfile de criptor I. I descrittori di )ile *eglio conosciuti sono tdin, tdout e tderr, ris ettiva*ente con i nu*eri di descrittori di )ile (, 1 e 2. 8:e*issione qui sotto *ostra co*e i descrittori di )ile riservati untino alle reali eri)eriche7
michel ~> ls lrwxrwxrwx 1 lrwxrwxrwx 1 lrwxrwxrwx 1 michel ~> ls lrwx------ 1 lrwx------ 1 lrwx------ 1 -l /dev/std* root root 17 Oct 2 07:46 /dev/stderr -> ../proc/self/fd/2 root root 17 Oct 2 07:46 /dev/stdin -> ../proc/self/fd/0 root root 17 Oct 2 07:46 /dev/stdout -> ../proc/self/fd/1 -l /proc/self/fd/[0-2] michel michel 64 Jan 23 12:11 /proc/self/fd/0 -> /dev/pts/6 michel michel 64 Jan 23 12:11 /proc/self/fd/1 -> /dev/pts/6 michel michel 64 Jan 23 12:11 /proc/self/fd/2 -> /dev/pts/6

Notate che ciascun rocesso ha la ro ria visione dei )ile sotto /proc/self, che in realt! 3 un collega*ento si*bolico a /proc/<ID_processo>. 0i otrebbe tornare interessante rovare info Q7V%@%S e info proc er *aggiori in)or*azioni sulle sottodirectorG /proc ed il *odo in cui il vostro siste*a gestisce i descrittori di )ile standard er ciascun rocesso in )unzione. 9uando si esegue un dato co*ando, vengono ercorse le seguenti )asi, nell:ordine7 2e l:e*issione standard H tandard outputI di un recedente co*ando 3 stata incanalata nell:i**issione standard H tandard inputI del co*ando corrente, allora /proc/<ID_processo_corrente>/fd/0 viene aggiornato er diretto verso lo stesso incanala*ento anoni*o co*e /proc/<ID_processo_precedente>/fd/1. 2e l:e*issione standard del co*ando corrente viene incanalata verso l:i**issione standard del co*ando successivo, allora /proc/<ID_processo_corrente>/fd/1 viene aggiornato er essere destinato ad un altro incanala*ento anoni*o. 8a redirezione del co*ando corrente viene elaborata da sinistra a destra. 8a redirezione [NTf=[ o [Nef=[ do o un co*ando ha l:e))etto di creare o aggiornare il collega*ento si*bolico /proc/self/fd/N con la stessa destinazione del collega*ento si*bolico /proc/self/fd/M. Ca itolo ". 'edigere scri t interattivi 12(

8a chiusura [NTf<[ del descrittore di )ile ha l:e))etto di cancellare il collega*ento si*bolico /proc/self/fd/N. 2olo ora viene eseguito il co*ando corrente. 9uando avviate uno scri t dalla linea di co*ando, non ca*bia i@ nulla erch il rocesso shell )iglio user! gli stessi descrittori di )ile di quello genitore. 9uando non 3 dis onibile un tale genitore, er ese* io quando avviate uno scri t utilizzando il rogra**a di utilit! cron, i descrittori di )ile standard sono incanala*enti o altri )ile Hte* oraneiI, a *eno che non venga utilizzata una qualche )or*a di redirezione. 9uesto viene ra resentato nell:ese* io sottostante, che *ostra un:e*issione da un un se* lice scri t at7
michel ~> date Fri Jan 24 11:05:50 CET 2003 michel ~> at 1107 warning: commands will be executed using (in order) a) $SHELL b) login shell c)/bin/sh at> ls -l /proc/self/fd/ > /var/tmp/fdtest.at at> <EOT> job 10 at 2003-01-24 11:07 michel ~> cat /var/tmp/fdtest.at total 0 lr-x------ 1 michel michel 64 Jan l-wx------ 1 michel michel 64 Jan l-wx------ 1 michel michel 64 Jan lr-x------ 1 michel michel 64 Jan

24 24 24 24

11:07 11:07 11:07 11:07

0 1 2 3

-> -> -> ->

/var/spool/at/!0000c010959eb (deleted) /var/tmp/fdtest.at /var/spool/at/spool/a0000c010959eb /proc/21949/fd

6 uno con cron7


michel ~> crontab -l # DO NOT EDIT THIS FILE - edit the master and reinstall. # (/tmp/crontab.21968 installed on Fri Jan 24 11:30:41 2003) # (Cron version -- $Id: chap8.xml,v 1.9 2006/09/28 09:42:45 tille Exp $) 32 11 * * * ls -l /proc/self/fd/ > /var/tmp/fdtest.cron michel ~> cat /var/tmp/fdtest.cron total 0 lr-x------ 1 michel michel 64 Jan 24 l-wx------ 1 michel michel 64 Jan 24 l-wx------ 1 michel michel 64 Jan 24 lr-x------ 1 michel michel 64 Jan 24

11:32 11:32 11:32 11:32

0 1 2 3

-> -> -> ->

pipe:[124440] /var/tmp/fdtest.cron pipe:[124441] /proc/21974/fd

*.2.3.2. &edirezione degli errori


+agli ese* i recedenti 3 chiaro che otete )ornire )ili in ingresso e uscita ad uno scri t Hv. 2ezione ".2.# er *aggiori in)or*azioniI, *a alcuni tendono a di*enticarsi di redirigere gli errori O e*issione che otrebbe essere di esa da questi. 1ltresD, se siete )ortunati, gli errori vi saranno inviati a *ezzo osta ed eventuali cause di )alli*ento otrebbero essere svelate. 2e non siete cosD )ortunati, gli errori vi )aranno )allire il vostro scri t e non verranno intercettati o inviati da nessuna arte, cosD che non otrete iniziare a )are una qualunque *eritevole correzione degli errori. 9uando si redirigono gli errori, restate attenzione che l:ordine di recedenza 3 signi)icativo. Per ese* io, questo co*ando )ornito in /var/spool
ls -l * 2> /var/tmp/inaccessibile-in-spool

Ca itolo ". 'edigere scri t interattivi

121

rediriger! l:e*issione standard del co*ando ls verso il )ile inaccessibile-in-spool in /var/tmp. Il co*ando
ls -l * > /var/tmp/listaspool 2>&1

diriger! sia i**issione che errori standard verso il )ile listaspool. Il co*ando
ls -l * 2 >& 1 > /var/tmp/listaspool

dirige solo l:e*issione standard verso il )ile di destinazione, erch l:errore standard viene co iato nell:e*issione standard ri*a che questa sia rediretta. Per co*odit!, s esso gli errori vengono rediretti verso /dev/null se 3 certo che non servano. 2i ossono trovare centinaia di ese* i nei )ile di avvio del vostro siste*a. -ash er*ette sia all:e*issione standard che all:errore standard di essere rediretti verso il )ile il cui no*e 3 il risultato dell:es ansione di FILE con questo costrutto7 &> FILE CiE 3 l:equivalente di >FILE 2>&1, il costrutto usato nel recedente co* lesso di ese* i. 6sso s esso viene co*binato anche con la redirezione verso /dev/null, er ese* io quando volete solo eseguire un co*ando, non i* orta quali e*issioni o errori dia.

*.2.#. I))issioni ed e)issioni di (ile


*.2.#.1. 6so di ?dev?(d
8a directorG c contiene voci chia*ate 0, 1, 2 e cosD via. 8:a ertura del )ile /dev/fd/N equivale a du licare il descrittore dei )ile 6. 2e il vostro siste*a *ette a dis osizione /dev/stdin, /dev/stdout, vedrete che questi equivalgono ris ettiva*ente a /dev/fd/0& /dev/fd/1 e /dev/fd/2. 8:uso rinci ale dei )ile /dev/fd 3 er la shell. 9uesto *eccanis*o er*ette ai rogra**i che utilizzano argo*enti con no*i di ercorso di gestire l:i**issione standard e l:e*issione standard nello stesso *odo degli altri no*i di ercorso. 2e /dev/fd non 3 dis onibile in un siste*a, dovrete trovare il *odo di risolvere il roble*a. CiE si uE )are, er ese* io, usando un trattino H<I er indicare che un rogra**a dovrebbe leggere da un incanala*ento HpipeI. 5n ese* io7
michel ~> filter corpo.txt.gz | cat testata.txt - piepagina.txt Questo testo viene stampato all'inizio di ogni lavoro di stampa e ringrazia l'amministratore di sistema per averci predisposto una infrastruttura di stampa cos grande. Testo da filtrare. Questo testo viene stampato alla fine di ciascun lavoro di stampa.

Il co*ando cat er ri*a cosa legge il )ile testata.txt, oi la sua i**issione standard che 3 l:e*issione del co*ando filter e, er ulti*o, il )ile piepagina.txt. 8o s eciale signi)icato del trattino co*e argo*ento di linea di co*ando er )are ri)eri*ento all:i**issione standard o Ca itolo ". 'edigere scri t interattivi 122

all:e*issione standard 3 un:idea sbagliata che si 3 insinuata in *olti rogra**i. Ci otrebbero essere anche roble*i quando si s eci)ica il trattino co*e ri*o argo*ento, dal *o*ento che otrebbe essere inter retato co*e una o zione del co*ando recedente. 8:uso di /dev/fd consente uni)or*it! e reviene la con)usione7
michel ~> filter corpo.txt.gz | cat testata.txt /dev/fd0 piepagina.txt | lp

In questo chiaro ese* io, tutti i dati in uscita vengono er di i@ incanalati attraverso lp er inviarli alla sta* ante rede)inita.

*.2.#.2. &ead e eEec


*.2.#.2.1. 2ssegnazione di descrittori di (ile ai (ile

5n:altra *aniera er osservare i descrittori dei )ile 3 di ensarli co*e un *ezzo er assegnare un valore nu*erico ad un )ile. Invece di usare il no*e del )ile, otete usare il nu*ero del descrittore del )ile. Il co*ando integrato e+ec uE essere utilizzato er ri* iazzare la shell del rocesso corrente o er alterare i descrittori dei )ile della shell corrente. Per ese* io, uE essere i* iegato er assegnare un descrittore di )ile ad un )ile. 5sate e+ec fd?I file er assegnare il descrittore di )ile N a )ile er l:e*issione e e+ec fd?H file er assegnare il descrittore di )ile N ad un )ile er l:i**issione. +o o che un descrittore di )ile 3 stato assegnato ad un )ile, esso uE essere utilizzato con gli o eratori di redirezione della shell, co*e 3 di*ostrato nell:ese* io seguente7
michel ~> exec 4> risultati.txt michel ~> filter corpo.txt.gz | cat testata.txt /dev/fd/0 piepagina.txt >& 4 michel ~> cat risultati.txt Questo testo viene stampato all'inizio di ogni lavoro di stampa e ringrazia l'amministratore di sistema per averci predisposto una infrastruttura di stampa cos grande. Testo da filtrare. Questo testo viene stampato alla fine di ciascun lavoro di stampa.

@escrittore di file W 8:uso di questo descrittore dei )ile otrebbe causare dei roble*i, v. [1dvanced -ash< 2cri ting 4uide[, ca itolo 1&. 2iete )orte*ente consigliati di non usarlo.

*.2.#.2.2.

&ead negli script 123

Ca itolo ". 'edigere scri t interattivi

9uello seguente 3 un ese* io che *ostra co*e otete alternare i**issione di )ile ad i**issione tra*ite linea di co*ando7
michel ~/testdir> cat notesistema.sh #!/bin/bash # Questo script crea un indice dei file config importanti, li mette insieme in un file # di salvataggio e consente di aggiungere commenti a ciascun file. CONFIG=/var/tmp/sysconfig.out rm "$CONFIG" 2>/dev/null echo "L'emissione sar salvata in $CONFIG." # crea fd 7 con la stessa destinazione di fd 0 (salva il "valore" stdin) exec 7<&0 # aggiorna fd 0 al file di destinazione /etc/passwd exec < /etc/passwd # Legge la prima linea di /etc/passwd read rootpasswd echo "Salvataggio informazioni su account di root..." echo "Le informazioni sul tuo account di root:" >> "$CONFIG" echo $rootpasswd >> "$CONFIG" # aggiorna fd 0 per puntare alla destinazione fd 7 (vecchia destinazione di fd 0); # cancella fd 7 exec 0<&7 7<&echo -n "Inserire un commento o [INVIO] per nessun commento: " read commento; echo $commento >> "$CONFIG" echo "Salvataggio informazioni degli host..." # Per primo prepara un file hosts privo di commenti TEMP="/var/tmp/hosts.tmp" cat /etc/hosts | grep -v "^#" > "$TEMP" exec 7<&0 exec < "$TEMP" read ip1 nome1 alias1 read ip2 nome2 alias2 echo "La tua configurazione locale di host:" >> "$CONFIG" echo "$ip1 $nome1 $alias1" >> "$CONFIG" echo "$ip2 $nome2 $alias2" >> "$CONFIG" exec 0<&7 7<&echo -n "Inserire un commento o [INVIO] per nessun commento: " read commento; echo $commento >> "$CONFIG" rm "$TEMP" michel ~/testdir> notesistema.sh L'emissione sar salvata in /var/tmp/sysconfig.out. Salvataggio informazioni su account di root... Inserire un commento o [INVIO] per nessun commento: password suggerita: blue lagoon Salvataggio informazioni degli host... Inserire un commento o [INVIO] per nessun commento: in DNS centrale michel ~/testdir> cat /var/tmp/sysconfig.out Le informazioni sul tuo account di root: root:x:0:0:root:/root:/bin/bash password suggerita: blue lagoon La tua configurazione locale di host:

Ca itolo ". 'edigere scri t interattivi

12#

127.0.0.1 localhost.localdomain localhost 192.168.42.1 tintagel.kingarthur.com tintagel in DNS centrale

*.2.#.3. Chiusura dei descrittori dei (ile


+al *o*ento che i rocessi )igli ereditano i descrittori di )ile a erti, 3 buona rassi chiudere un descrittore dei )ile quando non ve ne sia i@ bisogno. CiE si )a usando la sintassi e+ec fdH8' Nell:ese* io so rastante, il descrittore dei )ile 7, che 3 stato assegnato all:i**issione standard, viene chiuso ogni volta che all:utente serve avere accesso alla vera eri)erica di i**issione standard, solita*ente la tastiera. 9uello che segue 3 un se* lice ese* io di redirezione del solo errore standard verso un incanala*ento HpipeI7
michel ~> cat listdirs.sh #!/bin/bash # Questo script stampa l'emissione standard senza modifiche, mentre l'errore standard # viene rediretto per l'elaborazione con awk. INPUTDIR="$1" # fd 6 punta la destinazione fd 1 (uscita console) nella shell corrente exec 6>&1 # fd 1 punta l'incanalamento, fd 2 punta la destinazione fd 1 (incanalamento o pipe), # fd 1 punta la destinazione fd 6 (uscita console), fd 6 chiusa, esegue ls ls "$INPUTDIR"/* 2>&1 >&6 6>&- \ # Chiude fd 6 per awk, ma non per ls. | awk 'BEGIN { FS=":" } { print "NON HAI ACCESSO A" $2 }' 6>&# fd 6 chiuso per la shell corrente exec 6>&-

*.2.#.#. +ocu)enti here


.requente*ente il vostro scri t otrebbe chia*are un altro rogra**a o scri t che richieda ingresso di dati. Il docu*ento here )ornisce un *odo er istruire la shell a leggere l:i**issione dalla sorgente corrente )ino a che non viene trovata una linea contenente solo la stringa di ricerca Hsenza s azi vuoti in *ezzoI. /utte le linee lette )ino a quel unto vengono oi usate co*e i**issione standard er un co*ando. Il risultato 3 che non vi serve chia*are )ile se arati7 otete usare i caratteri s eciali della shell e lo scri t se*brer! i@ grazioso ris etto ad un *ucchio di echo7
michel ~> cat inizionavigazione.sh #!/bin/bash # Questo script fornisce agli utenti un modo semplice per scegliere tra i navigatori. echo "Questi sono i programmi di navigazione internet di questo sistema:"

Ca itolo ". 'edigere scri t interattivi

12$

# Inizia il documento here cat << BROWSERS mozilla links lynx konqueror opera netscape BROWSERS # Fine del documento here echo -n "Quale preferisci? " read browser echo "Avvio $browser, attendi per favore..." $browser & michel ~> inizionavigazione.sh Questi sono i programmi di navigazione internet di questo sistema: mozilla links lynx konqueror opera netscape Quale preferisci? opera Avvio opera, attendi per favore...

2ebbene si arli di un docu*ento here, si su one che si tratti di un costrutto all:interno dello stesso scri t. 9uesto 3 un ese* io che installa auto*atica*ente un acchetto, anche se nor*al*ente dovreste con)er*are7
#!/bin/bash # Questo script installa i pacchetti automaticamente, usando yum. if [ $# -lt 1 ]; then echo "Uso: $0 pacchetti." exit 1 fi yum install $1 << CONFIRM y CONFIRM

6 questo 3 co*e )unziona lo scri t. 9uando a are l:invito con la stringa [Is this o? JG;NK[, lo scri t ris onde [G[ auto*atica*ente7
[root@picon bin]# ./install.sh tuxracer Gathering header information file(s) from server(s) Server: Fedora Linux 2 - i386 - core Server: Fedora Linux 2 - i386 freshrpms Server: JPackage 1.5 for Fedora Core 2 Server: JPackage 1.5, generic Server: Fedora Linux 2 - i386 - updates Finding updated packages Downloading needed headers Resolving dependencies Dependencies resolved I will do the following: [install: tuxracer 0.61-26.i386] Is this ok [y/N]: EnterDownloading Packages Running test transaction: Test transaction complete, Success! tuxracer 100 % done 1/1 Installed: tuxracer 0.61-26.i386 Transaction(s) Complete

Ca itolo ". 'edigere scri t interattivi

12&

*.3. 3o))ario
In questo ca itolo abbia*o i* arato a )ornire dei co**enti dell:utente e a invitare all:i**issione da arte dello stesso. CiE nor*al*ente si )a utilizzando la co*binazione echo;read. 1bbia*o trattato ure di co*e i )ile ossono essere utilizzati co*e i**issione o e*issione ricorrendo ai descrittori di )ile e alla redirezione, e di co*e questi ossano essere co*binati con la ricezione di dati in ingresso dall:utente. 1bbia*o ribadito l:i* ortanza del )ornire *essaggi esaurienti agli utenti dei nostri scri t. Co*e se* re, quando altri usano i vostri scri t, 3 *eglio dare tro e in)or*azioni iuttosto che insu))icienti. i docu*enti here sono un ti o di costrutto di shell che consente la creazione di elenchi, *antenendo le scelte degli utenti. /ale costrutto si uE usare anche er eseguire senza interventi co* iti di sotto)ondo, altri*enti interattivi.

*.#. ;sercizi
9uesti esercizi sono a licazioni ratiche di costrutti trattati in questo ca itolo. 9uando si scrivono degli scri t, otreste rovarli utilizzando una directorG test che non contenga tro i dati. 2crivete ciascun asso, indi rovate quella orzione di codice iuttosto di scrivere tutto in una sola volta. 1. 2crivete un scri t che chieda l:et! dell:utente. 2e 3 uguale o *aggiore di 1& sta* ate un *essaggio che dice che questo utente ha il er*esso di bere alcolici. 2e l:et! dell:utente 3 in)eriore a 1& sta* ate un *essaggio che dica all:utente quanti anni deve attendere ri*a che gli sia consentito legal*ente di bere. Co*e eAtra, calcolate quanta birra un utente *aggiore di 1" anni ha bevuto statistica*ente H1(( litri;annoI e sta* ate questa in)or*azione er l:utente. 2. 'ealizzate uno scri t che renda un )ile co*e argo*ento. 5tilizzate un docu*ento here che resenti all:utente una co ia di scelte er la co* ressione del )ile. 8e scelte otrebbero essere g1ip, b1ipP, compress e 1ip. 3. 'ealizzate uno scri t deno*inato salvataggiohome che auto*atizzi tar in *odo che la ersona che esegua lo scri t usi se* re le desiderate o zioni H cvpI e directorG di destinazione del salvataggio H/var/backupsI er )are una co ia d:e*ergenza della ro ria directorG ersonale HhomeI. I* le*entate le seguenti )unzionalit!7 Controllate il nu*ero di argo*enti. 8o scri t dovrebbe )unzionare senza argo*enti. 2e 3 resente un qualche argo*ento, uscite do o aver sta* ato un *essaggio di istruzioni. +eter*inate se la directorG backups ha abbastanza s azio libero er tenere la co ia d:e*ergenza.

Ca itolo ". 'edigere scri t interattivi

127

Chiedete all:utente se desidera una co ia di salvataggio co* leta o incre*entale. 2e l:utente non ha ancora una co ia co* leta di salvataggio sta* ate un *essaggio che sar! realizzata una co ia co* leta d:e*ergenza. In caso di co ia di salvataggio incre*entale )ate solo questa se quella co* leta non 3 i@ vecchia di una setti*ana. Co* ri*ete la co ia di salvataggio utilizzando un qualsiasi stru*ento di co* ressione. In)or*ate l:utente che lo scri t sta )acendo questo, erch otrebbe richiedere un o: di te* o durante il quale l:utente otrebbe co*inciare a reoccu arsi se non a are nessuna e*issione sullo scher*o. 2ta* ate un *essaggio che in)or*i l:utente circa la di*ensione della co ia di salvataggio co* ressa. 4uardate info tar o Introduzione a 8inuA, ca itolo % [Pre arazione dei vostri dati[, er in)or*azioni di sotto)ondo #. 'ealizzate uno scri t deno*inato semplice-useradd.sh che aggiunga un utente locale al siste*a. 8o scri t dovrebbe7 1ccettare solo un unico argo*ento o istruzioni. ure uscire do o la sta* a di un *essaggio di

Controllare /etc/passwd e decidere sul ri*o I+ utente libero. 2ta* are un *essaggio contenente tale I+. creare un gru o rivato er questo utente veri)icando il )ile /etc/group. 2ta* are un *essaggio contenente l:I+ del gru o. Condividere le in)or*azioni con l:utente o eratore7 un co**ento che descriva questo utente, una scelta da un elenco di shell Hcontrollate l:accettabilit!, altri*enti uscite sta* ando un *essaggioI, data di scadenza di questo account, gru i eAtra a cui otrebbe a artenere il nuovo utente. Con le in)or*azioni ottenute, aggiungere una linea a ;etc; ass>d, ;etc;grou e ;etc;shado>7 creare la directorG ersonale dell:utente HhomeI Hcon i er*essi correttiVI7 aggiungere l:utente ai gru i secondari desiderati. I* ostare la ass>ord di questo utente co*e conosciuta stringa rede)inita. $. 'iscrivete lo scri t della 2ezione 7.2.1.# in *odo che esso legga l:i**issione dall:utente iuttosto che la renda dal ri*o argo*ento.

Ca itolo ". 'edigere scri t interattivi

12"

Capitolo ,. Co)piti ripetitivi


1l ter*ine di questo ca itolo sarete in grado di usare i cicli for, -hile e until, e decidere quale ciclo sia adatto nella circostanza. usare gli integrati di -ash brea! e continue. realizzare scri t che usino l:istruzione select. realizzare scri t che accettino un nu*ero variabile di argo*enti.

,.1. Il ciclo (or


,.1.1. Co)e (unziona?
Il ciclo for 3 il ri*o dei tre costrutti di ciclo della shell. 9uesto ciclo consente di s eci)icare un elenco di valori. 5na lista di co*andi viene eseguita er ciascun valore dell:elenco. 8a sintassi er questo ciclo 37 for NOME "in LIST7#$ do )GQ7?@I$ done 2e "in LIST7# non 3 resente, viene ri* iazzato con in $@ e for esegue )GQ7?@I una volta er ciascun ara*etro osizionale che 3 stato i* ostatoHv. 2ezione 3.2.$ e 2ezione 7.2.1.2I. 8o stato di ritorno 3 lo stato d:uscita dell:ulti*o co*ando eseguito. 2e non sono stati eseguiti dei co*andi erch LISTA non si es ande ad alcuna voce, lo stato di ritorno 3 zero. NOME uE essere qualsiasi no*e di variabile, sebbene i sia usato *olto )requente*ente. LISTA uE essere un qualunque elenco di arole, stringhe o nu*eri, che ossono essere gi! scritte o ure rodotte da qualsiasi co*ando. )GQ7?@I er andare in esecuzione uE anche essere un qualsiasi co*ando del siste*a o erativo, scri t, rogra**a o istruzione di shell. 8a ri*a volta che viene eseguito il ciclo, NOME viene i* ostato con la ri*a voce di LISTA. 8a seconda volta, il suo valore viene i* ostato con la seconda voce in lista e cosD via. Il ciclo ter*ina quando NOME ha assunto ciascun valore di LISTA e non sono ri*aste voci in LISTA.

,.1.2. ;se)pi
,.1.2.1. 6so della sostituzione dei co)andi per speci(icare voci di LI302
Il ri*o 3 un ese* io a linea di co*ando che *ostra l:uso di un ciclo for che esegue una co ia di Ca itolo %. Co* iti ri etitivi 12%

salvataggio di ogni )ile .xml. +o o aver dato il co*ando, iniziare a lavorare sui vostri sorgenti 3 sicuro7
[carol@octarine ~/articles] ls *.xml file1.xml file2.xml file3.xml [carol@octarine ~/articles] ls *.xml > lista [carol@octarine ~/articles] for i in `cat lista`; do cp "$i" "$i".bak ; done [carol@octarine ~/articles] ls *.xml* file1.xml file1.xml.bak file2.xml file2.xml.bak file3.xml file3.xml.bak

9uesto invece elenca i )ile in ;sbin che sono solo dei )ile di testo uro ed eventual*ente gli scri t7
for i in `ls /sbin`; do file /sbin/$i | grep ASCII; done

,.1.2.2. 6so del contenuto di una variabile per speci(icare voci di LI302
Il seguente 3 uno s eci)ico scri t a licativo er convertire )ile B/=8, secondo un certo sche*a, in )ile PBP. 8a conversione viene eseguita estraendo le ri*e 2$ linee e le ulti*e 21, sostituendo queste con due *arcatori HtagI PBP che )orniscono le linee di intestazione e di i3 agina7
[carol@octarine ~/html] cat html2php.sh #!/bin/bash # specifico script di conversione per i miei file da html a php LISTA="$(ls *.html)" for i in "$LISTA"; do NUOVONOME=$(ls "$i" | sed -e 's/html/php/') cat beginfile > "$NUOVONOME" cat "$i" | sed -e '1,25d' | tac | sed -e '1,21d'| tac >> "$NUOVONOME" cat endfile >> "$NUOVONOME" done

+al *o*ento che qui non )accia*o un conteggio delle linee, non c:3 *odo di conoscere il nu*ero di linea da cui iniziare a cancellare linee )ino a che si raggiunge il ter*ine. Il roble*a si risolve usando tac, che rovescia le linee in un )ile. Il comando basename Invece di usare sed er sostituire il su))isso ht*l con h , sarebbe i@ corretto utilizzare il co*ando basename. 8eggete le agine *an er *aggiori in)or*azioni. Strani caratteri .inirete nei guai se la lista si es ande ai no*i dei )ile contenenti s azi ed altri caratteri irregolari. 5n costrutto i@ ideale er ottenere la lista sarebbe quello di utilizzare la )unzione di globbing della shell, co*e questa7
for i in $PATHNAME/*; do comandi done

Ca itolo %. Co* iti ri etitivi

13(

,.2. Il ciclo Bhile


,.2.1. Cos74?
Il costrutto -hile er*ette l:esecuzione ri etuta di una lista di co*andi )intanto che il co*ando che controlla il ciclo -hile viene eseguito con successo Hstato di uscita zeroI. 8a sintassi 37 -hile )GQ7?@G')G?TFGLLG$ do )GQ7?@I')G?S%GK%?TI$ done )GQ7?@G')G?TFGLLG uE essere qualsiasi co*ando che uE uscire con uno stato di successo o )alli*ento. )GQ7?@I')G?S%GK%?TI uE essere qualsiasi rogra**a, scri t o costrutto di shell. Non a ena )GQ7?@G')G?TFGLLG )allisce, il ciclo esce7 n uno scri t viene eseguito il co*ando successivo all:istruzione done. 8o stato di ritorno 3 lo stato d:uscita dell:ulti*o co*ando )GQ7?@I')G?S%GK%?TI, o zero se nessuno 3 stato eseguito. ure

,.2.2. ;se)pi
,.2.2.1. 3e)plice ese)pio di utilizzo di Bhile
9ui c:3 un ese* io er gli i* azienti7
#!/bin/bash # Questo script apre 4 finestre di terminale. i="0" while [ $i -lt 4 ] do xterm & i=$[$i+1] done

,.2.2.2. Cicli Bhile annidati


8:ese* io sottostante 3 stato scritto er co iare in una directorG >eb delle i**agini che erano state realizzate con una >ebca*. ,gni cinque *inuti viene scattata una )oto. ,gni ora viene creata una nuova directorG contenente le i**agini di quell:ora. ,gni giorno viene creata una nuova directorG contenente 2# sottodirectorG. 8o scri t gira dietro le quinte.
#!/bin/bash # Questo script copia file dalla mia directory home a quella del webserver. # (usa scp e le chiavi SSH per una directory remota) # Viene creata una nuova ogni ora.

Ca itolo %. Co* iti ri etitivi

131

PICSDIR=/home/carol/pics WEBDIR=/var/www/carol/webcam while true; do DATA=`date +%Y%m%d` ORA=`date +%H` mkdir $WEBDIR/"$DATA" while [ $ORA -ne "00" ]; do DESTDIR=$WEBDIR/"$DATA"/"$ORA" mkdir "$DESTDIR" mv $PICSDIR/*.jpg "$DESTDIR"/ sleep 3600 ORA=`date +%H` done done

,sservate l:uso dell:istruzione true. 2igni)ica questo7 continua l:esecuzione )inch non venia*o interrotti con la )orza Hcon !ill o )trl*)I. 9uesto iccolo scri t uE essere utilizzato er e))ettuare una si*ulazione7 esso genera )ile.
#!/bin/bash # Questo genera un file ogni 5 minuti while true; do touch pic-`date +%s`.jpg sleep 300 done

,sservate l:uso del co*ando date er generare tutti i ti i di no*i di )ile e directorG. 4uardate le agine *an er *aggiori in)or*azioni. Ksate il sistema 8:ese* io recedente 3 a sco o di*ostrativo. 0eri)iche regolari si ossono ottenere con il rogra**a di utilit! cron. Non scordate di redirigere l:e*issione e gli errori quando utilizzate scri t che vengono eseguiti dal vostro crontabV

,.2.2.3. 6so dell7i))issione da tastiera per controllare il ciclo Bhile


9uesto scri t uE essere interrotto dall:utente quando si inserisce una sequenza )trl*)7
#!/bin/bash # Questo script distribuisce saggezza FORTUNE=/usr/games/fortune while true; do echo "In che materia vuoi consigli?" cat << materie politica startrek kernelnewbies sport bofh-excuses magia amore

Ca itolo %. Co* iti ri etitivi

132

letteratura droghe educazione materie echo echo -n "Effettua la tua scelta: " read materia echo echo "Consiglio gratuito in materia di $materia: " echo $FORTUNE $materia echo done

0iene usato un docu*ento here er resentare all:utente le scelte ossibili. 6 di nuovo il test true ri ete i co*andi della lista )GQ7?@I')G?S%GK%?TI ancora e ancora.

,.2.2.#. Calcolo di una )edia


9uesto scri t calcola la *edia di un:i**issione di utente, che viene testata ri*a dell:elaborazione7 se l:i**issione non rientra nell:intervallo, viene sta* ato un *essaggio. 2e si re*e ( il ciclo si interro* e7
#!/bin/bash # Calcola la media di una serie di numeri. PUNTEGGIO="0" MEDIA="0" SOMMA="0" NUM="0" while true; do echo -n "Inserisci il tuo punteggio [0-100%] ('q' per finire): "; read PUNTEGGIO; if (("$PUNTEGGIO" < "0")) || (("$PUNTEGGIO" > "100")); then echo "Sii serio. Coraggio, prova di nuovo: " elif [ "$PUNTEGGIO" == "q" ]; then echo "Classifica media: $MEDIA%." break else SOMMA=$[$SOMMA + $PUNTEGGIO] NUM=$[$NUM + 1] MEDIA=$[$SOMMA / $NUM] fi done echo "Uscita."

,sservate co*e le variabili nelle ulti*e linee sono lasciate senza a ici er oter e))ettuare i calcoli arit*etici.

Ca itolo %. Co* iti ri etitivi

133

,.3. Il ciclo until


,.3.1. Cos74?
Il ciclo until 3 *olto si*ile al quello -hile, ad eccezione che il ciclo viene eseguito )intanto HuntilI che )GQ7?@G'T%ST viene eseguito con successo. .ino a quando questo co*ando )allisce, il ciclo continua. 8a sintassi 3 la stessa del ciclo -hile7 until )GQ7?@G'T%ST$ do )GQ7?@I')G?S%GK%?TI$ done 8o stato di ritorno 3 lo stato d:uscita dell:ulti*o co*ando eseguito della lista )GQ7?@I' )G?S%GK%?TI, o ure zero se nessuno 3 stato eseguito. )GQ7?@G'T%ST uE, di nuovo, essere qualsiasi co*ando che uE uscire con uno stato di successo o )alli*ento, e )GQ7?@I' )G?S%GK%?TI uE essere qualsiasi co*ando 5NIF, scri t o costrutto di shell. Co*e abbia*o gi! s iegato in nuovalinea ogni volta che a are. recedenza, [N[ otrebbe essere ri* iazzato con una o i@

,.3.2. ;se)pio
5no scri t riordinaimmagini.sh *igliorato Hv. 2ezione %.2.2.2I, che veri)ichi la dis onibilit! di s azio su disco. 2e non 3 dis onibile abbastanza s azio su disco, ri*uovete le i**agini dai *esi recedenti7
#!/bin/bash # Questo script copia file dalla mia directory home in quella del webserver. # Una nuova directory viene creata ogni ora. # Se le immagini occupano troppo spazio, le pi vecchie vengono rimosse. while true; do DISCOPIENO=$(df -h $WEBDIR | grep -v File | awk '{print $5 }' | cut -d "%" -f1 -) until [ $DISCOPIENO -ge "90" ]; do DATA=`date +%Y%m%d` ORA=`date +%H` mkdir $WEBDIR/"$DATA" while [ $ORA -ne "00" ]; do DESTDIR=$WEBDIR/"$DATA"/"$ORA" mkdir "$DESTDIR" mv $PICDIR/*.jpg "$DESTDIR"/ sleep 3600 ORA=`date +%H` done DISCOPIENO=$(df -h $WEBDIR | grep -v File | awk '{ print $5 }' | cut -d "%" -f1 -) done DARIMUOVERE=$(find $WEBDIR -type d -a -mtime +30) for i in $DARIMUOVERE; do rm -rf "$i"; done done

Ca itolo %. Co* iti ri etitivi

13#

,sservate l:inizializzazione delle variabili ORA e DISCOPIENO e l:uso delle o zioni con ls e date er ottenere un:elencazione corretta er DARIMUOVERE.

,.#. La redirezione dell7I?. e i cicli


,.#.1. &edirezione dell7i))issione
Invece di controllare un ciclo testando il risultato di un co*ando o in base all:i**issione dell:utente, otete s eci)icare un )ile da cui leggere l:i**issione che controlla il ciclo. In tali casi, s esso, read 3 il co*ando di controllo. .ino a che ci sono linee di i**issione nel ciclo, l:esecuzione dei co*andi del ciclo continua. Non a ena tutte le linee di i**issione sono state lette, il ciclo esce. +al *o*ento che il costrutto del ciclo 3 considerato essere un:unica struttura di co*ando Hco*e -hile )GQ7?@G')G?TFGLLG$ do )GQ7?@I')G?S%GK%?TI$ done I, la redirezione dovrebbe avvenire do o l:istruzione done, in *odo da corris ondere alla )or*a comando H file 9uesto genere di redirezione )unziona anche con altri ti i di cicli.

,.#.2. &edirezione dell7e)issione


Nell:ese* io sottostante, l:e*issione del co*ando find viene utilizzata co*e i**issione er il co*ando read che controlla un ciclo -hile7
[carol@octarine ~/testdir] cat archiveoldstuff.sh #!/bin/bash # Questo script crea una sottodirectory nella directory corrente, verso cui # vengono spostati i vecchi file. # Potrebbe essere qualcosa per cron (se leggermente adattato) da eseguirsi # settimanalmente o mensilmente. NUMARCHIVIO=`date +%Y%m%d` DESTDIR="$PWD/archivio-$NUMARCHIVIO" mkdir "$DESTDIR" # uso degli apici per intercettare i nomi di file che contengono spazi, # uso di read -d per un utilizzo maggiormente aprova di errore: find "$PWD" -type f -a -mtime +5 | while read -d $'\000' file do gzip "$file"; mv "$file".gz "$DESTDIR" echo "$file archived" done

I )ile vengono co* ressi riva di s ostarli nella directorG di archiviazione.

Ca itolo %. Co* iti ri etitivi

13$

,.$. BreaC e continue


,.$.1. L7integrato breaC
8:istruzione brea! si usa er uscire dal ciclo in corso ri*a del suo ter*ine nor*ale. CiE si )a quando non conoscete in antici o quante vole il ciclo dovr! essere eseguito, er ese* io erch di ende dall:i**issione dell:utente. 8:ese* io sottostante *ostra un ciclo -hile che uE essere interrotto. 9uesta 3 una versione legger*ente *igliorata dello scri t saggezza.sh della 2ezione %.2.2.3.
#!/bin/bash # Questo script distribuisce saggezza # Ora puoi uscire in maniera decente. FORTUNE=/usr/games/fortune while true; do echo "In che materia vuoi consigli?" echo "1. politica" echo "2. startrek" echo "3. kernelnewbies" echo "4. sport" echo "5. bofh-excuses" echo "6. magia" echo "7. amore" echo "8. letteratura" echo "9. droghe" echo "10. educazione" echo echo -n "Effettua la tua scelta: " read scelta echo case $choice in 1) $FORTUNE politica ;; 2) $FORTUNE startrek ;; 3) $FORTUNE kernelnewbies ;; 4) echo "Gli sport sono uno spreco di tempo, energia e denaro." echo "Torna alla tua tastiera." echo -e "\t\t\t\t -- \"Malaticcio il mio secondo nome\" Soggie." ;; 5) $FORTUNE bofh-excuses ;; 6) $FORTUNE magia ;; 7) $FORTUNE amore ;; 8) $FORTUNE letteratura ;; 9) $FORTUNE droghe

Ca itolo %. Co* iti ri etitivi

13&

;; 10) $FORTUNE educazione ;; 0) echo "OK, arrivederci!" break ;; *) echo "Quella non una scelta valida: prova un numero da 0 a 10." ;; esac done

'icordatevi che brea! interro* e il ciclo, non lo scri t. CiE si uE di*ostrare aggiungendo un co*ando echo al ter*ine dello scri t. 9uesto echo verr! eseguito anche su i**issione che causi l:esecuzione di brea! Hquando l:utente batte [([I. Nei cicli annidati brea! er*ette di s eci)icare quale ciclo interro* ere. 4uardate le agine info er *aggiori notizie.

,.$.2. L7integrato continue


8:istruzione continue ri rende l:iterazione di un ciclo enclosing for, -hile o select. 9uando viene usato in un ciclo for, la variabile di controllo releva il valore dell:ele*ento successivo della lista. 9uando viene usato in un costrutto -hile o until, ri rende invece l:esecuzione con )GQ7?@G'T%ST all:inizio del ciclo.

,.$.3. ;se)pi
Nell:ese* io seguente i no*i dei )ile vengono convertiti in lettere *inuscole. 2e non va )atta alcuna conversione, un co*ando continue riavvia l:esecuzione del ciclo. 9uesti co*andi non *angiano tro e risorse del siste*a e, *olto )acil*ente, roble*i si*ili ossono essere risolti usando sed e a-!. /uttavia 3 utile conoscere questo ti o di costruzione quando si eseguono dei co* iti esanti, che otrebbero anche non essere necessari quando si inseriscono dei test nei osti giusti di uno scri t, ris ar*iando risorse di siste*a.
[carol@octarine ~/test] cat inminuscolo.sh #!/bin/bash # Questo script converte tutti i nomi di file contenenti caratteri MAIUSCOLI in # nomi di file contenenti solo caratteri minuscoli LISTA="$(ls)" for nome in "$LISTA"; do if [[ "$nome" != *[[:upper:]]* ]]; then continue fi ORIG="$nome" NUOVO=`echo $nome | tr 'A-Z' 'a-z'`

Ca itolo %. Co* iti ri etitivi

137

mv "$ORIG" "$NUOVO" echo "Il nuovo nome di $ORIG $NUOVO" done

9uesto scri t ha al*eno un di)etto7 sovrascrive i )ile esistenti. 8:o zione noclobber er -ash 3 utile solo quando avviene una redirezione. 8:o zione -b al co*ando m )ornisce *aggiore sicurezza, *a 3 sicura solo in caso di una sovrascrittura accidentale, co*e 3 di*ostrato in questo test7
[carol@octarine ~/test] rm * [carol@octarine ~/test] touch test Test TEST [carol@octarine ~/test] bash -x inminuscolo.sh ++ ls + LIST=test Test TEST + [[ test != *[[:upper:]]* ]] + continue + [[ Test != *[[:upper:]]* ]] + ORIG=Test ++ echo Test ++ tr A-Z a-z + NUOVO=test + mv -b Test test + echo 'Il nuovo nome di Test test' Il nuovo nome di Test test + [[ TEST != *[[:upper:]]* ]] + ORIG=TEST ++ echo TEST ++ tr A-Z a-z + NUOVO=test + mv -b TEST test + echo 'Il nuovo nome di TEST test' Il nuovo nome di TEST test [carol@octarine ~/test] ls -a ./ ../ test test~

Il tr 3 arte del acchetto textutil 7 uE eseguire tutti i ti i di tras)or*azioni di caratteri.

,.%. Creazione di )enu con l7integrato select


,.%.1. In generale
,.%.1.1. 6so di select
Il costrutto select er*ette una generazione se* lice di *enu. 8a sintassi 3 abbastanza si*ile a quella del ciclo for7 select PAROLA "in LISTA#$ do )GQ7?@I'F%L7TISI$ done LISTA viene es ansa, generando un elenco di voci. 8:es ansione viene sta* ata nell:errore standard H tandard errorI7 ciascuna voce 3 receduta da un nu*ero. 2e non 3 resente in LISTA/ vengono sta* ati i ara*etri osizionali, co*e se )osse stato s eci)icato in $@. LISTA 3 sta* ata Ca itolo %. Co* iti ri etitivi 13"

solo una volta. Con la sta* a di tutte le voci, viene sta* ato l:invito PS3 e viene letta una sola linea dall:i**issione standard. 2e questa linea consiste in un nu*ero che corris onde ad una delle voci, il valore di PAROLA viene i* ostato con il no*e di quella voce. 2e la linea 3 vuota, le voci e l:invito PS3 vengono nuova*ente *ostrati. 2e viene letto un carattere %&- H6nd ,) .ileI, il ciclo si interro* e. +al *o*ento che la *aggioranza degli utenti non ha un indizio su quale chiave sia usata er la sequenza 6,., 3 i@ alla loro ortata avere un co*ando brea! co*e una delle voci. 9ualsiasi altro valore della linea letta i* oster! PAROLA a))inch sia una stringa nulla. 8a linea letta viene salvata nella variabile REPLY. I )GQ7?@I'F%L7TISI vengono eseguiti do o ciascuna selezione )ino a che non viene letto il nu*ero che ra resenta il brea!. 9uesto interro* e il ciclo.

,.%.1.2. ;se)pi
9uesto 3 un ese* io *olto se* lice, *a, co*e otete vedere, non 3 *olto alla ortata degli utenti7
[carol@octarine testdir] cat private.sh #!/bin/bash echo "Questo script pu rendere privato qualunque file di questa directory." echo "Inserisci il numero del file che desiderate proteggere:" select NOMEFILE in *; do echo "Hai scelto $NOMEFILE ($REPLY), ora accessibile solo a te." chmod go-rwx "$NOMEFILE" done [carol@octarine testdir] ./private.sh Questo script pu rendere privato qualunque file di questa directory. Inserisci il numero del file che desiderate proteggere: 1) archivio-20030129 2) bash 3) privato.sh #? 1 Hai scelto archivio-20030129 (1) #?

I* ostare l:invito PS3 ed aggiungere una ossibilit! er ter*inare lo rende *igliore7


#!/bin/bash echo "Questo script can pu fare rendere privato qualunque file di questa directory." echo "Inserisci il numero del file che intendi proteggere:" PS3="La tua scelta: " ABBANDONO="TERMINA QUESTO PROGRAMMA Ora miu sento sicuro." touch "$ABBANDONO" select NOMEFILE in *; do case $NOMEFILE in "$ABBANDONO") echo "Uscita." break

Ca itolo %. Co* iti ri etitivi

13%

;; *) echo "Hai scelto $NOMFILE ($REPLY)" chmod go-rwx "$NOMEFILE" ;; esac done rm "$ABBANDONO"

,.%.2. 3otto)enu
9ualunque istruzione all:interno di un costrutto select uE essere un altro ciclo select, abilitando sotto*enu dentro *enu. +i base la variabile P23 non viene *odi)icata quando si inserisce un ciclo select annidato. 2e volete un invito diverso nel sotto*enu, assicuratevi di i* ostarlo al *o*ento giusto.

,.'. L7integrato shi(t


,.'.1. Che cosa (a?
Il co*ando shift 3 uno degli integrati della shell -ourne che giungono con -ash. 9uesto co*ando rende un solo argo*ento, un nu*ero. I ara*etri osizionali vengono s ostati a sinistra da questo nu*ero, 6. I ara*etri osizionali da N]1 a \P vengono rino*inati con i no*i di variabile da $1 a $# - N+1. 2u onete di avere un co*ando che accetta 1( argo*enti, e N 3 #, allora $4 diviene $1, $5 diviene $2 e cosD via. $10 diventa $7 e gli originali $1, $2 e $3 vengono scartati. 2e N 3 zero o *aggiore di \P, i ara*etri osizionali non vengono *odi)icati Hil nu*ero totale di argo*enti, v. 2ezione 7.2.1.2I e il co*ando non ha e))etto. 2e N non 3 resente, si su one che sia 1. 8o stato di ritorno 3 zero a *eno che N sia *aggiore di \P o *inore di zero7altri*enti 3 non<zero.

,.'.2. ;se)pi
5n:istruzione shi)t si usa di solito quando il nu*ero di argo*enti er un co*ando non 3 noto a riori, er ese* io quando gli utenti ossono dare quanti argo*enti desiderino. In tali casi, gli argo*enti vengono nor*al*ente elaborati in un ciclo -hile con una condizione di veri)ica ari a HH\PII. 9uesta condizione 3 vera er tutto il te* o che il nu*ero degli argo*enti 3 *aggiore di zero. 8a variabile $1 e l:istruzione shift )anno elaborare ogni ele*ento. Il nu*ero degli argo*enti viene ridotto ogni volta che shift viene eseguito e )inal*ente diventa zero, al che il ciclo -hile ter*ina. 8:ese* io sottostante, pulizia.sh, usa istruzioni shift er elaborare ogni )ile nella lista generata Ca itolo %. Co* iti ri etitivi 1#(

da find7
#!/bin/bash # Questo script pu cancellare file usati per l'ultima volta oltre 365 giorni fa. USO="Uso: $0 dir1 dir2 dir3 ... dirN" if [ "$#" == "0" ]; then echo "$USO" exit 1 fi while (( "$#" )); do if [[ $(ls "$1") == "" ]]; then echo "Directory vuota, niente da fare." else find "$1" -type f -a -atime +365 -exec rm -i {} \; fi shift done

'e+ec s. +args Il co*ando find so rastante uE essere con il seguente7 find opzioni 0 +args "comandi<da<eseguire<sui<file<tro ati# Il co*ando +args costruisce ed esegue linee di co*andi dall:i**issione standard. 9uesto ha il vantaggio che la linea di co*ando viene rie* ita )ino a raggiungere il li*ite del siste*a. 2oltanto do o verr! chia*ato il co*ando da eseguire7 nell:ese* io so rastante questo dovrebbe essere rm. 2e ci sono i@ argo*enti, verr! utilizzata una nuova linea di co*ando, )ino a che questa sar! iena o )inch non ci saranno i@ argo*enti. 8a stessa cosa avviene usando le chia*ate find -exec nel co*ando da eseguire sui )ile trovati ogni volta che se ne trova uno. CosD )acendo, l:uso di +args velocizza arecchio i vostri scri t e le restazioni della vostra *acchina. Nel rossi*o ese* io abbia*o *odi)icato lo scri t della 2ezione ".2.#.# in *odo che accetti i@ acchetti da installare alla volta7
#!/bin/bash if [ $# -lt 1 ]; then echo "Uso: $0 pacchetto/i" exit 1 fi while (($#)); do yum install "$1" << CONFIRM y CONFIRM shift done

,.*. 3o))ario
In questo ca itolo abbia*o trattato di co*e ossano essere incor orati dei co*andi ri etitivi in Ca itolo %. Co* iti ri etitivi 1#1

costrutti di ciclo. 8a *aggior arte dei co*uni cicli vengono realizzati utilizzando le istruzioni for, -hile o until, o ure una co*binazione di questi co*andi. Il ciclo for esegue un co* ito er un deter*inato nu*ero di volte. 2e non sa ete quante volte un co*ando dovrebbe essere eseguito, utilizzate until o -hile er recisare quando il ciclo dovrebbe ter*inare. I cicli si ossono interro* ere o ri etere utilizzando le istruzioni brea! e continue. 2i uE utilizzare un )ile co*e i**issione er un ciclo usando l:o eratore di redirezione dell:i**issione7 i cicli ossono anche leggere l:e*issione di co*andi che viene data in asto al ciclo ricorrendo ad un incanala*ento. Il costrutto select si usa er sta* are *enu negli scri t interattivi. 8:esecuzione di cicli attraverso gli argo*enti della linea di co*ando in uno scri t uE essere osta in essere utilizzando l:istruzione shift.

,.,. ;sercizi
'icordate7 quando realizzate scri t, lavorate a assi e rovate ogni asso ri*a di incor orarlo nel vostro scri t. 1. Create uno scri t che )ar! una co ia HricorsivaI dei )ile in ;etc in *odo che un a**inistratore di siste*a rinci iante ossa *odi)icare )ile senza ti*ori. 2. 2crivete uno scri t che renda esatta*ente un argo*ento, un no*e di directorG. 2e il nu*ero degli argo*enti 3 *aggiore o *inore di uno, sta* ate un *essaggio sull:uso. 2e l:argo*ento non 3 una directorG, sta* ate un altro *essaggio. +ella directorG indicata sta* ate i ri*i cinque )ile i@ grandi e i cinque )ile che sono stati *odi)icati i@ di recente. 3. Potete s iegare erch 3 cosD i* ortante *ettere le variabili tra a ici do della 2ezione %.#.2? i nell:ese* io

#. 2crivete uno scri t si*ile a quello in 2ezione %.$.1 *a ensate ad un *odo er ter*inare do o che l:utente ha eseguito 3 cicli. $. Pensate ad una *igliore soluzione ris etto a mo e -b er lo scri t della 2ezione %.$.3 er revenire la sovrascrittura dei )ile esistenti. Per ese* io, veri)icate se un )ile esiste o *eno. Non )ate lavori inutiliV &. 'iscrivete lo scri t qualedemone.sh della 2ezione 7.$ Jesercizio n.$K in *odo che7 sta* i un elenco dei server da controllare, co*e 1 ache, il server 22B, il de*one N/P, un de*one dei no*i, un de*one della gestione dell:ali*entazione e cosD viaN er ogni scelta l:utente ossa )are, sta* i alcune in)or*azioni sensibili, co*e il no*e del >eb server, le in)or*azioni N/P del traccia*ento e cosD viaN redis oniate la )acolt! er gli utenti di controllare altri server oltre quello 1#2

Ca itolo %. Co* iti ri etitivi

elencato, Per tali casi controllate che al*eno il rocesso indicato stia )unzionandoN rivediate lo scri t della 2ezione %.2.2.#. Notate co*e l:i**issione dei caratteri diversi da ( venga elaborata. 'icostruite questo scri t in *odo che sta* i un *essaggio se vengono )orniti dei caratteri co*e i**issione.

Ca itolo %. Co* iti ri etitivi

1#3

Capitolo 1-. +i piD sulle variabili


In questo ca itolo trattere*o l:uso avanzato delle variabili e degli argo*enti. 1l co* leta*ento sarete in grado di7 dichiarare e usare una *atrice di variabiliN s eci)icare il ti o di variabile che desiderate utilizzareN creare variabili a sola letturaN usare set er assegnare un valore ad una variabile.

1-.1. 0ipi di variabili


1-.1.1. 2ssegna)ento di valori in generale
Co*e abbia*o visto, -ash co* rende *olti ti i diversi di variabili o ara*etri. .inora non ci sia*o interessato *olto a quale genere di variabile abbia*o assegnato, cosicch le nostre variabili otrebbero contenere qualsiasi valore assegnato loro. 5n se* lice ese* io a linea di co*ando di*ostra ciE7
[bob in ~] VARIABILE=12 [bob in ~] echo $VARIABILE 12 [bob in ~] VARIABILE=stringa [bob in ~] echo $VARIABILE stringa

6sistono casi in cui desiderate evitare questo genere di co* orta*ento, er ese* io quando si gestiscono nu*eri tele)onici e di altro ti o. 1 arte gli interi e le variabili, otete anche s eci)icare una variabile che sia una costante. CiE viene )atto s esso all:inizio di uno scri t, quando viene dichiarato il valore della costante. +o o di ciE, esistono solo ri)eri*enti al no*e di variabile della costante, cosicch, quando 3 necessario *odi)icare la costante, ciE dovr! essere )atto una sola volta. 5na variabile uE essere anche una serie di variabili di qualsiasi ti o, una cosiddetta matrice Ho arra!I di variabili HVAR0, VAR1, VAR2, i VARNI.

1-.1.2. 6so dell7integrato declare


5tilizzando un:istruzione declare, ossia*o li*itare l:assegna*ento di valori alle variabili. 8a sintassi er declare 3 la seguente7 declare OPZIONI VARIABILEN alore Ca itolo 1(. +i i@ sulle variabili 1##

8e seguenti o zioni sono utilizzate er deter*inare il ti o di dati che uE contenere la variabile e er assegnarle attributi7 Tabella 1B#1 &pzioni dell"integrato declare Gp1ione Significato -a -f -i -p 8a variabile 3 una *atrice Harra!I. 2olo utilizzo di no*i di )unzione. 8a variabile viene trattata co*e un intero7 la valutazione arit*etica si esegue quando viene assegnato un valore alla variabile Hv. 2ezione 3.#.&I. =ostra gli attributi e valori di ogni variabile. 9uando si usa < le o zioni aggiuntive vengono ignorate. 'ende a sola lettura le variabili. 1 queste variabili do o non ossono essere attribuiti valori con susseguenti istruzioni di assegna*ento, ed esse ne ure ossono essere eli*inate. +! ad ogni variabile l:attributo trace. =arca ciascuna variabile er l:es ortazione verso co*andi successivi tra*ite l:a*biente.

-r -t -x

8:uso di ] al osto di O disabilita invece l:attributo. 9uando si utilizza in una )unzione, declare crea variabili locali. 8:ese* io seguente *ostra co*e l:assegna*ento di un ti o ad una variabile in)luenzi il valore.
[bob in ~] declare -i VARIABILE=12 [bob in ~] VARIABILE=stringa [bob in ~] echo $VARIABILE 0 [bob in ~] declare -p VARIABILE declare -i VARIABILE="0"

Notate che -ash ha un:o zione er dichiarare un valore nu*erico, *a nessuna er dichiarare valori stringa. 9uesto 3 erch, di base, se nulla 3 stato s eci)icato, una variabile uE contenere qualunque ti o di dati7
[bob in ~] ALTRAVAR=blah [bob in ~] declare -p ALTRAVAR declare ALTRAVAR="blah"

Non a ena restringete l:assegna*ento di valori ad una variabile, essa uE contenere solo quel ti o di dati. 'estrizioni ossibili sono intero, costante o *atrice. 4uardate le agine in)o di -ash er in)or*azioni sullo stato di ritorno.

1-.1.3. Costanti
In -ash le costanti si creano rendendo a sola lettura una variabile. 8:integrato readonl. *arca ogni Ca itolo 1(. +i i@ sulle variabili 1#$

s eci)icata variabile co*e i**odi)icabile. 8a sintassi 37 readonl. OPZIONE VARIABILI I valori di queste variabili do o non si ossono i@ ca*biare con un successivo assegna*ento. 2e 3 stata data l:o zione -f, ogni variabile si ri)erisce ad una )unzione di shell7 v. Ca itolo 11. 2e 3 stata s eci)icata -a, tutte le variabili si ri)eriscono ad una *atrice di variabili. 2e non 3 stato dato nessun argo*ento, o 3 stata )ornita -p, viene *ostrato un elenco di tutte le variabili a sola lettura. 5sando l:o zione -p, l:e*issione uE essere rei* iegata co*e i**issione. 8o stato di ritorno 3 zero, a *eno che sia stata s eci)icata un:o zione non valida, una delle variabili o )unzioni non esista, o ure sia stata )ornita -f er un no*e di variabile al osto di un no*e di )unzione.
[bob in ~] readonly TUX=penguinpower [bob in ~] TUX=Mickeysoft bash: TUX: readonly variable

1-.2. 1ariabili )atriciali


1-.2.1. Creazione delle )atrici
5na *atrice Jarra!K 3 una variabile che contiene *olte lici valori. ,gni variabile uE essere utilizzata co*e *atrice. Non esiste un li*ite *assi*o alle di*ensioni di una *atrice, e ne ure un qualche requisito che le variabili *e*bri siano indicizzate o assegnate in *odo contiguo. 8e *atrici artono da zero7 il ri*o ele*ento 3 indicizzato con il nu*ero (. 8a dichiarazione indiretta si e))ettua utilizzando la seguente sintassi er dichiarare una variabile7 MATRICE[NUMINDICE]N alore 6(;)6D)C% viene trattato co*e una es ressione arit*etica che deve essere calcolata co*e nu*ero ositivo. 8a dichiarazione es licita di una *atrice si realizza usando l:integrato declare7 declare -a NOMEMATRICE 1nche una dichiarazione con un nu*ero di indice verr! accettata, *a il nu*ero di indice sar! ignorato. 4li attributi della *atrice si ossono s eci)icare utilizzando gli integrati declare e readonl.. 4li attributi si a licano a tutte le variabili della *atrice7non otete avere delle *atrici *iste. 8e variabili *atriciali ossono essere create anche utilizzando assegna*enti co* osti in questo )or*ato7 Ca itolo 1(. +i i@ sulle variabili 1#&

MATRICEN9 alore1 aloreP X alore?: ,gni valore 3 oi nella )or*a di @numeroindiceCD tringa. Il nu*ero d:indice 3 )acoltativo. 2e 3 )ornito, quell:indice 3 assegnato ad esso7 altri*enti l:indice dell:ele*ento assegnato 3 il nu*ero dell:ulti*o indice che 3 stato assegnato i@ uno. 9uesto )or*ato 3 accettato anche da declare. 2e non vengono )orniti nu*eri d:indice, l:indicizzazione inizia da zero. 8:aggiunta di *e*bri *ancanti o eAtra in una *atrice si )a usando la sintassi7 NOMEMATRICE[NUMEROINDICE]N alore 'icordate che l:integrato read *ette a dis osizione l:o zione -a, che consente la lettura e l:assegna*ento di valori alle variabili *e*bri di una *atrice.

1-.2.2. +ere(erenzia)ento delle variabili di una )atrice


Per )are ri)eri*ento al contenuto di una voce di una *atrice, usate le arentesi gra))e. CiE 3 necessario, co*e otete constatare nell:ese* io seguente, er scavalcare l:inter retazione degli o eratori di es ansione da arte della shell. 2e il nu*ero di indice 3 _ o ^, tutti i *e*bri di una *atrice sono re)erenziati.
[bob in ~] MATRICE=(one two tre) [bob in ~] echo ${MATRICE[*]} uno due tre [bob in ~] echo $MATRICE[*] uno[*] [bob in ~] echo ${MATRICE[2]} tre [bob in ~] MATRICE[3]=quattro [bob in ~] echo ${MATRICE[*]} uno due tre quattro

.are ri)eri*ento al contenuto di una variabile *e*bro di una *atrice senza )ornire un nu*ero indice 3 lo stesso di )are ri)eri*ento al contenuto del ri*o ele*ento, quello re)erenziato con nu*ero di indice zero.

1-.2.3. Cancellare le variabili )atriciali


8:integrato unset 3 usato er distruggere *atrici o variabili *e*bri di una *atrice7
[bob in ~] unset MATRICE[1] [bob in ~] echo ${MATRICE[*]} uno tre quattro [bob in ~] unset MATRICE

Ca itolo 1(. +i i@ sulle variabili

1#7

[bob in ~] echo ${MATRICE[*]} <--no output-->

1-.2.#. ;se)pi di )atrici


6se* i ratici dell:uso delle *atrici sono di))icili da trovare. /roverete scri t in quantit! che in realt! non )anno nulla nel vostro siste*a *a che utilizzano le *atrici er calcolare serie *ate*atiche, er ese* io. 6 questo sarebbe uno degli ese* i i@ interessante... la *aggioranza degli scri t *ostrano solo ciE che otete )are con una *atrice in un *odo se* li)icato al *assi*o e teorico. 8a ragione di questa *onotonia 3 che le *atrici sono strutture iuttosto co* lesse. 2co rirete che la *aggioranza degli ese* i ratici in cui ossono essere usate le *atrici sono gi! i* le*entati nel vostro siste*a usando *atrici, sebbene in un livello i@ basso, nel linguaggio di rogra**azione C con cui 3 scritta la *aggioranza dei co*andi 5NIF. 5n buon ese* io 3 il co*ando integrato histor. di -ash. 9uei lettori che )ossero interessati otrebbero controllare la directorG built-ins nell:albero dei sorgenti di -ash dare un occhio a fc.def, che 3 elaborato quando si co* ilano gli integrati. 5n:altra ragione er cui sono di))icili da trovare dei buoni ese* i 3 che non tutte le shell su le *atrici, cosicch esse in)rangono la co* atibilit!. ortano

+o o lunghi giorni di ricerche, )inal*ente ho trovato questo ese* io o erando resso un )ornitore HproviderI Internet. 6sso distribuisce i )ile di con)igurazione del >eb server 1 ache negli host di una >eb )ar*7
#!/bin/bash if [ $(whoami) != 'root' ]; then echo "Bisogna essere root per avviare $0" exit 1; fi if [ -z $1 ]; then echo "Uso: $0 </path/to/httpd.conf>" exit 1 fi httpd_conf_new=$1 httpd_conf_path="/usr/local/apache/conf" login=htuser farm_hosts=(web03 web04 web05 web06 web07) for i in ${farm_hosts[@]}; do su $login -c "scp $httpd_conf_new ${i}:${httpd_conf_path}" su $login -c "ssh $i sudo /usr/local/apache/bin/apachectl graceful" done exit 0

I ri*i due controlli sono eseguiti er veri)icare se l:utente corretto sta avviando lo scri t con i giusti argo*enti. I no*i degli host che necessitano di essere con)igurati sono elencati nella *atrice farm_hosts. Poi tutti questi host vengono )orniti tra*ite il )ile di con)igurazione di 1 ache, do o di che si riavvia il de*one. Notate l:utilizzo dei co*andi della suite 2ecure 2hell nel cri tare le connessioni verso gli host re*oti. Ca itolo 1(. +i i@ sulle variabili 1#"

4razie, 6ugene e collega, er questo contributo. +an 'ichter ha contribuito all:ese* io seguente. 9uesto 3 il roble*a con cui si 3 con)rontato7 [i Nella *ia societ! abbia*o de*o del nostro sito >eb e ogni setti*ana qualcuno deve testarle tutte. CosD ho un:attivit! di cron che rie* ie una *atrice con tutti i ossibili candidati, usa date +%W er trovare la setti*ana dell:anno ed esegue un:o erazione di *odulo er trovare l:indice corretto. 8a ersona )ortunata viene noti)icata tra*ite osta elettronica[. 6 questo 3 stato il suo *odo di risolverlo7
#!/bin/bash # This is get-tester-address.sh # # First, we test whether bash supports arrays. # (Support for arrays was only added recently.) # whotest[0]='test' || (echo 'Failure: arrays not supported in this version of bash.' && exit 2) # # Our list of candidates. (Feel free to add or # remove candidates.) # wholist=( 'Bob Smith <bob@example.com>' 'Jane L. Williams <jane@example.com>' 'Eric S. Raymond <esr@example.com>' 'Larry Wall <wall@example.com>' 'Linus Torvalds <linus@example.com>' ) # # Count the number of possible testers. # (Loop until we find an empty string.) # count=0 while [ "x${wholist[count]}" != "x" ] do count=$(( $count + 1 )) done # # Now we calculate whose turn it is. # week=`date '+%W'` # The week of the year (0..53). week=${week#0} # Remove possible leading zero. let "index = $week % $count" email=${wholist[index]} echo $email # week modulo count = the lucky person

# Get the lucky person's e-mail address. # Output the person's e-mail address.

/ale scri t viene oi usato in altri scri t, co*e questo che utilizza un docu*ento here7
email=`get-tester-address.sh` hostname=`hostname` # Trova a chi mandare una e-mail. # Nome di questa macchina.

# # Invia una e-mail alla persona giusta. # mail $email -s '[Demo Testing]' <<EOF The lucky tester this week is: $email Reminder: the list of demos is here: http://web.example.com:8080/DemoSites

Ca itolo 1(. +i i@ sulle variabili

1#%

(Questa e-mail stata generata da $0 su ${hostname}.) EOF

1-.3. .perazioni su variabili


1-.3.1. 2rit)etica con le variabili
1bbia*o gi! trattato di questo nella 4ezione 1/</>.

1-.3.2. Lunghezza di una variabile


5sando la sintassi ${#VAR} si calcoler! il nu*ero dei caratteri in una variabile. 2e VAR 3 [*[ o [@[, questo valore viene sostituito con il nu*ero dei ara*etri osizionali o il nu*ero di ele*enti di una *atrice in generale. CiE 3 di*ostrato nell:ese* io sottostante7
[bob in ~] echo $SHELL /bin/bash [bob in ~] echo ${#SHELL} 9 [bob in ~] MATRICE=(uno due tre) [bob in ~] echo ${#MATRICE} 3

1-.3.3. 0ras(or)azioni di variabili 1-.3.3.1. 3ostituzione AMVAR:-PAROLAO 2e VAR non 3 de)inita o 3 nulla, la sostituisce l:es ansione di PAROLA, altri*enti viene sostituita dal suo valore.
[bob in ~] echo ${TEST:-test} test [bob in ~] echo $TEST [bob in ~] export TEST=una_stringa [bob in ~] echo ${TEST:-test} una_stringa [bob in ~] echo ${TEST2:-$TEST} una_stringa

9uesta )or*a 3 usata s esso nei test condizionali, er ese* io in questo7 Ca itolo 1(. +i i@ sulle variabili 1$(

[ -z "${COLONNE:-}" ] && COLONNE=80

6: una notazione abbreviata er


if [ -z "${COLONNE:-}" ]; then COLONNE=80 fi

4uardate la 2ezione 7.1.2.3 er *aggiori in)or*azioni su questo ti o di rova delle condizioni. 2e il trattino H<I viene sostituito con il segno uguale HbI, il valore viene assegnato al ara*etro se non esiste7
[bob in ~] echo $TEST2 [bob in ~] echo ${TEST2:=$TEST} una_stringa [bob in ~] echo $TEST2 una_stringa

8a sintassi seguente controlla l:esistenza di una variabile. 2e non 3 stata i* ostata, si sta* a l:es ansione di PAROLA nell:e*issione standard H tandard outputI e le shell non interattive si chiudono. 5na di*ostrazione7
[bob in ~] cat vartest.sh #!/bin/bash # Questo script controlla se una variabile stata dichiarata. In caso contrario, # esce stampando un messaggio. echo ${TESTVAR:?"C' cos tanto che ancora volevo fare..."} echo "TESTVAR stata dichiarata, possiamo procedere." [bob in testdir] ./vartest.sh ./vartest.sh: line 6: TESTVAR: C' cos tanto che ancora volevo fare... [bob in testdir] export TESTVAR=presente [bob in testdir] ./vartest.sh presente TESTVAR stata dichiarata, possiamo procedere.

8:uso di [][ al osto del unto escla*ativo i* osta la variabile er l:es ansione di PAROLA7 se non esiste, non succede nulla.

1-.3.3.2. &i)ozione di sottostringhe


Per togliere un nu*ero di caratteri, uguale a OFFSET, da una variabile, usate questa sintassi7 ${VAR:OFFSET:LUNGHEZZA} Il ara*etro LUNGHEZZA de)inisce quanti caratteri tenere, a co*inciare dal ri*o carattere do o il unto di o))set. 2e viene o*esso LUNGHEZZA, viene resa la restante arte del contenuto della variabile7
[bob in ~] export STRINGA="questoeunnomemoltolungo" [bob in ~] echo ${STRINGA:6}

Ca itolo 1(. +i i@ sulle variabili

1$1

eunnomemoltolungo [bob in ~] echo ${STRINGA:9:9} nomemolto

AMS7F=PAROLAO e AMS7F==PAROLAO 9uesti costrutti sono usati er cancellare il *odello corris ondente all:es ansione di PAROLA in VAR. PAROLA si es ande er rodurre un *odello ro rio co*e nell:es ansione dei no*i di )ile. 2e il *odello coincide con l:inizio del valore es anso di VAR, quindi il risultato dell:es ansione 3 il valore di VAR con il *odello di co* arazione i@ breve H[ #[I o il *odello di co* arazione i@ lungo Hindicato con [##[I. 2e VAR 3 * o @, l:o erazione di ri*ozione di *odelli 3 invece a licata ad ogni osizionale e l:es ansione 3 l:elenco risultante. ara*etro

2e VAR 3 una variabile *atriciale indicata con [^[ o [_[, l:o erazione di ri*ozione di *odelli viene a licata invece ad ogni *e*bro della *atrice e l:es ansione 3 il risultante elenco. CiE 3 *ostrato negli ese* i sottostanti7
[bob in ~] echo ${ARRAY[*]} one two one three one four [bob in ~] echo ${ARRAY[*]#one} two three four [bob in ~] echo ${ARRAY[*]#t} one wo one hree one four [bob in ~] echo ${ARRAY[*]#t*} one wo one hree one four [bob in ~] echo ${ARRAY[*]##t*} one one one four

8:e))etto o osto si ottiene utilizzando [d[ e [dd[, co*e nell:ese* io sottostante. PAROLA dovrebbe corris ondere con una orzione all:interno di una stringa7
[bob in ~] echo $STRINGA questoeunnomemoltolungo [bob in ~] echo ${STRINGA%lungo} questoeunnomemolto

1-.3.3.3. &i)piazzare parti di no)i di variabili


9uesto si )a utilizzando la sintassi ${VAR/MODELLO/STRINGA}

Ca itolo 1(. +i i@ sulle variabili

1$2

o ${VAR//MODELLO/STRINGA} 8a ri*a )or*a ri* iazza la ri*a corris ondenza, la seconda ri* iazza tute le corris ondenze di MODELLO con STRINGA7
[bob in ~] echo ${STRINGA/nome/testo} questoeuntestomoltolungo

=aggiori in)or*azioni si ossono trovare nelle agine in)o di -ash.

1-.#. 3o))ario
Nor*al*ente una variabile uE contenere qualunque ti o di dati, a *eno che siano dichiarate es licita*ente. 8e variabili costanti si i* ostano usando il co*ando integrato readonl.. 5na *atrice contiene un insie*e di variabili. 2e viene dichiarato un ti o di dato, allora tutti gli ele*enti della *atrice saranno i* ostati er contenere solo questo ti o di dato. 8e )unzionalit! di -ash consentono la sostituzione e la tras)or*azione [al volo[ delle variabili. 8e o erazioni standard co* rendono il calcolo della lunghezza di una variabile, arit*etica con le variabili, sostituzione del contenuto delle variabili e di arte di esso.

1-.$. ;sercizi
9ui ci sono alcuni ro* ica i7 1. 'edigete uno scri t che )accia quanto segue7 =ostri il no*e dello scri t che 3 in esecuzione. =ostri il ri*o, terzo e deci*o argo*ento )ornito allo scri t. =ostri il nu*ero totale di argo*enti assati allo scri t. 2e ci sono i@ di tre ara*etri osizionali, usate shift er *uovere tutti i valori di 3 osizioni verso sinistra. 2ta* i tutti i valori degli argo*enti restanti. 2ta* i il nu*ero di argo*enti. Controllate con zero, uno, tre e i@ di dieci argo*enti. 2. 'edigete uno scri t che i* le*enti un se* lice navigatore >eb Hin *odalit! testualeI, usando -get e lin!s -dump er *ostrare le agine B/=8 all:utente. 9uest:ulti*o ha tre scelte7 inserire un 5'8, inserire i er indietro e t er ter*inare. 4li ulti*i 1( 5'8 inseriti Ca itolo 1(. +i i@ sulle variabili 1$3

dall:utente sono conservati in una *atrice, da cui il *edesi*o utilizzando la )unzionalit! indietro.

uE ri ristinare l:5'8

Ca itolo 1(. +i i@ sulle variabili

1$#

Capitolo 11. /unzioni


In questo ca itolo trattere*o di7 Cosa sono le )unzioni Creazione e ra resentazione di )unzioni da linea di co*ando .unzioni negli scri t Passaggio di argo*enti alle )unzioni 9uando usare le )unzioni

11.1. Introduzione
11.1.1. Cosa sono le (unzioni?
8e )unzioni di shell sono un *odo di raggru are co*andi er l:esecuzione successiva , utilizzando un solo no*e er questo gru o o routine. Il no*e della routine deve essere univoco all:interno della shell o dello scri t. /utti i co*andi che costituiscono una )unzione vengono eseguiti co*e dei nor*ali co*andi. 9uando si chia*a una )unzione co*e un se* lice no*e di co*ando, l:elenco dei co*andi associati con quella )unzione viene eseguito. 5na )unzione si esegue all:interno della shell in cui 3 stata dichiarata7 non si crea nessun nuovo rocesso er inter retare i co*andi. +egli s eciali co*andi integrati si trovano ri*a delle )unzioni di shell durante la ricerca dei co*andi. 4li integrati s eciali sono7 brea!, ,, ., continue, e al, e+ec, e+it, e+port, readonl., return, set, shift, trap e unset.

11.1.2. 3intassi delle (unzioni


8e )unzioni usano sia la sintassi function FK?YIG?% M )GQ7?@I$ O sia FK?YIG?% 9: M )GQ7?@I$ O 1*bedue de)iniscono una )unzione di shell FK?YIG?%. 8:uso del co*ando integrato function 3 )acoltativo7 tuttavia, se non 3 utilizzato, sono necessarie le arentesi. I co*andi elencati tra le arentesi gra))e costituiscono il cor o della )unzione. /ali co*andi sono Ca itolo 11. .unzioni 1$$

eseguiti ogni qualvolta si s eci)ica FK?YIG?% co*e il no*e di un co*ando. 8o stato d:uscita 3 quello dell:ulti*o co*ando eseguito nel cor o. %rrori comuni 8e arentesi gra))e devono essere se arate dal cor o con s azi, altri*enti vengono inter retate nel *odo sbagliato. Il cor o di una )unzione dovrebbe ter*inare con un unto e virgola o un nuovalinea.

11.1.3. I para)etri posizionali nelle (unzioni


8e )unzioni sono co*e dei *iniscri t7 ossono accettare ara*etri, usare variabili conosciute solo all:interno della )unzione Hutilizzando l:integrato di shell localI e restituire valori alla shell chia*ante. 5na )unzione ha anche un siste*a er inter retare i ara*etri osizionali. /uttavia i ara*etri osizionali assati ad una )unzione non sono gli stessi di quelli assati ad un co*ando o ad uno scri t. 9uando si esegue una )unzione, gli argo*enti di questa diventano ara*etri osizionali durante la sua esecuzione. 8o s eciale ara*etro P che si es ande al nu*ero di ara*etri osizionali viene aggiornato er ris ecchiare la *odi)ica. Il ara*etro osizionale ( non viene *odi)icato. 8a variabile di -ash FUNCNAME 3 i* ostata con il no*e del FUNCNAME della )unzione durante la sua esecuzione. 2e l:integrato return viene eseguito in una )unzione, la )unzione si co* leta e ri rende l:esecuzione con il co*ando successivo alla chia*ata della )unzione. 9uando si conclude una )unzione, il valore dei ara*etri osizionali e il ara*etro s eciale P vengono ri ortati ai valori che avevano ri*a dell:esecuzione della )unzione. 2e viene attribuito un argo*ento nu*erico a return, viene restituito quello stato. 5n se* lice ese* io7
[lydia@cointreau ~/test] cat mostraparam.sh #!/bin/bash echo "Questo script mostra gli argomenti delle funzioni." echo echo "Parametro posizionale 1 dello script $1." echo test () { echo "Parametro posizionale 1 nella funzione $1." VALORE_RITORNO=$? echo "Il codice di uscita di questa funzione $VALORE_RITORNO." } test altro_param [lydia@cointreau ~/test] ./mostraparam.sh parametro1 Questo script mostra gli argomenti delle funzioni.

Ca itolo 11. .unzioni

1$&

Parametro posizionale 1 dello script parametro1. Parametro posizionale 1 nella funzione altro_param. Il codice di uscita di questa funzione 0. [lydia@cointreau ~/test]

Notate che il valore di ritorno o il codice d:uscita della )unzione sono s esso conservati in una variabile, cosicch questa uE essere interrogata in un unto successivo. 4li scri t init nel vostro siste*a usano s esso la tecnica di interrogare la variabile RETVAL in un test condizionale, ro rio co*e questo7
if [ $RETVAL -eq 0 ]; then <avvia il demone>

, co*e questo ese* io dallo scri t /etc/init.d/amd, in cui vengono utilizzate le )unzioni di otti*izzazione di -ash7
[ $RETVAL = 0 ] && touch /var/lock/subsys/amd

I co*andi do o 88 vengono eseguiti solo quando il test rova di essere vero7 questo 3 un *odo i@ breve er ra resentare una struttura if;then;fi. Il codice di ritorno della )unzione 3 s esso utilizzato co*e codice d:uscita dell:intero scri t. 0edrete una quantit! di initscri t ter*inanti in qualcosa di si*ile a e+it $RETVAL.

11.1.#. 9ostrare le (unzioni


/utte le )unzioni note alla shell corrente ossono essere *ostrate usando l:integrato set senza o zioni. +o o l:utilizzo, le )unzioni vengono conservate, a *eno che non venga usato unset su di loro do o l:uso. 1nche il co*ando -hich *ostra le )unzioni7
[lydia@cointreau ~] which zless zless is a function zless () { z cat "$@" | "$PAGER" } [lydia@cointreau ~] echo $PAGER less

9uesto 3 il ti o di )unzione che viene ti ica*ente con)igurata nei )ile di con)igurazione delle risorse di shell dell:utente. 8e )unzioni sono i@ )lessibili ris etto agli alias e )orniscono un *odo se* lice e )acile er adattare l:a*biente dell:utente. 6cco qui una er gli utenti +,27
dir () { ls -F --color=auto -lF --color=always "$@" | less -r }

Ca itolo 11. .unzioni

1$7

11.2. ;se)pi di (unzioni negli script


11.2.1. &iciclaggio
Nel vostro siste*a ci sono quantit! di scri t che usano )unzioni co*e *odo strutturato di gestire serie di co*andi. In alcuni siste*i 8inuA, er ese* io, troverete il )ile di de)inizione /etc/rc.d/init.d/function, che 3 riscontrabile in tutti gli scri t init. 5sando questo *etodo, o erazioni co*uni co*e controllare se il rocesso gira, avviare e )er*are un de*one e cosD via, devono essere scritti solo una volta, in *odo generico. 2e la stessa o erazione serve di nuovo, il codice viene riciclato. Potreste realizzare il vostro )ile ersonale /etc/functions che contenga tutte le )unzioni che usate regolar*ente nel vostro siste*a, in scri t di))erenti. =ettete solo la linea ./etc/functions da qualche arte all:inizio dello scri t e otete riciclare le )unzioni.

11.2.2. I)postazione del percorso


9uesta sezione si otrebbe trovare nel vostro )ile /etc/profile. 8a )unzione pathmunge 3 de)inita e oi usata er i* ostare il ercorso er il root e e gli altri utenti7
pathmunge () { if ! echo $PATH | /bin/egrep -q "(^|:)$1($|:)" ; then if [ "$2" = "dopo" ] ; then PATH=$PATH:$1 else PATH=$1:$PATH fi fi } # Manipolazione del percorso if [ `id -u` = 0 ]; then pathmunge /sbin pathmunge /usr/sbin pathmunge /usr/local/sbin fi pathmunge /usr/X11R6/bin dopo unset pathmunge

8a )unzione considera il suo ri*o argo*ento co*e un no*e di ercorso. 2e questo no*e di ercorso non 3 ancora nel ercorso corrente, viene aggiunto. Il secondo argo*ento alla )unzione de)inisce se il ercorso sar! aggiunto davanti o dietro la de)inizione del PATH J ercorsoK corrente. 4li utenti nor*ali ottengono solo l:aggiunta di /usr/X11R6/bin ai loro ercorsi, *entre root ottiene una co ia di directorG eAtra contenenti co*andi di siste*a. +o o essere stata usata, la )unzione subisce unset cosicch non viene conservata.

Ca itolo 11. .unzioni

1$"

11.2.3. Copie di salvataggio in re)oto


8:ese* io seguente 3 quello che uso er eseguire delle co ie di salvataggio dei )ile er i *iei libri. 6sso utilizza le chiavi 22B er abilitare la connessione re*ota. 2ono de)inite due )unzioni, buplinu+ e bupbash, che roducono entra*be un )ile .tar, che oi viene co* resso e inviato ad un server. +o o di ciE, la co ia locale viene ri*ossa. +i do*enica viene eseguita solo bupbash.
#/bin/bash LOGFILE="/nethome/tille/log/backupscript.log" echo "Inizio backup per `date`" >> "$LOGFILE" buplinux() { DIR="/nethome/tille/xml/db/linux-basics/" TAR="Linux.tar" BZIP="$TAR.bz2" SERVER="rincewind" RDIR="/var/www/intra/tille/html/training/" cd "$DIR" tar cf "$TAR" src/*.xml src/images/*.png src/images/*.eps echo "Compressione di $TAR..." >> "$LOGFILE" bzip2 "$TAR" echo "...fatta." >> "$LOGFILE" echo "Copia in $SERVER..." >> "$LOGFILE" scp "$BZIP" "$SERVER:$RDIR" > /dev/null 2>&1 echo "...fatta." >> "$LOGFILE" echo -e "Done backing up Linux course:\nSource files, PNG and EPS images.\nRubbish removed." >> "$rm "$BZIP" } bupbash() { DIR="/nethome/tille/xml/db/" TAR="Bash.tar" BZIP="$TAR.bz2" FILES="bash-programming/" SERVER="rincewind" RDIR="/var/www/intra/tille/html/training/" cd "$DIR" tar cf "$TAR" "$FILES" echo "Compressing $TAR..." >> "$LOGFILE" bzip2 "$TAR" echo "...fatto." >> "$LOGFILE" echo "Copia su $SERVER..." >> "$LOGFILE" scp "$BZIP" "$SERVER:$RDIR" > /dev/null 2>&1 echo "...fatto" >> "$LOGFILE" echo -e "Eseguito salvataggio del corso di Bash:\n$FILES\nRobaccia rimossa." >> "$LOGFILE" rm "$BZIP" } GIORNO=`date +%w` if [ "$GIORNO" -lt "2" ]; then echo "E' `date +%A`, in corso back up di Bash solamente." >> "$LOGFILE" bupbash else buplinux bupbash fi echo -e "Salvataggio in remoto `date` RIUSCITO\n----------" >> "$LOGFILE"

Ca itolo 11. .unzioni

1$%

9uesto scri t viene avviato da cron Hsigni)ica senza interazione u*anaI, cosicch redirigia*o l:errore standard H tandard errorI dal co*ando scp verso /dev/null. 2i otrebbe dedurre che tutte le )asi se arate otrebbero essere co*binate in un co*ando co*e tar c dir_da_salvare/ 0 b1ipP 0 ssh server Lcat I backup.tar.bz2L /uttavia , se siete interessati ai risultati inter*edi che otrebbero essere ri ristinati in caso di )alli*ento dello scri t, questo non 3 ciE che volete. 8:es ressione comando 8I file equivale a comando I file PI81

11.3. 3o))ario
8e )unzioni )orniscono un *odo )acile er raggru are co*andi che vi serve eseguire ri etitiva*ente. 9uando una )unzione sta )unzionando, i ara*etri osizionali vengono *odi)icati in quelli della )unzione. 9uando si )er*a, essi vengono ri ortati a quelli del rogra**a chia*ante. 8e )unzioni sono dei *iniscri t e, ro rio co*e gli scri t, generano dei codici d:uscita o di ritorno. 2ebbene questo sia stato un ca itolo breve, esso contiene nozioni i* ortanti che servono a raggiungere lo stato su re*o di igrizia che 3 l:obiettivo ti ico di qualsiasi a**inistratore di siste*a.

11.#. ;sercizi
9ui ci sono alcune cose utili che otete )are usando le )unzioni7 1. 1ggiungete una )unzione al vostro )ile di con)igurazione ~/.bashrc che auto*atizzi la sta* a delle agine *an. Il risultato dovrebbe essere che digitate qualcosa co*e printman HcomandoI, in *odo che la ri*a a ro riata agina *an esca dalla vostra sta* ante. .ate le veri)iche usando una seudo eri)erica di sta* a er rovare le )unzionalit!. Co*e eAtra, inserite la ossibilit! er l:utente di )ornire il nu*ero di sezione delle agina *an che vuole sta* are. 2. Create una sottodirectorG nella vostra directorG Ca itolo 11. .unzioni ersonale in cui otrete conservare le 1&(

de)inizioni delle )unzioni. =ettete una co ia di )unzioni in quella directorG. Potrebbero essere utili )unzioni, tra le altre, che voi abbiate gli stessi co*andi in un +,2 o in uno 5NIF co**erciale quando state lavorando con 8inuA, o viceversa. 9ueste )unzioni dovrebbero oi essere i* ortate nel vostro a*biente di shell quando viene letto ~/.bashrc.

Ca itolo 11. .unzioni

1&1

Capitolo 12. Cattura dei segnali


In questo ca itolo trattere*o gli argo*enti seguenti7 2egnali dis onibili 5so dei segnali 5so dell:istruzione trap Co*e i* edire agli utenti l:interruzione dei vostri rogra**i

12.1. 3egnali
12.1.1. Introduzione
12.1.1.1. 0rovare la pagina )an dei segnali
Il vostro siste*a contiene una agina *an che elenca tutti i segnali dis onibili, *a, in base al vostro siste*a o erativo, otrebbe essere a ribile in *odo di))erente. In *olti siste*i 8inuA, ciE otrebbe essere man Z signal. In caso di dubbio, localizzate le esatte agina *an e sezione utilizzando co*andi co*e man -k signal 0 grep list o apropos signal 0 grep list I no*i dei segnali si ossono trovare utilizzando !ill 'l.

12.1.1.2. 3egnali alla vostra shell Bash


In assenza di qualsiasi intercettazione, una shell interattiva -ash ignora 4)'T%9; e 4)'E()T. 4)')6T viene intercettato e gestito, e se il controllo del lavori H jobI 3 attivo, ure 4)'TT)6, 4)'TT&( e 4)'4T&P sono ignorati. Ignorano questi segnali anche i co*andi che sono stati avviati co*e risultato di una sostituzione di co*andi, quando generati da tastiera. 4)'7(P nor*al*ente ter*ina una shell. 5na shell interattiva invier! un 4)'7(P a tutti i lavori, in esecuzione o )er*ati7 guardate la docu*entazione sull:integrato diso-n se volete disabilitare questo co* orta*ento base er un rocesso articolare. 5sate l:o zione hu oneAit er uccidere H killingI tutti i lavori alla ricezione di un segnale 4)'7(P, utilizzando l:integrato shopt. Ca itolo 12. Cattura dei segnali 1&2

12.1.1.3. Invio di segnali usando la shell


5sando la shell -ash si ossono inviare i segnali seguenti7 Tabella 1.#1/ 4egnali di controllo in 3a h )ombina1ione Significato standard dei tasti )trl*) Il segnale di interruzione, invia 2I4IN/ al lavoro che sta girando in ri*o iano Il carattere di o pen ione ritardata. +eter*ina l:interruzione di un rocesso in corso quando tenta di leggere i**issioni dal ter*inale. Il controllo viene restituito alla shell e l:utente uE *ettere in ri*o iano, *ettere dietro le quinte o uccidere un rocesso. 8a sos ensione ritardata 3 dis onibile solo in siste*i o erativi che su ortino tale )unzionalit!. Il segnale di o pen ione invia un 4)'4TP ad un rogra**a attivo, in *odo da )er*arlo e restituire il controllo alla shell.

)trl*[

)trl*Y

Imposta1ione del terminale Controllate le vostre i* ostazioni stt.. 8a sos ensione ed il ri ristino delle e*issioni sono di solito disabilitate se state usando [*oderne[ e*ulazioni di ter*inale. 8o standard +term su orta in *odo rede)inito )trl*S e )trl*Q.

12.1.2. 6so dei segnali con Cill


8a *aggioranza delle *oderne shell, -ash co* resa, hanno una )unzione !ill integrata. In -ash sia i no*i che i nu*eri dei segnali vengono accettati co*e o zioni, e gli argo*enti otrebbero essere un lavoro HjobI o un I+ di rocesso. 2i uE rivere uno stato d:uscita utilizzando l:o zione -l7 zero quando al*eno un segnale 3 stato inviato con successo, diverso da zero se 3 ca itato un errore. I* iegando il co*ando !ill da /usr/bin, il vostro siste*a otrebbe abilitare delle o zioni eAtra, co*e ad ese* io la ca acit! di uccidere rocessi con altro I+ di utente ris etto al vostro e di s eci)icare i rocessi er no*e, co*e con pgrep e p!ill. 6ntra*bi i co*andi !ill inviano il segnale T%9; se nessuno viene indicato. 9uesto 3 un elenco dei segnali i@ co*uni7 Tabella 1.#. ?ome segnale Salore segnale 2I4B5P 2I4IN/ 2I4SI88 1 2 % %ffetto 1ggancia Interruzione da tastiera 2egnale di ?ill 1&3

Ca itolo 12. Cattura dei segnali

?ome segnale Salore segnale 2I4/6'= 2I42/,P 1$ 17,1%, 23

%ffetto 2egnale di ter*inazione .er*a il rocesso

SIGVILL e SIGSTG6 2I4SI88 e 2I42/,P non ossono essere intercettati, bloccati o ignorati. 9uando si uccide un rocesso o una serie di rocessi, 3 senso co*une iniziare a rovare con il segnale *eno ericoloso, 4)'T%9;. In questo *odo i rogra**i che si reoccu ano dello s egni*ento in *aniera ordinata ottengono la ossibilit! di seguire le rocedure er le quali essi sono stati rogettati ad eseguire quando ricevono il segnale 4)'T%9;, co*e la ulitura e la chiusura di )ile a erti. 2e inviate un segnale 4)'F)LL ad un rocesso, sottraete qualsiasi ossibilit! al rocesso di eseguire una ulitura e chiusura ordinate, cosa che otrebbe avere s iacevoli conseguenze. =a se non )unziona una chiusura ulita, i segnali )6T o F)LL otrebbero essere la sola *aniera. Per ese* io, quando un rocesso non *uore usando )trl*), 3 *eglio usare !ill '\ su quell:I+ di rocesso7
maud: ~> ps -ef | grep stuck_process maud 5607 2214 0 20:05 pts/5 maud: ~> kill -9 5607 maud: ~> ps -ef | grep stuck_process maud 5614 2214 0 20:15 pts/5 [1]+ Killed stuck_process 00:00:02 stuck_process

00:00:00 grep stuck_process

9uando un rocesso avvia diverse istanze, !illall otrebbe essere i@ conveniente7 accetta le stesse o zioni di !ill, *a le a lica a tutte le istanze di un dato rocesso. Provate questo co*ando ri*a di ado erarlo in un a*bito roduttivo, dal *o*ento che otrebbe non )unzionare co*e ci si as etta in alcuni tra gli 5niA co**erciali.

12.2. 0rappole
12.2.1. In generale
Ci otrebbero essere delle situazioni in cui non volete che gli utenti dei vostri scri t escano ri*a del te* o usando le sequenze di abbandono er *ezzo di tastiera, er ese* io erch si deve )ornire un:i**issione o ure deve essere eseguita una ri ulitura. 8:istruzione trap cattura queste sequenze e uE essere rogra**ata er eseguire un elenco di co*andi in base alla cattura di quei segnali. 8a sintassi er l:istruzione trap 3 chiara7 trap ")GQ7?@I# "S%G?7LI#

Ca itolo 12. Cattura dei segnali

1&#

CiE istruisce il co*ando trap a catturare i 4%'6:L) elencati, che otrebbero essere i no*i di segnali con o senza il re)isso 4)', o ure i nu*eri dei segnali. 2e un segnale 3 B o %G)T, i )GQ7?@I vengono eseguiti quando la shell esce. 2e uno dei segnali 3 D%3(', la lista dei )GQ7?@I 3 eseguita do o ogni singolo co*ando. 5n segnale otrebbe essere anche s eci)icato co*e %997 in tal caso i )GQ7?@I vengono eseguiti ogni qualvolta un co*ando singolo esce con stato diverso da zero. Notate che questi co*andi non saranno eseguiti quando lo stato di uscita diverso da zero roviene da una arte di un:istruzione if, o da un ciclo -hile o until. Non verranno ne ure eseguiti se un :6D logico HffI o un &9 HXXI danno co*e risultato un codice d:uscita diverso da zero, o quando lo stato di ritorno di un co*ando viene invertito usando l:o eratore 0. 8o stato di ritorno del co*ando trap stesso 3 zero a *eno che non venga incontrata una s eci)icazione di segnale non valida. Il co*ando trap accetta una co ia di o zioni, che sono docu*entate nelle agine in)o di -ash. 9ui c:3 un ese* io *olto se* lice, che cattura )trl*) roveniente dall:utente sta* ando un *essaggio. 9uando rovate ad uccidere questo rogra**a senza s eci)icare il segnale F)LL, non accadr! nulla7
#!/bin/bash # traptest.sh trap "echo Buu!..." SIGINT SIGTERM echo "pid is $$" while : do sleep 60 done # Questo la stessa cosa di "while true". # Questo script in realt non sta facendo nulla.

12.2.2. Co)e Bash interpreta le trappole


9uando -ash riceve un segnale er il quale 3 stata redis osta una tra ola *entre sta attendendo il co* leta*ento di un co*ando, la tra ola non sar! eseguita )ino a che questo co*ando non sar! co* letato. 9uando -ash 3 in attesa di un co*ando asincrono attraverso l:integrato -ait, la ricezione di un segnale er cui 3 stata redis osta una tra ola )ar! sD che l:integrato -ait restituisca i**ediata*ente uno stato di uscita *aggiore di 12", subito do o l:esecuzione della tra ola.

12.2.3. 6lteriori ese)pi


12.2.3.1. 3coprire quando viene utilizzata una variabile
9uando si correggono scri t i@ lunghi, otreste voler assegnare ad una variabile l:attributo trace ed intercettare i *essaggi di D%3(' di quella variabile. Nor*al*ente dichiarereste una variabile solo utilizzando un assegna*ento co*e S7FI7BIL%N alore. 2ostituire la dichiarazione della variabile con le linee seguenti otrebbe )ornire una in)or*azione interessante su cosa stia )acendo il Ca itolo 12. Cattura dei segnali 1&$

vostro scri t7
declare -t VARIABILE=valore trap "echo VARIABILE in uso qui." DEBUG # resto dello script

12.2.3.2. &i)ozione della spazzatura all7uscita


Il co*ando -hatis si a oggia ad una base dati che viene regolar*ente costruita utilizzando lo scri t makewhatis.cron con cron7
#!/bin/bash LOCKFILE=/var/lock/makewhatis.lock # Previous makewhatis should execute successfully: [ -f $LOCKFILE ] && exit 0 # Upon exit, remove lockfile. trap "{ rm -f $LOCKFILE ; exit 255; }" EXIT touch $LOCKFILE makewhatis -u -w exit 0

12.3. 3o))ario
2i ossono inviare dei segnali ai vostri rogra**i usando il co*ando !ill o delle scorciatoie da tastiera. 9uesti segnali ossono essere intercettati, a seconda dell:azione che uE essere eseguita, utilizzando l:istruzione trap. 1lcuni rogra**i ignorano i segnali. 8:unico segnale che nessun rogra**a uE ignorare 3 il segnale F)LL/

12.#. ;sercizi
5na co ia di ese* i ratici7

1. 'ealizzate uno scri t che scriva una i**agine di avvio Hboot imageI in un dischetto utilizzando il rogra**a di utilit! dd. 2e l:utente rova ad interro* ere lo scri t usando )trl*), *ostrate un *essaggio che dica che tale azione render! inutilizzabile il dischetto. 2. 'edigete uno scri t che auto*atizzi l:installazione di un acchetto di terze arti di vostra scelta. Il acchetto deve essere scaricato da Internet, deco* resso, estratto dall:archivio e co* ilato se queste azioni sono co* atibili. 2oltanto la reale installazione del acchetto non dovrebbe essere interro* ibile. Ca itolo 12. Cattura dei segnali 1&&

Ca itolo 12. Cattura dei segnali

1&7

2ppendice 2 . Caratteristiche della shell


9uesto docu*ento o))re una anora*ica delle co*uni )unzioni di shell Hle stesse in qualsiasi gusto di shellI e di quelle di))erenti tra le shell H)unzioni caratteristiche delle shellI.

2.1. Caratteristiche co)uni


8e seguenti caratteristiche sono standard in ogni shell. Notate che i co*andi sto , sus end, Wobs, bg e )g sono dis onibili solo su siste*i che su ortano il controllo dei lavori HjobI. Tabella :#1/ Caratteri tiche comuni delle hell )omando T TT e ee X f N ^ ? JK HI `` [[ :: U \var \\ \( \n P bg brea? Significato 'edirige l:e*issione 1ggiunge al )ile 'edirige l:i**issione +ocu*ento [here[ Hredirige l:i**issioneI 6*issione dell:incanala*ento 1vvia il rocesso dietro le quinte 2e ara i co*andi sulla stessa linea .a coincidere qualsiasi carattere nel no*e del )ile .a coincidere un singolo carattere nel no*e del )ile Con)ronta ogni carattere co* reso tra le arentesi 6segue in una sottoshell 2ostituisce l:e*issione del co*ando rico* reso 0irgolettatura arziale Hconsente l:es ansione delle variabili e dei co*andiI 0irgolettatura co* leta Hnessuna es ansioneI [0irgolettatura[ del carattere successivo 5sa il valore della variabile I+ del rocesso No*e del co*ando 6nnesi*o argo*ento Hn da ( a %I Inizia un co**ento 6secuzione dietro le quinte Interruzione nelle istruzioni di ciclo

endice 1 . Caratteristiche della shell

1&"

)omando cd continue echo eval eAec )g Wobs ?ill ne>gr shi)t sto sus end ti*e u*as? unset >ait

Significato Ca*bia directorG Prosegue un ciclo del rogra**a =ostra le e*issioni Calcola degli argo*enti 6segue una nuova shell 6secuzione in ri*o iano =ostra i lavori HjobI attivi /er*ina i lavori in corso /ras)erisce ad un nuovo gru 2litta i ara*etri osizionali 2os ende un rogra**a dietro le quinte 2os ende un rogra**a in ri*o iano /e* orizza un co*ando I* osta o elenca i er*essi dei )ile Cancella de)inizioni di variabili o )unzioni 1s etta il ter*ine di un lavoro dietro le quinte o

2.2. Caratteristiche di((erenti


8a tabella sottostante *ostra le rinci ali di))erenze tra la shell standard HshI, -ourne 1gain 2hell HbashI, Sorn shell H!shI e C shell HcshI. )ompatibilit] delle shell +al *o*ento che -ourne 1gain 2hell 3 un su erinsie*e di sh, tutti i co*andi sh )unzioneranno anche in bash O *a non viceversa. bash ha *olte i@ caratteristiche di er se stesso, e, co*e di*ostrato nella tabella sottostante, *olte di esse sono state incor orate da altre shell. Poich la /urbo C shell 3 un su erinsie*e di csh, tutti i co*andi csh )unzioneranno in tcsh, *a non invece al contrario. Tabella :#. Caratteri tiche differenti delle hell
sh A I file PI81 bash A I0 8I file o PI81 !sh A I0 ure I file I file PI81 csh T I> I8 file Significato;71ione Invito rede)inito d:utente .orzatura redirezione 'edirezione di stdout e stderr verso file

endice 1 . Caratteristiche della shell

1&%

sh

bash MO

!sh

csh MO EcomandoE $home Z b<, bN

Significato;71ione 6s ansione ele*enti in elenco 2ostituzione e*issione del comando incluso +irectorG ersonale HhomeI 2i*bolo directorG ersonale Catasta H tackI della directorG di accesso I* ostazione variabile d:a*biente Possono essere re)erenziati i@ di % argo*enti /utti gli argo*enti co*e arole se arate

EcomandoE $HOME

EcomandoE o A9comando: A9comando: $HOME Z Z], Z<, dirs $HOME Z Z], Z< varN alore e+port varN al ${nn} "$@" $# $?

varN alore e+port var

VARN alore e+port VARN alore ${nnnn}

set varN alore 1ssegna*ento a variabile seten var val

"$@" $# $?

"$@" $# $?

$#argv $status

Nu*ero di argo*enti 2tato d:uscita del co*ando eseguito i@ di recente PI+ del rocesso *esso dietro le quinte i@ di recente , zioni correnti

$! $. file

$! $source file o . file alias +N&.&

$! $. file alias +N. case done esac e+it n for;do source file alias + . s-itch o case end endse+it (espr) foreach noglob alias -t alias -t cmds hashstat rehash unhash

8ettura di co*andi in )ile Il no*e + sta er il co*ando . 2celta tra alternative /er*ine di istruzione di ciclo /er*ine di case o s-itch 5scita con stato Ciclo er *ezzo di variabili Ignora i caratteri di sostituzione nella generazione dei no*i =ostra i co*andi con cancelletto Halias tracciatiI 'icorda la osizione dei co*andi +i*entica la osizione dei co*andi

case done esac e+it n for;do

case done esac e+it n for;do set -f/ set -o nullglob|dotglob| nocaseglob|noglob

hash hash cmds hash -r

hash hash cmds hash -r

endice 1 . Caratteristiche della shell

17(

sh

bash histor. FrecciaSu*In io o >> !str

!sh histor. r r str

csh histor. >> !str

Significato;71ione 6lenca i co*andi recedenti 'i etizione ulti*o co*ando 'i etizione ulti*o co*ando che inizia er [str[ 2ostituzione di [A[ con [G[ nel co*ando i@ recente che inizi er [c*d[, quando eseguito. /est condizioni d:ese* io .ine istruzione if I* osta i li*iti delle risorse 2ta* a la directorG in )unzione 8egge da ter*inale Ignora le interruzioni 'i*uove gli alias Inizia un ciclo until Inizia un ciclo -hile

!cmd:s/x/y/ if " $i 'e( 5# fi ulimit p-d read trap 2 until -hile;do

r x=y cmd

!cmd:s/x/y/

if " $i 'e( 5 # fi ulimit p-d read trap 2 unalias until -hile;do

if 99i==5:: fi ulimit p-d read trap 2 unalias until -hile;do

if 9i==5: endif limit dirs AH onintr unalias -hile

8a -ourne 1gain 2hell ossiede *olte altre caratteristiche qui non elencate. 9uesta tabella 3 solo er darvi un:idea di co*e tale shell incor ori le idee utili rovenienti da altre shell7 qui non ci sono s azi vuoti nella colonna di bash. =aggiori in)or*azioni sulle caratteristiche riscontrabili solo in -ash si ossono rinvenire nelle agine in)o di -ash, nella sezione [-ash )eatures[. 5lteriori in)or*azioni7 +ovreste leggere al*eno un unico *anuale, trattandosi del *anuale della vostra shell. 8a scelta re)erita sarebbe info bash, essendo bash la shell 4N5 e quella i@ se* lice er i rinci ianti. 2ta* atevelo e ortatevelo a casa, studiatevelo ogni volta che avete $ *inuti.

endice 1 . Caratteristiche della shell

171

5lossario
9uesta sezione contiene una anora*ica in ordine al)abetico dei co*andi 5NIF co*uni. =aggiori in)or*azioni sull:uso si ossono trovare nelle agine *an o in)o.

2
aPps .or*atta i )ile er la sta* a in una sta* ante Post2cri t. acroread 0isualizzatore P+.. adduser Crea un nuovo utente o aggiorna le in)or*azioni rede)inite del nuovo utente. alias Crea un alias di shell er un co*ando. anacron 6segue co*andi eriodica*ente, non resu apropos Cerca stringhe nella base dati >hatis. apt'get Progra**a di utilit! er la gestione dei acchetti. aspell Controllo ortogra)ico. at, at(, atrm 1ccoda*ento, esa*e o cancellazione di lavori dell:ulti*a esecuzione. 4lossario 172 one una *acchina se* re in )unzione.

aumi+ 'egola il *iAer audio. HgIa-! 8inguaggio di analisi ed elaborazione di *odelli.

B
bash -ourne 1gain 2hell. batch 1ccoda*ento, esa*e o cancellazione di lavori dell:ulti*a esecuzione. bg .a girare un lavoro dietro le quinte. bitmap 6ditor di bit*a e utilit! di conversione er il 2iste*a F >indo>. b1ipP 5n co* ressore di )ile a ordina*ento di blocchi.

C
cat Concatena )ile e sta* a sull:e*issione standard J tdoutK. cd Ca*bia +irectorG. cdp;cdpla. 5n rogra**a interattivo in *odalit! testuale er controllare e ri rodurre C+ 'o* audio sotto 8inuA. 4lossario 173

cdparanoia 5n:utilit! er la lettura di C+ audio che co* rende caratteristiche eAtra er la veri)ica dei dati. cdrecord 'egistra un C+<'. chattr =odi)ica gli attributi dei )ile. chgrp Ca*bia il gru ch!config 1ggiorna o richiede le in)or*azioni di livello di esecuzione dei servizi di siste*a. chmod =odi)ica i er*essi di accesso ai )ile. cho-n Ca*bia il ro rietario e il gru compress Co* ri*e )ile. cp Co ia )ile e directorG. crontab 4estisce i )ile crontab. csh 1 re una shell C. o di un )ile. o ro rietario.

4lossario

17#

cut 'i*uove sezioni da ciascuna linea di un )ile.

+
date 2ta* a o i* osta la data e l:ora di siste*a. dd converte e co ia un )ile Hdis? du* I. df 'i)erisce l:uso dei dischi del )ile sGste*. dhcpd +e*one del cliente +BCP. diff /rova le di))erenze tra due )ile. dmesg 2ta* a o controlla il bu))er ad anello del ?ernel. du 0aluta l:uso dello s azio dei )ile.

;
echo =ostra una linea di testo. ediff Il diff del traduttere inglese

4lossario

17$

egrep grep esteso. e^ect 2*onta ed es elle su emacs 1vvio dell:editor 6*acs e+ec Invoca sotto rocessi. e+it 5scita dalla shell corrente. e+port 1ggiunge )unzioni all:a*biente della shell. orti re*ovibili.

/
fa+Pps Converte un )acsi*ile /I.. in Post2cri t fdformat .or*atta )lo fdis! 4estore delle tabelle delle artizioni sotto 8inuA. fetchmail raccoglie la osta da server P,P, I=1P, 6/'N o ,+='<co* atibile. fg G dis?.

4lossario

17&

Porta un lavoro in ri*o iano. file 2tabilisce il ti o di )ile. find /rova )ile. formail H'iI.or*attatore di osta. fortune 2ta* a un casuale e, si s era, interessante adagio. ftp 2ervizi di tras)eri*ento )ile Hnon sicuri a *eno che non venga utilizzato un account anoni*oVI.

5
galeon Navigatore internet gra)ico. gdm 4no*e +is laG =anager. Hmin;aIgett. Controlla le unit! di console. gimp Progra**a di *ani olazione delle i**agini. grep 2ta* e linee che corris ondono ad un *odello. 4lossario 177

grub 8a shell di grub g 5n visualizzatore Post2cri t e P+.. g1ip Co* ri*e o es ande un )ile.

F
halt .er*a il siste*a. head 6*ette la ri*a arte dei )ile. help =ostra gli aiuti sui co*andi integrati della shell. host Progra**a di utilit! er vedere +N2. httpd 2erver 1 ache dell:BG er/eAt /rans)er Protocol.

I
id 2ta* a gli 5I+ e 4I+ attuali ed e))ettivi. ifconfig Con)igura l:inter)accia di rete o ne *ostra la con)igurazione.

4lossario

17"

info 8egge i docu*enti In)o. init Inizializzazione dei controlli dei rocessi. iostat =ostra le statistiche I;,. ip =ostra;*odi)ica lo stato delle inter)acce di rete. ipchains 1**inistrazione del )ire>all IP. iptables 1**inistrazione dei )iltri dei acchetti IP.

G
^ar 2tru*ento di archiviazione Yava. ^obs 6lenca le o erazioni dietro le quinte.

H
!dm +es?to *anager Hgestore scrivaniaI er S+6. !illHallI /er*ina i rocessi.

4lossario

17%

!sh 1 re una shell Sorn.

L
ldapmodif. =odi)ica un inseri*ento 8+1P. ldapsearch 2tru*ento di ricerca 8+1P. less more con delle caratteristiche. lilo -oot 8oader Hcaricatore dell:avvioI di 8inuA. lin!s Navigatore CCC in *odalit! testo. ln Crea collega*enti tra )ile. load!e.s Caricale tabelle di traduzione della tastiera. locate /rova )ile. logout Chiude la shell corrente. lp

4lossario

1"(

Invia richieste al servizio di sta* a 8P. lp( Progra**a er esa*inare la coda d:attesa della sta* a. lpr 2ta* a non in linea. lprm 'i*uove richieste di sta* a. ls 6lenca il contenuto delle directorG. l.n+ Navigatore CCC in *odalit! testo.

9
mail Invia e riceve osta. man 8egge le agine *an. mcop. Co ia )ile =2+,2 verso;da 5niA. mdir =ostra una directorG =2+,2. memusage =ostra l:utilizzo della *e*oria.

4lossario

1"1

memusagestat =ostra le statistiche dell:utilizzo della *e*oria. mesg Controlla l:accesso in scrittura al vostro ter*inale. mformat 1ggiunge un )ile sGste* =2+,2 ad un )lo m!bootdis! Crea un )lo m!dir Crea directorG. m!isofs Crea un )ilesGste* ibrido I2,%&&(. more .iltro er *ostrare del testo una scher*ata er volta. mount =onta un )ile sGste* o mo1illa Navigatore di rete. mt Controlla le o erazioni dell:unit! a nastro *agnetico. mtr 2tru*ento di diagnosi della rete. m 4lossario 1"2 ure *ostra in)or*azioni sui )ile sGste* *ontati. G di avvio autosu))iciente ad avviare il siste*a. G dis? )or*attato a basso livello.

'ino*ina )ile.

named 2erver dei no*i di do*inio Internet. ncftp Progra**a di navigazione er servizi )t Hnon sicuroVI. netstat 2ta* a connessioni di rete, tabelle di instrada*ento, statistiche d:inter)accia, connessioni *ascherate e a artenenze a *ultitras*issioni. nfsstat 2ta* a statistiche sui )ile sGste* in rete. nice 1vvia un rogra**a con riorit! di esecuzione *odi)icata. nmap 2tru*ento di es lorazione della rete e scanditore di sicurezza. nts.s 2e* lice inter)accia er con)igurare i livelli di avvio.

P
pass-d Ca*bia ass>ord. pdfPps /raduttore 4hostscri t da P+. a Post2cri t. perl 4lossario 1"3

Practical 6Atraction and 'e ort 8anguage. pg I* agina l:e*issione di testo. ping invia una richiesta di eco ad un host. pr Converte )ile testuali er la sta* a. printen 2ta* a tutto o arte di un a*biente. procmail 6laboratore autono*o di osta. ps 'i orta lo stato dei rocessi. pstree =ostra un albero dei rocessi. p-d 2ta* a la corrente directorG di lavoro HPre ent 5ork Director!I.

<
(uota =ostra l:utilizzo del disco e i li*iti.

&
rcp

4lossario

1"#

Co ia re*ota Hnon sicuroVI. rdes!top Cliente del 'e*ote +es?to Protocol. reboot .er*a e riavvia il siste*a. renice 1ltera la riorit! di un rocesso in )unzione. rlogin 1utenticazione re*ota Htelnet, non sicuroVI. rm 'i*uove un )ile. rmdir 'i*uove una directorG. rpm 4estore di acchetti 'P=. rsh 2hell re*ota

3
scp Co ia re*ota sicura. screen 4estore dello scher*o con e*ulazione 0/1((.

4lossario

1"$

set =ostra, i* osta o *odi)ica una variabile. setterm I* osta gli attributi di un ter*inale. sftp 2ecure Hcri tatoI )t . sh 1 re una shell standard. shutdo-n 2 egne un siste*a. sleep 1ttende er un certo eriodo. slocate 0ersione avanzata di sicurezza del 4N5 locate. slrnn Cliente 5senet in *odalit! testo. snort 2tru*ento er la sco erta di intrusioni in rete. sort 'iordina linee di )ile di testo. ssh 2ecure 2Bell. ssh'!e.gen 4lossario 1"&

4enerazione di chiavi di autenticazione. stt. =odi)ica e sta* a i* ostazioni delle linee di ter*inale. su 2>itch 5ser Hca*bia utenteI.

0
tac Concatena e sta* a )ile al contrario. tail 6*ette l:ulti*a arte di )ile. tal! Parla ad un utente. tar 5tilit! di archiviazione. tcsh 1 re una /urbo C 2Bell. telnet Inter)accia utente al rotocollo /68N6/ Hnon sicuroVI. te+ .or*attazione e i* ostazione ti ogra)ica di testi. time /e* orizza un se* lice co*ando o d! l:uso delle risorse.

4lossario

1"7

tin Progra**a di lettura ne>s. top =ostra i rinci ali rocessi della CP5. touch a*bia le *arcature te* orali dei )ile. traceroute 2ta* a i acchetti di instrada*ento richiesti er collegare in rete un host. trip-ire 5n controllore di integrit! dei )ile er i siste*i 5niA. t-m /ab Cindo> =anager er il siste*a F Cindo>.

6
ulimit Controlla le risorse. umas! I* osta la *aschera della creazione dei )ile degli utenti. umount 2*onta un )ile sGste*. uncompress +eco* ri*e )ile co* ressi. uni(

4lossario

1""

'i*uove le linee du licate in un )ile ordinato. update +e*one del ?ernel er scaricare *e*orie di transito Hbu))erI s orche di ritorno al disco. uptime =ostra il te* o di )unziona*ento ed il carico *edio del siste*a. userdel Cancella l:account di un utente e i )ile relativi.

1
i HmI 1vvia l:editor vi Hi= rovedI. imtutor Il corso di 0i*. mstat 'i)erisce le statistiche della *e*oria virtuale.

I
=ostra chi 3 collegato e cosa sta )acendo. -all Invia un *essaggio sul ter*inale di ognuno. -c 2ta* a il nu*ero di bGte, arole e linee nei )ile. -hich

4lossario

1"%

=ostra il ercorso intero dei co*andi Hdi shellI. -ho =ostra chi 3 collegato. -hoami =ostra l:I+ dell:attuale utente. -hois 6))ettua una ricerca nella basedati >hois o dei no*i nic. -rite Invia un *essaggio ad un altro utente.

:
+auth F authoritG )ile utilitG. +cdroast Inter)accia gra)ica di cdroast. +cloc! ,rologio analogico;digitale er F. +console Controlla i *essaggi della console di siste*a tra*ite F. +dm 4estore dello scher*o F con su +d i 0isualizzatore +0I. orto er F+=CP, selettore di host.

4lossario

1%(

+fs 2erver F dei )ont. +host Progra**a er F di controllo degli accessi al server. +inetd Il de*one esteso dei servizi Internet. +load Presentazione er F della *edia di carico di siste*a. +lsfonts 0isualizzatore er F dell:elenco dei )ont del server. +mms 'i roduttore audio er F. +term 6*ulatore di ter*inale er F.

J
1cat Co* ri*e o es ande )ile. 1grep 'icerca eventuali )ile co* ressi in base ad una es ressione regloare. 1more .iltro er la visione di testo co* resso.

4lossario

1%1

Indice
2
alias 2ezione 3.$.1 alias Hrimo1ione degliI 2ezione 3.$.2 ancore delle parole 2ezione #.2.2.1 ancore di linea 2ezione #.2.2.1 7?SI') (uoting 2ezione 3.3.$ apici singoli 2ezione 3.3.3 argomenti 2ezione 7.2.1.2 espansione aritmetica 2ezione 3.#.7 apici doppi 2ezione 3.3.# arra. 2ezione 1(.2.1 a-! 2ezione &.1 a-!program 2ezione &.1.2

Bourne shell 2ezione 1.1.2 brace e+pansion 2ezione 3.#.3 built'in commands 2ezione 1.3.2

C
caratteri di irgolettatura 2ezione 3.3 case Histru1ioniI 2ezione 7.2.$ cerca e sostituisci 2ezione $.2.# chiamata 2ezione 1.2.2.1 chiamata da remoto 2ezione 1.2.2.2.& child process 2ezione 1.3.1 classi di caratteri 2ezione #.2.2.2, 2ezione #.3.2 comandi integrati 2ezione 1.3.2 combined e+pressions 2ezione 7.1.1.1 command substitution 2ezione 3.#.& commenti 2ezione 2.2.2 compara1ione dei modelli 2ezione #.3 conditionals 2ezione 7.1 condi1ionali 2ezione 7.1 configura1ione Hfile diI 2ezione 3.1 confronti numerici 2ezione 7.1.2.2 costanti 2ezione 1(.1.3 continue 2ezione %.$.2 controllo Hsegnali diI 2ezione 12.1.1.3 corre1ione degli script 2ezione 2.3 crea1ione di ariabili 2ezione 3.2.2 1%2

B
bash 2ezione 1.2 .bash<login 2ezione 3.1.2.2 .bash<logout 2ezione 3.1.2.$ .bash<profile 2ezione 3.1.2.1 .bashrc 2ezione 3.1.2.# batch editor 2ezione $.1.1 brea! 2ezione %.$.1 boolean operators 2ezione 7.2.# Indice

csh 8a C 2Bell, 2ezione 1.1.2

+
debugging scripts 2ezione 2.3 declare 2ezione 1(.1.2, 2ezione 1(.2.1 descrittori dei file 2ezione ".2.3, 2ezione ".2.#.1 di isione delle parole 2ezione 3.#.% double (uotes 2ezione 3.3.#

;
echo 2ezione 1.$.$, 2ezione 2.1.2, 2ezione 2.3.2, 2ezione ".1.2 editors 2ezione 2.1.1 else 2ezione 7.2.1 emacs 2ezione 2.1.1 emissione standard 2ezione ".2.3.1 en 2ezione 3.2.1.1 errore standard 2ezione ".2.3.1 esac 2ezione 7.2.$ escape HcaratteriI 2ezione 3.3.2 escape Hse(uen1eI 2ezione ".1.2 esecu1ione 2ezione 2.1.3 espansione dei nomi dei file 2ezione 3.#.% espansione dei parametri 2ezione 3.#.$ espansione delle parentesi 2ezione 3.#.3 espansione delle ariabili 2ezione 3.#.$ espressioni combinate 2ezione 7.1.1.1 Indice

espressioni primarie 2ezione 7.1.1.1 espressioni regolari 2ezione #.1 espressioni regolari estese 2ezione #.1.3 ;etc;bashrc 2ezione 3.1.1.2 ;etc;pass-d 2ezione 1.1.2 ;etc;profile 2ezione 3.1.1 ;etc;shells 2ezione 1.1.2 e+ec 2ezione 1.3.1, 2ezione ".2.#.2 e+ecute permissions 2ezione 2.1.3 e+ecution 2ezione 2.1.3 e+it 2ezione 7.2.$ e+it status 2ezione 7.1.2.1 espansione 2ezione 1.#.1.$, 2ezione 3.# e+port 2ezione 3.2.3 e+tended regular e+pressions 2ezione #.1.3

/
file descriptors 2ezione ".2.3, 2ezione ".2.#.1 file di ini1iali11a1ione 2ezione 3.1 file name e+pansion 2ezione 3.#.% find and replace 2ezione $.2.# flusso logico 2ezione 1.$.# for 2ezione %.1 for! 2ezione 1.3.1 fun1ioni 2ezione 11.1.1

1%3

5
ga-! 2ezione &.1.1 ga-! HcampiI 2ezione &.2.1 ga-! HcomandiI 2ezione &.1.2 ga-! Hformatta1ioneI 2ezione &.2.2 ga-! HscriptI 2ezione &.2.$ ga-! H ariabiliI 2ezione &.3 gedit 2ezione 2.1.1 global ariables 2ezione 3.2.1.1 globbing 2ezione 2.3.2 grep 2ezione #.2.1

2ezione 1.2.2.3.3 in ito 2ezione 3.1.3 in ocation 2ezione 1.2.2.1

G H
!ill 2ezione 12.1.2 !illall 2ezione 12.1.2 !sh Sorn shell, 2ezione 1.1.2

L
line anchors 2ezione #.2.2.1 locale 2ezione 3.3.& locate 2ezione 2.1.1 logic flo2ezione 1.$.# login shell 2ezione 1.2.2.2.1 lunghe11a di una ariabile 2ezione 1(.3.2

F
here HdocumentoI 2ezione ".2.#.#

I
if 2ezione 7.1.1 if annidati 9istru1ioni di: 2ezione 7.2.3 immissione da utente 2ezione ".2.1, 2ezione ".2.2 immissione standard 2ezione ".2.3.1 init 2ezione 1.3.1, 2ezione 1.$.& initiali1ation files 2ezione 3.1 input field separator 2ezione 3.2.#.1, 2ezione 3.2.$, 2ezione &.3 interacti e editing 2ezione $.2 interacti e scripts 2ezione ".1 interacti e shell 2ezione 1.2.2.2.1, 2ezione 1.2.2.2.2, Indice

9
matrice 2ezione 1(.2.1 menu 2ezione %.& messaggi da utente 2ezione ".1.1 metacaratteri 2ezione #.2.2.3 metacaratteri 9nelle espressioni regolari: 2ezione #.1.2 modifiche interatti e 2ezione $.2 modifiche non interatti e 2ezione $.3

1%#

nested if statements 2ezione 7.2.3 noglob 2ezione 2.3.2 non'interacti e editing 2ezione $.3 non'interacti e shell 2ezione 1.2.2.2.3 non'login shell 2ezione 1.2.2.2.2 numeric comparisons 2ezione 7.1.2.2

2ezione 3.2.1.1 printf 2ezione 1.$.$, 2ezione &.3.& process substitution 2ezione 3.#." processo figlio 2ezione 1.3.1 .profile 2ezione 3.1.2.3 prompt 2ezione 3.1.3

.
operatori aritmetici 2ezione 3.#.7 operatori booleani 2ezione 7.2.# operatori delle espressioni regolari 2ezione #.1.2, 2ezione $.2, 2ezione &.2.# op1ioni 2ezione 3.&.1 output field separator 2ezione &.3.2.1 output record separator 2ezione &.3.2.2

<
(uoting characters 2ezione 3.3

&
redire1ione 2ezione 1.#.1.7, 2ezione 3.&.2, 2ezione ".2.3, 2ezione %.# rbash 2ezione 1.2.2.1( read 2ezione ".2.1 readonl. 2ezione 1(.1.3 regular e+pression operators 2ezione #.1.2, 2ezione $.2, 2ezione &.2.# regular e+pressions 2ezione #.1 remote in ocation 2ezione 1.2.2.2.& remo ing aliases 2ezione 3.$.2 reser ed ariables 2ezione 3.2.# return 2ezione 11.1.3

P
parameter e+pansion 2ezione 3.#.$ parametri posi1ionali 2ezione 3.2.$, 2ezione 11.1.3 parametri speciali 2ezione 3.2.$ 67T_ 2ezione 2.1.2 pattern matching 2ezione #.3 permessi di esecu1ione 2ezione 2.1.3 positionalparams 2ezione 3.2.$, 2ezione 11.1.3 6GSIR 2ezione 1.2.1 6GSIR 9modalit]: 2ezione 1.2.2.2.$ primar. e+pressions 2ezione 7.1.1.1 printen Indice

3
script interatti i 2ezione ".1 sed 2ezione $.1 sed Hcomandi di modificaI 2ezione $.1.2 sed Hop1ioniI 2ezione $.1.2 1%$

sed HscriptI 2ezione $.3.2 segnali 2ezione 12.1.1 select 2ezione %.& separatore dei campi d&emissione 2ezione &.3.2.1 separatore dei campi d&immissione 2ezione 3.2.#.1, 2ezione 3.2.$, 2ezione &.3 separatore dei record in uscita 2ezione &.3.2.2 set 2ezione 3.2.1.2, 2ezione 3.&.1, 2ezione 11.1.# shell di autentica1ione 9o di login: 2ezione 1.2.2.2.1 shell interatti a 2ezione 1.2.2.2.1, 2ezione 1.2.2.2.2, 2ezione 1.2.2.3.3 shell non di autentica1ione 9o di login: 2ezione 1.2.2.2.2 shell non interatti a 2ezione 1.2.2.2.3 shift 2ezione %.7 single (uotes 2ezione 3.3.3 sintassi 2ezione 1.#.1.1 sorgente 2ezione 2.1.3 sostitu1ione 2ezione 1(.3.3.1, 2ezione 1(.3.3.3 sostitu1ione dei comandi 2ezione 3.#.& sostitu1ione dei processi 2ezione 3.#." sottostringa 2ezione 1(.3.3.2 source 2ezione 2.1.3 special parameters 2ezione 3.2.$ standard error 2ezione ".2.3.1 standard input 2ezione ".2.3.1 standard output Indice

2ezione ".2.3.1 stato d&uscita 2ezione 7.1.2.1 stringa 2ezione 7.1.2.3 stt. 2ezione 12.1.1 submenu 2ezione %.&.2 subshell 2ezione 2.2.1 substring 2ezione 1(.3.3.2

0
tcsh 2ezione 1.1.2 terminologia 2ezione 1.$.3 then 2ezione 7.1.1.2 tilde Hespansione dellaI 2ezione 3.#.# trasforma1ione di ariabili 2ezione 1(.3.3 trappole 2ezione 12.2.1 true 2ezione %.2.2.2

6
unalias 2ezione 3.$.1, 2ezione 3.$.2 unset 2ezione 3.2.2, 2ezione 1(.2.3, 2ezione 11.1.# until 2ezione %.3 user input 2ezione ".2.1, 2ezione ".2.2 user messages 2ezione ".1.1

1
ariabili 2ezione 3.2, 2ezione 1(.1 ariabili globali 2ezione 3.2.1.1 1%&

ariabili riser ate 2ezione 3.2.# ariabili speciali 2ezione 3.2.$ ariable e+pansion 2ezione 3.#.$ erbose 2ezione 2.3.2 i HmI 2ezione 2.1.1 irgolettatura 7?SI') 2ezione 3.3.$

I
-ait 2ezione 12.2.2 -hereis 2ezione 2.1.1 -hich 2ezione 2.1.1 -hile 2ezione %.2 -ildcards 2ezione #.2.2.3 -ord anchors 2ezione #.2.2.1 -ord splitting 2ezione 3.#.%

:
+trace 2ezione 2.3.1, 2ezione 2.3.2

K J

Indice

1%7

Você também pode gostar