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

1

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

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

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

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

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. *entre la guida -ash scri ting 3 eccessiva co*e o era di ri)eri*ento.8inuA. init e initscri t Creare utenti e gru i. i* ostare ass>ord Introduzione 7 . ossono trarre bene)icio dalla lettura di questo libro. Non esiste nulla tra i due estre*i. sebbene non se* re *olto seria. ancora eggio. /ale roble*a 3 un altro a cui si otr! orre ri*edio con questa guida. 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. 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. co*e gli utenti voluti e gli a**inistratori. sebbene dovrebbe essere cosD. senza avere la *ini*a conoscenza di auto*azione dei co* iti. Chi dovrebbe leggere questo libro? Chiunque voglia se* li)icarsi la vita lavorando su un siste*a 5NIF o si*il<5NIF. tenta di )ornire ese* i di vita reale iuttosto che teorici. a**inistratrice di siste*a e docente. Perché questa guida? Il *otivo rinci ale er la scrittura di questo docu*ento 3 che *olti lettori avvertono che l:esistente B.Introduzione 1. Bo scritto ure questa guida sul rinci io generale che non sono dis onibili abbastanza corsi ele*entari liberi.C/. Prerequisiti. Potrete leggere questo genere di argo*enti do o aver ter*inato questo libro. so che la gente uE avere anni di interazione quotidiana con i ro ri siste*i. CosD ensano )requente*ente che 5NIF non sia alla ortata degli utenti e. 3 tro o breve ed inco* leto B. 9uesta 3 una guida ratica che. 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. ratico dei co*andi di base. 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. +alla *ia es erienza di utente 5NIF.non in questo corso7 • • • • +ovreste essere un utente es erto di 5NIF o 8inuA. In articolare l:ho scritta erché non *i a))ascinano ese* i ri resi ed eccessiva*ente se* li)icati.C/. che contiene esercizi ed ese* i che vi aiuteranno a so ravvivere nel *ondo reale. 2. ricevono l:i* ressione che sia lento e )uori *oda..

h ... il *ontaggio e lo s*ontaggio dei )ile sGste* 1ggiungere.org. 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. Figura 1.8+P7-ashMbeginnersMguide 5na traduzione )rancese 3 in corso e verr! aggiunta ai collega*enti non a ena sar! ter*inata.co*.• • • Per*essi. 9uesta guida 3 dis onibile Jin ingleseK sta* ata resso . *odalit! s eciali Co* rendere le convenzioni dei no*i delle eri)eriche. #.edevGch ed il suo gru o su htt 7.ua. • traduzione ucraina di Laroslav . 3.bash.ultus. Potreste trovare la stessa versione su htt 7.ht*l. La copertina anteriore di “Bash Guide for beginners” 9uesta guida 3 stata tradotta7 • traduzione cinese di Cang Cei su htt 7.Aiao>ang.org.indeA.tille. il artiziona*ento.tld ..-ash<-eginners<4uide.. Cronologia delle revisioni Cronologia delle revisioni Introduzione " .8+P.garrels..training.net.bgb<cn.docs.linuA.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.be. uove versioni! traduzioni e disponibilit" 8:edizione i@ recente si uE trovare su htt 7.indeA.ht*l.

& Correzioni *inori.7 Corretti errori ti ogra)ici nei ca itoli 3. er gli ese* i sulle *atrici • 4erg . er aver )atto s azio • PlinuA. 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. tolta un:i**agine vuota. veri)iche generali e correzione degli errori ti ogra)ici. in)or*azioni su nuova -ash 3. 6 viceversa N<I Introduzione % . & e 7. 'evisione 1. er aver tenuto i *iei iedi a terra • . aggiunte i@ arole chiave. 'evisione 1. uno dei gru etti • =i?e 2i*. 'evisione 1.11 /rattate le segnalazioni dei lettori. aggiunti i collega*enti alle traduzioni cinese e ucraina. aggiunta una nota nel ca itolo 7. ese* i e co**enti O di cui )ra gli altri tantissi*i7 • Bans -ol. 4razie a tutte le ersone che hanno inviato segnalazioni di errori. '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. chiarito ese* io nel Ca itolo #. aggiunto indice utilizzando le etichette +oc-oo?. incor orati dei co**enti dei letttori. corretto doc here nel ca itolo %.or*ia*o una bella squadra7 lei lavora quando io dor*o.1( Ca*bio di indirizzi 'evisione 1. co**enti sullo stile • +an 'ichter.(<beta Pre<rilascio $. che si 3 dedicata volonterosa*ente a svolgere una revisione ed un controllo ortogra)ico e gra**aticale co* leti. er i suoi dettagliati co**enti sulle cose che ho sbagliato a )are N<I 'ingrazia*enti s eciali a /abatha =arshall.'evisione 1. er le idee sul titolo • =endel 8eo Coo er.(. note ed altro da sa ere su a>? nel ca itolo &.% 'evisione 1.ran? Cang.be.erguson. *eno errori e aggiunta del glossario 'evisione 1. .( 0ersione iniziale er 8+PN i@ esercizi. i@ *arcature.

THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES. * Redistributions in binary form must reproduce the above copyright notice.directorG. with or without modification. /uttavia le in)or*azioni contenute in questo libro sono o))erte senza garanzia. WHETHER IN CONTRACT. BUT NOT LIMITED TO. caratteri sco* arsi. Machtelt Garrels. are permitted provided that the following conditions are met: * Redistributions of source code must retain the above copyright notice. * Neither the name of the author. SPECIAL. Né l:autrice. nor the names of its contributors may be used to endorse or promote products derived from this software without specific prior written permission. INCLUDING.gnu. Redistribution and use in source and binary forms. THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution. 8inuA =2 Cindo>s ed ad altri siste*i. *. this list of conditions and the following disclaimer. &iscontri In)or*azioni *ancanti. INCIDENTAL.%. Introduzione 1( . '. dis onibile su htt 7. sia es ressa che tacita. 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. collega*enti assenti. BUT NOT LIMITED TO. I loghi. IN NO EVENT SHALL THE AUTHOR AND CONTRIBUTORS BE LIABLE FOR ANY DIRECT. 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. In(or)azioni sui diritti * * * * * * * * * * * * * * * * * * * * * * * * Copyright (c) 2002-2007.. 8:autrice e l:editore hanno )atto ogni s)orzo nella re arazione di questo libro er assicurare l:accuratezza delle in)or*azioni. 6: )acile da co* ilare se ve ne serve una vostra. LOSS OF USE. OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE. note? Inviateli a <tille non vuole spam _at_ garrels punto be> la *anutentrice di questo docu*ento. STRICT LIABILITY. i *archi co**erciali e i si*boli utilizzati in questo libro sono ro riet! dei ris ettivi titolari. DATA. PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES. INDIRECT. +i cosa avete bisogno? Bash.org. OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY. OR PROFITS. collaudata su una grande variet! di 5NIF. EXEMPLARY. OR CONSEQUENTIAL DAMAGES (INCLUDING. EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. Machtelt Garrels All rights reserved..4N5.>>>.

S. se vedete un co*ando lungo che 3 suddiviso in i@ righe. comando VARIABILE opzione argomento comando opzioni argomenti nomefile Tasto -ottone =enu<T2celta Terminologia U v. Collega*ento cliccabile ad una risorsa di rete esterna. 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. sintassi dei co*andi od utilizzo in generale nella riga di co*ando No*e di un )ile o di una directorG. co*e in $NOMEVAR. 2celta da e))ettuare in un *enu gra)ico. -ottone gra)ico da re*ere. er ese* io QCa*biate verso la directorG /usr/binR.. 2ebbene sia richiesta una conoscenza di base dell:uso della shell. U signi)ica QNon re*ete ancora In ioVR. I ca itoli dal quattro al sei sono trattazioni sugli stru*enti base che vengono nor*al*ente i* iegati Introduzione 11 . noi iniziere*o con la discussione sui co* onenti ele*entari della shell e con esercizi nei ri*i tre ca itoli. co*e in Qleggete man lsR. solita*ente reso con uno s)ondo grigio chiaro. . No*e di un co*ando che uE essere inserito nella riga di co*ando. Ingresso ed uscita dati letterale del co* uter catturati dal ter*inale. 1rgo*ento di un co*ando. Ca itolo 1 8:autore 1-. Collega*ento al relativo argo*ento contenuto in questa guida. No*e di una variabile o di un untatore ad un contenuto della variabile. /er*ine o concetto i* ortante7 QIl kernel di 8inuA costituisce il cuore del siste*aR..rganizzazione di questo docu)ento 9uesta guida tratta concetti utili nella vita quotidiana del serio utente di -ash. /asti da battere sulla tastiera.ire)oA nel vostro navigatore di reteR. co*e Qbattete Q er ter*inareR. risultato del co* uter tra virgolette. . In altre arole. co*e in Ql:o zione -a del co*ando lsR. 8a sbarra inversa in una vista di ter*inale o nella sintassi di un co*ando indica una riga non ter*inata. zione di un co*ando. er ese* io Q2cegliete 4uida< TIn)or*azioni su =ozilla . co*e il bottone .

variabili. • Ca itolo 37 8:a*biente di -ash7 )ile di inizializzazione. • Ca itolo &7 1>?7 introduzione al linguaggio di rogra**azione a>?. • Ca itolo 17 'udi*enti di -ash7 erché -ash 3 cosD valida. • Ca itolo 117 . I ca itoli dall:otto al dodici si occu ano dei i@ co*uni costrutti degli scri t di shell. • Ca itolo $7 2ed7 una introduzione all:editor di linea sed. alias. introduzione alle *atrici delle variabili. Introduzione 12 .unzioni7 una introduzione. ri*e linee guida nello svilu o di buoni scri t. caratteri virgolettati. /utti i ca itoli hanno degli esercizi che veri)icheranno la vostra re arazione er quelli successivi. o zioni. • Ca itolo 27 'udi*enti di scri t7 scrittura e correzione. • Ca itolo 1(7 0ariabili avanzate7 s eci)icare i ti i delle variabili.negli scri t di shell. • Ca itolo 127 Cattura dei segnali7 introduzione alle segnalazioni dei rocessi. • 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 #7 6s ressioni regolari7 una introduzione. costruzione di blocchi. segnali di cattura inviati dagli utenti. o erazioni su variabili. ordine di es ansione della shell.

1 arte il assaggio dei co*andi al ?ernel.2I *entre un co* ilatore converte un rogra**a in un )or*ato leggibile dalla *acchina. che uE essere con)igurato individual*ente usando i )ile di con)igurazione delle risorse di shell. intuitiva e )lessibile. il co* ito rinci ale di una shell 3 di )ornire un a*biente er l:utente. 3 ancora dis onibile in ogni siste*a 8inuA er co* atibilit! con i rogra**i 5NIF.Capitolo 1. che vengono i* artiti diretta*ente dall:utente. 9uesta 3 la shell base. • bash o -ourne 1gain 2hell7 la shell 4N5 standard. un iccolo rogra**a con oche )unzionalit!. o che ossono essere letti da un )ile chia*ato scri t di shell o rogra**a di shell. -ash e gli scri t di -ash 13 .1.1. Co)uni progra))i della shell 1.2. 2ebbene questa non sia la shell standard. 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. non co* ilati. In 8inuA bash 3 la shell standard er gli utenti co*uni. 8a shell legge i co*andi dallo scri t riga er riga e cerca quei co*andi nel siste*a Hv.1. un )ile eseguibile O che oi otrebbe essere utilizzato in uno scri t di shell. CiE signi)ica che la -ourne 1gain 2hell 3 co* atibile con la -ourne7 i co*andi che )unzionano con sh. un insie*e di aggiunte e lug<in. 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. 1.1. 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. 0ipi di shell Pro rio co*e le ersone che conoscono di))erenti linguaggi e dialetti. 2ezione 1. 9uesta shell 3 un cosiddetto uper et della shell -ourne. Ca itolo 1. /unzioni generali di shell Il rogra**a 5NIF di shell inter reta i co*andi degli utenti. 4li scri t di shell sono inter retati.

9uesto 3il *otivo er cui qualcuno la chia*a /urbo C shell. 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. 1antaggi della Bourne 2gain 3hell 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.))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. studio. -ash e gli scri t di -ash 1# .2.I2. l:attuale shell l:attiva ed essa viene eseguita. Ca itolo 1. -ash uE )ar girare la *aggior arte degli scri t sh senza *odi)iche. *atrici indicizzate di di*ensione illi*itata e un:arit*etica degli interi in qualsiasi base da due a sessantaquattro. . co ia. • !sh o Sorn shell7 talvolta a rezzata da ersone con es erienze 5NIF.2 2hell and /ools. *odi)ica e redistribuzione del so)t>are.1. roteggere e ro*uovere la libert! di uso. 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. 9uesto era anche il caso del rogra**a bash. %%#$.2IF P1((3. )unzioni di shell e alias. 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.)unzionano ure con bash. Co*e gli altri rogetti 4N5. il controllo dei Wob. -ash 3 una shell co* atibile con sh che incor ora utili )unzionalit! rovenienti dalle shell Sorn H?shI e C HcshI. /alvolta ricercata dai rogra**atori. • csh o C shell7 la sintassi di questa shell a quella del linguaggio di rogra**azione C. • tcsh o /6N6F C shell7 un su erinsie*e della co*une C shell. 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. 6: rogettata er con)or*arsi allo standard I666 P.2. l:iniziativa bash 3 iniziata er *antenere. con *igliora*enti nella )acilit! d:uso e nella velocit!. una cronologia dei co*andi dalle di*ensioni illi*itate. che ha *olte lici )unzionalit! eAtra che altre shell non sono in grado di o))rire. 6: general*ente noto che queste condizioni sti*olano la creativit!.2.

2. -ash e gli scri t di -ash 1$ . 8a shell non sta )unzionando erché uno scri t 3 stato attivato. ~/.2. Chia)ata co)e shell di login interattiva! o con 788login7 Interattivo signi)ica che otete inviare dei co*andi. .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. bash cerca il successivo. 1. 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. quando a rite un ter*inale usando una icona o una voce di *enu. Per ese* io.bash_profile.1. . questa 3 una shell non di login.2.1. 8e seguenti sottosezioni descrivono dei *odi di))erenti er avviare la shell e i relativi )ile di avvio che vengono letti. 1.ile letti7 Ca itolo 1. esistono diverse o zioni *ulticarattere che otete usare.ile letti7 • /etc/profile • ~/.2.2. /unzionalit" riscontrabili solo in bash 1. 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.2.2.2. 2e un )ile non esiste.bash_login o esistente ure ~/.profile7 viene letto il ri*o )ile • ~/.2.2. 1.2. Chia)ata co)e shell interattiva non di login 2hell non di login signi)ica che non dovete autenticarvi nel siste*a. 5na shell di login signi)ica che avete una shell do o l:autenticazione nel siste*a.2. 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. nor*al*ente dando il vostro no*e utente e la ass>ord.1.2.2. -ash )eatures< TInvo?ing -ash.

-ash e gli scri t di -ash .ile letti7 • de)inito da BASH_ENV PATH non viene utilizzato er ricercare questo )ile.2IF.#. ~/. 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.2.2. . 1. -ash tenter! quindi di attenersi il i@ ossibile allo standard P.2. la variabile ENV aggiuntive. 1.2. Ca itolo 7 er *aggiori in)or*azioni sul costrutto i).ile letti7 • /etc/profile • ~/.profile 9uando chia*ata interattiva*ente.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.2.2.$.bashrc$ fi 0. Chia)ata non interattiva /utti gli scri t usano shell non interattive. 9odalit" P.bashrc 9uesto )ile nor*al*ente si ri)erisce a ~/. 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. *eglio ri)erirsi ad esso dando il ercorso ed il no*e co* leti.2.2. se volete usarlo. .• ~/. 2i ottiene la stessa cosa i* ostando la variabile 1& Ca itolo 1.2.2IF er le shell.3. cosicché.bashrc #$ then . uE untare ad in)or*azioni di avvio 1.bash_profile7 if " -f ~/.

. Ca itolo 3I.2. rsh e rcp7 sono intrinseca*ente insicuri oiché i dati con)idenziali vengono inviati in chiaro sulla rete.>>>. tras)eri*ento )ile e cosD via in re*oto. 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.POSIXLY_CORRECT. -ash e gli scri t di -ash 17 .'.2. 3hell interattive 1.2.3. nota co*une*ente co*e 22B. Il co* orta*ento interattivo di -ash inizia quando il co*ando bash viene chia*ato senza argo*enti rivi di o zioni.2.3. Chia)ata quando 6I+ non 4 uguale a . utilizzate un:i* le*entazione di 2ecure 2hell.2.2.6I+ 5n questo caso non viene letto alcun )ile d:avvio. Chia)ata da re)oto File letti quando chiamata da rshd7 • ~/.3. 1. <uesta 4 una shell interattiva? 0eri)icate osservando il contenuto dello s eciale ara*etro -7 contiene una :i: quando la shell 3 interattiva.1. 2ono dis onibili anche diversi rogra**i cliente er siste*i non 5NIF7 consultate il vostro *irror locale di so)t>are.2. eddy:~> echo $himBH Ca itolo 1.o enssh. 1.2.org.2.2. 1.bashrc % itate l&uso di r'tools 2tate attenti ai ericoli (uando utilizzate stru*enti co*e rlogin.ile letti7 • de)inito da BASH_ENV..2. 2e vi servono stru*enti er esecuzioni.2.%.dis onibile libera*ente su htt 7. telnet. 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.2.

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

%.2.$. v.2. 4li alias vengono es ansi quando viene letto un co*ando. allora il descrittore dei )ile N 3 selezionato. Ca itolo 12 er un di i@ sui segnali.& • v. Ca itolo 3. 0i serve solo un oggetto.2. 8e es ressioni ossono essere unarie o binarie. 2e l:argo*ento di FILE di uno degli unari 3 del ti o /dev/stdin. 8e es ressioni condizionali sono trattate in dettaglio nel Ca itolo 7. 6sistono ure degli o eratori di stringa e degli o eratori di con)ronto nu*erico7 questi sono o eratori binari. con una delle es ansioni della shell o con l:integrato let. Le espressioni condizionali 8e es ressioni condizionali vengono usate dal co*ando co* osto JJ e da test e dai co*andi integrati J. 4li o eratori e le loro recedenze e co*binazioni sono le stesse del linguaggio C. Il calcolo viene svolto con interi di di*ensione )issa senza controllo degli eccessi. =aggiori in)or*azioni sui descrittori dei )ile nella 2ezione ". 1. 1 o 2. 1.• 2ezione 3.#.2.dev/stderr. 8e es ressioni unarie vengono s esso utilizzate er esa*inare lo stato di un )ile. -ash e gli scri t di -ash 1% . non quando viene eseguito.2. 9uindi una de)inizione di alias che a are nella stessa linea co*e altro co*ando Ca itolo 1. 8a shell conserva un elenco degli alias che uE essere abilitato e disabilitato con i co*andi alias e unalias. sebbene la divisione er ( venga intercettata e segnalata co*e un errore.2. 1. 2e l:argo*ento di FILE di uno degli unari 3 nella )or*a /dev/fd/N. er realizzare l:o erazione.3. /dev/stdout o . 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. -ash legge se* re al*eno una linea di ingresso co* leta ri*a di eseguire uno qualsiasi dei co*andi di quella linea. er ese* io un )ile.# tratta le varie es ansioni eseguite con l:inseri*ento di un co*ando. 2rit)etica della shell 8a shell consente di calcolare delle es ressioni arit*etiche. allora 3 ris ettiva*ente selezionato il descrittore dei )ile (. • 2ezione 3. che richiedono due ele*enti er co* letare l:o erazione.2.

2.. Le )atrici -ash )ornisce variabili di *atrici *onodi*ensionali. 0.2. Ca itolo 1(.'. 1.2. +i conseguenza.$.non ha alcun e))etto )inché non viene letta la successiva linea di ingresso.2. Pila di director= 8a ila di directorG Jdirector! tackK 3 un elenco delle directorG visitate di recente. 1.2.1-. I contenuti ossono essere *ostrati dando il co*ando dirs o selezionando il contenuto della variabile DIRSTACK.2. -ash e gli scri t di -ash 2( . 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. 4li alias vengono es ansi quando viene letta una de)inizione di )unzione. 8e *atrici artono dallo zero.2.non quando viene eseguita la )unzione. +iscutere*o degli alias in dettaglio nella 2ezione 3. 1. 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.. ENV o BASH_ENV. la 2ezione Controllare l"invito nelle agine in)o di -ash. 9ualsiasi variabile uE essere usata co*e una *atriceN l:integrato declare dichiarer! es licita*ente una *atrice. 5lteriori in)or*azioni sul )unziona*ento di questo *eccanis*o si si uE trovare nelle agine in)o di -ash. gli alias de)initi in una )unzione non sono dis onibili solo do o che la )unzione 3 eseguita. 0.2. erché una de)inizione di )unzione 3 di er sé stessa un co*ando co* osto. I co*andi che seguono la de)inizione dell:alias in quella linea non vengono in)luenzati dai nuovi alias. 1. Ca itolo 1. L7invito -ash rende se* re i@ divertente giocare con l:invito J promptK. 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.

• 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. 5na variabile ha un valore e zero o i@ attributi.1. Per quanto riguarda la shell.spansione della shell 8:es ansione della shell viene attuata do o che ciascuna linea di co*ando 3 stata divisa in )ra**enti. 9uando il no*e di una )unzione di shell 3 utilizzato co*e un se* lice no*e di co*ando.1. /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.1. Ca itolo 1.3.#.$. Para)etri della shell 5n ara*etro 3 un:entit! che contiene valori. 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. una variabile 3 un ara*etro che conserva un no*e. un nu*ero o un valore s eciale. 0engono eseguiti ro rio co*e un co*ando QregolareR.2. *entre l:uso avanzato delle variabili nel Ca itolo 1(. . 8e variabili si creano con il co*ando integrato alla shell declare. PuE essere un no*e. 8:assegna*ento alle variabili 3 trattato nella 2ezione 3.#. 2e non 3 stato dato un valore. 1. 1. 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. alla variabile viene assegnata una stringa vuota. viene eseguito l:elenco dei co*andi associati con tale )unzione.#. 8e variabili ossono essere eli*inate solo con l:integrato unset.#.#. -ash e gli scri t di -ash 2# .

-ash )a ciE co*e segue7 • controlla se il co*ando contiene delle barre. 2e non risulta alcun no*e di co*ando. i suoi dati in ingresso ed uscita otrebbero essere rediretti utilizzando una s eciale notazione inter retata dalla shell. né un integrato.'. -ash e gli scri t di -ash 2$ . 8a redirezione uE essere usata anche er a rire e chiudere )ile del corrente a*biente di esecuzione della shell.1.1. 0engono oi eseguite le redirezioni. le variabili in)luenzeranno l:attuale a*biente di shell. 1. • se l:esecuzione )allisce erché il )ile non 3 eseguibile e non 3 una directorG.2. 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. &edirezioni Pri*a dell:esecuzione di un co*ando. 5na arte i* ortante dei co* iti della shell 3 la ricerca dei co*andi. oi guarda in P1/B se non 3 ossibile trovare l! il )ile. controlla se c:3 nell:elenco degli integratiN • se il co*ando non 3 né una )unzione. 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.#. • se la ricerca riesce o il co*ando contiene delle sbarre. 1. quindi le stringhe assegnate alle variabili vengono es anse. one che sia • se il co*ando non 3 stato iniziato in *odo asincrono.3. 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.#. si su uno scri t di shell. 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. 2e non 3 cosD.1. lo ricerca analizzando le directorG elencate in PATH.1. Ca itolo 1. la shell as etta il co*ando er co* letare e raccogliere il suo stato di uscita. /ale shell er ri*a cosa cerca il )ile di scri t nella directorG corrente. • se la ricerca non riesce. la shell esegue il co*ando in un a*biente di esecuzione se arato. ciE creer! una shell non interattiva. bash sta* a un *essaggio di errore e restituisce uno stato di uscita di 127.secuzione dei co)andi 9uando un co*ando 3 in esecuzione.%. -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. .

1. Propriet" dei buoni script 9uesta guida 3 rinci al*ente sull:ulti*o *attone considerazioni generali ri*a di continuare7 1. un controllo dei )lussi e l:e))icienza.$. #. 3viluppare buoni script 1.$. 1nche se in -ash viene garantita *olta libert!. 2tato di uscita di rova er deter*inare se una arte del rogra**a debba essere eseguita. 3. 1lcune 5no scri t dovrebbe girare senza errori. 4li scri t dovrebbero essere riutilizzabili. cosicché gli utenti che )anno )unzionare lo scri t lo ossano )are in *odo )acile e corretto. -ash e gli scri t di -ash 2& .$. 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. 1. tutti questi siste*i avranno tali co*andi nelle versioni richieste? • all:utente serve una qualche noti)ica? quando e erché? 1. voi dovete assicurare una logica corretta.1.3. er costruire la shell. Ca itolo 1. 5no scri t non svolge necessaria*ente un lavoro. 8a logica del rogra**a 3 chiara*ente de)inita e visibile.$. +ovrebbe eseguire il co* ito a cui 3 destinato. 1ll:inizio di un nuovo scri t. $.2. 3truttura 8a struttura di una scri t di shell 3 *olto )lessibile. 2. 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. gli scri t.

2tilare un elenco dettagliato dei co* iti i* licati in un rogra**a vi er*ette di descrivere ciascun rocesso. 5scita 8:utente dovrebbe )ornire in)or*azioni al rogra**a er )are qualcosa. Inserire il no*e della directorG che contiene le registrazioni da ruotare. 9uesto 3 il ri*o asso quando si svilu a uno scri t. andare al asso 3.#. +eter*ina la sequenza logica dei co* iti in *odo che il risultato sia corretto e controllato. 3. 2i vuole ruotare le registrazioni? aI 2e sD7 i. bI 2e no. Inserire il no*e dell:archivio del )ile di registro. controllato dal nu*ero di )ile di registro che desiderate ruotare7 1.lusso logico Jlogic flo$K Inseri*ento da utente Ju er inputK 2alto condizionale Jconditional branchK 8a struttura generale del rogra**a.sh qui sotto esegue alcuni co*andi ben noti H date/ -/ uname/ uptimeI Ca itolo 1. 'endere le *odi)iche er*anenti nel )ile crontab dell:utente. bI 2e no7 andare al asso 3. 9uesto ese* io un ossibile ciclo ri etitivo. 6n ese)pio di script di Bash> )iosiste)a.$. 2uccessiva*ente. 2.$. -ash e gli scri t di -ash 27 . 6na parola su ordine e logica Per velocizzare il rocesso di svilu o.$. +escrive la rotazione dei )ile di registro Hlog fileI. 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. 0olete ruotare un altro insie*e di registrazioni? aI 2e sD7 ri etere il asso 1.. 1. otrete ri* iazzare i co*andi del linguaggio quotidiano con le arole e i costrutti del linguaggio di shell. ii. iii. Punto logico del rogra**a in cui unna condizione deter*ina cosa avviene do o. 2ingoli co* iti ossono essere re)erenziati con il loro nu*ero di elenco. 8:ese* io sottostante *ostra tale de)inizione del )lusso logico. In)or*azione )ornita da una )onte esterna *entre il rogra**a 3 in esecuzione7 uE essere conservata e richia*ata quando serve.sh 8o scri t miosistema. l:ordine logico di un rogra**a dovrebbe essere ensato in antici o. 1. Possono essere usati nu*erosi *etodi7 uno dei i@ co*uni 3 quello di lavorare con liste. 8:inseri*ento dei dati da utente deve essere ottenuto e conservato. 8:utente dovrebbe essere avvisato che il suo crontab verr! *odi)icato.

" 4 5 echo "Ciao. 13. 1& e 2( si trovano l! solo a sco o di *ostrare i risultati in *odo ordinato.\n\n" printf "Questa è l'informazione di uptime:\n" Ca itolo 1. Il programma inizia ora. 8e linee &. 8a linea 1% o))re le in)or*azioni di u ti*e e del carico. 8a linea " sta* a la data attuale ed il nu*ero della setti*ana.sh 1 #!/bin/bash 2 clear 3 echo "Queste sono informazioni sono fornite da miosistema. questa è la settimana n.sh. 8a linea $ saluta l:utente. +o o di ciE. $USER\n\n" printf "La data odierna è `date`.sh #!/bin/bash clear printf "Queste sono informazioni sono fornite da miosistema.sh. Il programma inizia ora.| grep -v USER | sort -u printf "\n" printf "Questo è `uname -s` che gira in un processore `uname -m`." 9 echo 10 11 echo "Questi sono gli utenti attualmente collegati:" 12 w | cut -d " " -f 1 . 9uesto 3 lo stesso scri t che utilizza l:integrato printf7 tom:~> cat -n miosistema.er *ostrare delle in)or*azioni su di voi ed il vostro siste*a. 8a linea 11 3 nuova*ente un *essaggio in)or*ativo co*e le linee 3.\n\n" printf "Questi sono gli utenti attualmente collegati:\n" w | cut -d " " -f 1 .\n" printf "Ciao. 1" e 22. 2ia echo che printf sono dei co*andi -ash integrati. $USER" 6 echo 7 8 echo "La data odierna è `date`. questa è la settimana n. %. 8a linea 3 )a sD che sta* i un *essaggio in)or*ante l:utente su cosa sta er avvenire. -ash e gli scri t di -ash 2" . `date +"%V"`. 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. *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. 3 de)inita la shell che eseguir! i co*andi susseguenti la ri*a linea. QPVR. `date +"%V"`.8K.| grep -v USER | sort -u 13 echo 14 15 echo "Questo è `uname -s` che gira in un processore `uname -m`. 9uesto scri t inizia alla linea 2 con la ri ulitura dello scher*o. 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. tom:~> cat -n miosistema." 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.

Ca itolo 1. er svolgere dei co* iti a**inistrativi.rd/init. +: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. il de*one della gestione dell:ali*entazione H po$er management daemonI.$. vengono conservati in una locazione s eci)ica del vostro siste*a. I co* iti da svolgere er avviare o )er*are un servizio sono elencati negli scri t di avvio. 5n livello di esecuzione 3 una con)igurazione di rocessi7 ogni siste*a ha un livello di esecuzione singolo utente. legge i suoi )ile di con)igurazione e decide quali servizi avviare o )er*are in ciascun livello di esecuzione. 9uesti scri t.d # Link in rc3.au > /dev/audio .. conosciuti anche co*e scri t di avvio H tartup criptI.qualsiasi errore otrebbe deter*inare l:uscita re*atura dello scri t se non ensate a ciE. ad ese* io.se)pio di script init 5no scri t init avvia i servizi di siste*a nelle *acchine 5NIF e 8inuA.d/init. . i de*oni dei no*i e della osta sono degli ese* i co*uni.bin.d o /etc/init. 6osi1ione standard della Bourne 7gain shell CiE i* lica che il rogra**a bash sia installato in . )ornite i no*i dei ercorsi interi e ridirigete dati in uscita ed errori. Il de*one del registro di siste*a H ! tem log daemonI. il rocesso iniziale. vi serve u7na buona co* rensione delle rocedure di avvio e s egni*ento del vostro siste*a. 2icco*e la shell gira in *odo non interattivo. Se non 4 disponibile stdout 2e eseguite uno scri t da cron. I ca itoli seguenti tratteranno i dettagli degli scri t qui so ra.au > /dev/audio .%.d/K01audio-greeting case "$1" in 'start') cat /usr/share/audio/at_your_service.d/S99audio-greeting and rc0. 9uando a))rontate questo co* ito. in *odo che quei servizi vengano avviati e )er*ati al *o*ento giusto.d.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 ". -ash e gli scri t di -ash 2% . co*e /etc. 1. 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. Init. 'stop') cat /usr/share/audio/oh_no_not_again. 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. Nor*al*ente vengono con)igurati anche i livelli di esecuzione del riavvio e dello s egni*ento. 8a con)igurazione di init 4 una delle *ansioni dell:a**inistratore di siste*a..

sercizi 9uesti sono alcuni esercizi er re ararvi al rossi*o ca itolo. 4li scri t di shell consistono di tali co*andi organizzati co*e co*anda la sintassi della shell. 2e non 3 ancora il caso. . =ostrate il contenuto della catasta H tackI delle directorG. 9uando viene avviata.$. co* atibile con la shell -ourne e incor orante *olte )unzioni utili di altre shell.2IF. 1. 4li scri t vengono letti ed eseguiti linea er linea e dovrebbero avere una struttura logica.o dare la ass>ord erché utilizzate 22B e )orse le chiavi 22B.bashrc7 Ca itolo 1. gli integrati della shell e i co*andi esistenti in una directorG nel vostro siste*a. 1. -ash su orta degli integrati aggiuntivi che non si trovano nella nor*ale shell -ourne. 3.bash_profile • ~/. Per ese* io. er la quale non dovete autenticarvi e.  5na shell che ottenete quando vi autenticate nella console in *odalit! testo.%. 3 descritta nella 2ezione 7. -ash e gli scri t di -ash 3( .esac exit 0 8:istruzione case.sh. 8e seguenti shell sono shell interattive? 2ono shell di login?  5na shell a erta cliccando sullo s)ondo della vostra scrivania gra)ica. 3o))ario -ash 3 la shell 4N5. 7. i* ostate il vostro invito in *odo che *ostri la vostra osizione nella gerarchia del siste*a. la shell legge i suoi )ile di con)igurazione. selezionando Q/er*inalR o qualcosa di si*ile da un *enu.  5na shell che ottenete su un host re*oto.  5na shell ottenuta con il co*ando +term 8.2. 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? #. +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.'.  5na shell che ottenete do o aver dato il co*ando ssh localhost.  5na shell a erta dallo scri t miosistema. I i@ i* ortanti sono7 • /etc/profile • ~/. $. I co*andi di shell ossono essere suddivisi in tre gru i7 le )unzioni di shell. s esso utilizzata in questo ti o di scri t. aggiungete questa linea a ~/. Potete s iegare erché bash non esce quando battete )trl*) nella riga di co*ando? &. 1.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.

=ostrate i co*andi con il cancelletto HPI della vostra corrente sessione di shell. Co*e si *ostra il no*e host del siste*a? 2olo il no*e.e+port PS1="\u@\h \w> " ". 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(. -ash e gli scri t di -ash 31 . %. nient:altroV Ca itolo 1.

s. 5n altro uso degli scri t si ha nella rocedura 5NIF di avvio e s egni*ento.1. sono tutti validi.1. Creare ed avviare uno script 2. Ca itolo 2.nta+ enable o ure 7s. dtpad. 2crivere e correggere gli scri t 32 . emacs. eccetera.1. co*e il di*enticare arentesi e unti e virgola. 0a bene qualsiasi editor di testo7 im. % iden1ia1ione della sintassi in im Per attivare l:evidenziazione della sintassi in im. /ale sequenza viene eseguita nor*al*ente inserendo il no*e dello scri t nella linea di co*ando.Capitolo 2. gedit. Per creare uno scri t di shell. usate il co*ando .s. 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. otete usare gli scri t er auto*atizzare dei co* iti utilizzando lo stru*ento cron.vimrc er renderla er*anente. 3crittura e deno)inazione 5no scri t di shell 3 una sequenza di co*andi che dovete usare )requente*ente. enable o ure . a rite un nuovo )ile vuoto nel vostro editor. in cui le o erazioni dei de*oni e servizi vengono stabilite negli init scri t. In alternativa.n enable Potete aggiungere questa i* ostazione al vostro )ile . 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.

-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. 1ttribuite al vostro scri t un no*e con)acente che suggerisca ciE che lo scri t roduce. 2i consiglia viva*ente di in)or*are gli utenti su cosa sta )acendo uno scri t. Ca itolo 2.3I. 2crivere e correggere gli scri t 33 . degli integrati di shell.sh7 anche cosD. script1. ci otrebbero essere altri scri t nel vostro siste*a con lo stesso no*e di quello che avete scelto. Co*e trattato nel ca itolo recedente Hv. dei co*andi 5NIF e altri scri t. er evitare che si innervosiscano perch* lo cript non ta facendo niente. 2ezione 1.1. ri*a che venga eseguito il co* ito che creer! il risultato. Per assicurarvi che non si ossa creare con)usione. 0eri)icate usando -hich. i co*andi ossono essere delle )unzioni di shell.=ettete i co*andi 5NIF nel )ile nuovo vuoto co*e li inserireste nella linea di co*ando. 'itornere*o sull:argo*ento della co*unicazione con gli utenti nel Ca itolo ". i no*i degli scri t s esso ter*inano in .sh In questo ese* io usia*o l:integrato di -ash echo er in)or*are l:utente su cosa sta er avvenire. 1ccertatevi che il no*e dello scri t non con)ligga con co*andi esistenti.2.

2crivere e correggere gli scri t 3# .-igura . Potrebbe essere una buona idea creare una directorG ~/scripts er tenere i vostri scri t. 8:evidenziazione della sintassi 3 su ortata da im. g im. Ca itolo 2. 9+:emacs. 8:unica convenzione a cui ci attenia*o 3 che l:invito di root ter*ina con un segno cancelletto H.#1/ cript1/ h 2crivete questo scri t da voi stessi co*e *eglio otete. utilizzate un editor testuale che usi colori di))erenti er di))erenti costrutti di shell. 1ggiungete la directorG ai contenuti della variabile PATH7 e+port PATH="$PATH:~/scripts" 2e state a ena inco*inciando con -ash. o ha h markI. !-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 +.

13s 0. lo scri t uE avviarsi co*e qualunque altro co*ando7 willy:~/scripts> chmod u+x script1.sh willy:~> script1. Hi.05s -bash willy :0 . 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. Ca itolo 2. 9uando si i* ostano i er*essi. 5:37.39s 36.2.Sat 2pm 4:25m 0.sh bash -x nome_script. 0. otete attivare lo scri t in questo *odo7 .Sat 2pm 3:33m 0.Sat 2pm ? 0. )unzioni ed alias creati in questa sottoshell sono noti solo alla articolare sessione di bash di tale sottoshell. .atto ciE. . 2crivere e correggere gli scri t 3$ . 0. 9uando quella shell ter*ina e la genitrice riacquista il controllo. 4 users. 2e non *ettete la directorG scripts nel vostro PATH e .sh willy:~/scripts> ls -l script1. *a in genere )accia*o questo se voglia*o ottenere un co* orta*ento s eciale.12.sh 8a shell s eci)icata artir! co*e sottoshell di quella corrente ed eseguir! lo scri t.sh The script starts now.Sat 2pm 3:33m 36. load average: 0. 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.nome<script.24s 0.3. Hla directorG correnteI non 3 ne ure nel P1/B. veri)icate di ottenere real*ente i er*essi che volete. willy:~/scripts> echo $COLOUR willy:~/scripts> echo $VALUE willy:~/scripts> 9uesto 3 il *odo i@ co*une er eseguire uno scri t. 8e variabili.secuzione dello script 8o scri t er oter essere lanciato dovrebbe avere i er*essi di esecuzione er gli utenti corretti .1. willy! I will now fetch you a list of connected users: 3:38pm up 18 days. This is a string: black And this is a number: 9 I'm giving you back your prompt now.sh -rwxrw-r-.sh 5no scri t uE essere eseguito es licita*ente da una data shell. tutto viene ri ulito e ed ogni *odi)ica di stato di shell eseguita dallo scri t viene di*enticata. 6: re)eribile eseguire uno scri t co*e questo in una sottoshell.06s /usr/bin/screen I'm setting two variables now.22.sh sh nome_script.00s ? willy pts/3 .39s BitchX willy ir willy pts/2 ..1 willy willy 456 Dec 24 17:11 script1.15 USER TTY FROM LOGIN@ IDLE JCPU PCPU WHAT root tty2 .

2. erciE non iniziate il vostro scri t con una linea vuota.2e non volete avviare una nuova shell *a eseguire lo scri t in quella corrente. questo i* lica che l:eseguibile di -ash si trovi in /bin. 2ggiungere co))enti +ovreste stare attenti al )atto che otreste non essere l:unica ersona a leggere il vostro codice. 8e linee vuote sono considerate anch:esse delle linee. dovreste stabilire quale shell dovrebbe )arlo )unzionare. 8:integrato di -ash source 3 un sinoni*o del co*ando . cosicché i co*andi da voi inseriti otrebbero restituire degli errori qualora eseguiti dalla shell sbagliata. Per lo sco o di questo corso. I ri*i due caratteri della ri*a linea dovrebbero essere #!. Ca itolo 2. 8a ri*a riga dello scri t deter*ina la shell d:avvio.sh source = . I co*andi vengono eseguiti nel contesto della attuale shell. H untoI della shell -ourne.2. 2.2. Il ti o di shell in cui avete scritto lo scri t otrebbe non essere quella rede)inita del vostro siste*a.2. <uale shell eseguir" lo script? 9uando )ate girare uno scri t in una sottoshell. Le basi degli script 2.bash Co*e notato ri*a. dovete usare ource con esso7 source nome_script. seguiti oi dal ercorso della shell che dovrebbe inter retare i co*andi successivi.sh --output ommitted-willy:~/scripts> echo $VALUE 9 willy:~/scripts> 2.bin. cosicché ogni *odi)ica a ortata al vostro a*biente sar! visibile al ter*ine dell:esecuzione dello scri t7 willy:~/scripts> source script1. tutti gli scri t inizieranno con la linea =>.1. 8o scri t non ha bisogno in questo caso del er*esso di esecuzione. 2crivere e correggere gli scri t 3& .

o erché lo avete )atto. di solito sono ben co**entati dal *o*ento che devono essere leggibili e *odi)icabili da chiunque )accia )unzionare 8inuA. Le due variabili d'esempio vengono # impostate e mostrate.d. mostra un saluto e fornisce informazioni # sugli utenti attualmente connessi. Caccia agli errori negli script Bash 2.le ri*e righe sono nor*al*ente dei co**enti su ciE che ci as etta. Potreste non ricordare i@ co*e )unzionava se avete necessit! di *odi)icare il vostro scri t do o oche setti*ane o *esi.3. -ash )ornisce estese )unzionalit! er la caccia agli errori. Poi ciascun grosso ezzo di co*andi verr! co**entato secondo necessita er ragioni di chiarezza. 2crivere e correggere gli scri t 37 . +ite che avete dovuto leggere un *ucchio di agine *an er raggiungere un articolare risultato con qualche co*ando utilizzato nel vostro scri t.sh e co iatelo co*e script1-commentato." 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.3.1. che *odi)ichia*o in *odo che i co**enti ris ecchino ciE che )a lo scri t. 2e essi vogliono vedere co*e l:avete realizzato. Correzioni nell7intero script 9uando le cose non rocedono secondo i iani. er ese* io. $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. Prendete l:ese* io script1.=olti utenti ed a**inistratori di siste*a )anno girare scri t che sono stati scritti da altre ersone. /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. co*e e.sh. I co**enti rendono ure i@ se* lice la vostra vita. nella vostra directorG di siste*a init. clear # pulisce la finestra di terminale echo "Lo script inizia adesso." echo "Ciao. 2. dovete stabilire esatta*ente cosa deter*ini lo scri t a sbagliare. 8a i@ co*une 3 quella di Ca itolo 2. a *eno che non abbiate co**entato cosa. i co**enti sono utili er illu*inare il lettore. 4li scri t init di 8inuA.

24s 0.' Ora ti restituisco l'invito.06s /usr/bin/screen + echo + echo 'Adesso sto impostando due variabili. dis onibile su 2ource.' Adesso sto impostando due variabili.40 USER TTY FROM LOGIN@ IDLE JCPU PCPU WHAT root tty2 Sat 2pm 5:36m 0. willy:~/scripts> bash -x . che )ar! girare lo scri t intero in *odalit! correzione H debug modeI. +ite che non siete sicuri di ciE che )ar! il co*ando .ra esiste un correttore HdebuggerI co* leto er -ash.82s BitchX willy ir willy pts/2 Sat 2pm 43:13 0.sh. 9ueste )unzioni er la correzione sono dis onibili nelle versioni i@ *oderne di -ash./script1. + 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. willy!' Ciao. 2.82s 36. 4 users.sh + clear + echo 'Lo script inizia adesso.00s ? willy pts/3 Sat 2pm 43:13 36. 2crivere e correggere gli scri t 3" . 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.A. 0.3. load average: 0. Notate nuova*ente che i co**enti aggiunti non sono visibili nei risultati dello scri t.sh )atto girare in *odalit! correzione.62. + echo . otete )ar eseguire in *odalit! nor*ale quelle arti dello scri t di cui siete certi che non abbiano errori.nell:ese* io scri t1<co**entato. 6:49.orge. 0.58. 9uesto 3 lo scri t script1-commentato.2.05s -bash willy :0 Sat 2pm ? 0. Correzione su parte?i dello script 5tilizzando l:integrato di -ash set. e otete *ostrare le in)or*azioni er la correzione solo delle zone roble*atiche. a artire dalla 3. + echo 'Ciao. 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.13s 0.avviare la sottoshell con l:o zione <A.' Lo script inizia adesso. 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.

06s /usr/bin/screen + set +x Adesso sto impostando due variabili.sh Lo script inizia adesso.05s -bash willy :0 Sat 2pm ? 0. 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 -f willy:~/scripts> ls * ls: *: No such file or directory script1.33 USER TTY FROM LOGIN@ IDLE JCPU PCPU WHAT root tty2 Sat 2pm 5:47m 0.88s BitchX willyke willy pts/2 Sat 2pm 54:02 0. Ciao.88s 36.39.00s ? willy pts/3 Sat 2pm 54:02 36. willy:~/scripts> Potete attivare e disattivare la *odalit! di correzione quante volte volete con lo stesso scri t.sh Ca itolo 2.Il risultato sar! si*ile a questo7 willy:~/scripts> script1. 4 users. Questa è una stringa: nero E questo è un numero: Ora ti restituisco l'invito.sh script1. ri*a della 8a lineetta viene utilizzata er attivare una o zione di shell e un i@ er disattivarla. 0. 2crivere e correggere gli scri t 3% . 8a tabella successiva o))re una anora*ica di altre utili o zioni di -ash7 Tabella . 2ta* a le linee in entrata alla shell co*e esse vengono lette.79. 0. 2ta* a il traccia*ento dei co*andi loro esecuzione. 7:0.sh willy:~/scripts> set +v set +v willy:~/scripts> ls * script-commentati.13s 0. willy! Ora ti invio un elenco degli utenti connessi: + w 5:00pm up 18 days.24s 0.#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. load average: 0.

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

8:a*biente di -ash #3 . 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. display style: the readline config file: if [ -z "$INPUTRC" -a ! -f "$HOME/. vim. sarebbe *eglio *ettere delle con)igurazioni s eci)iche er -ash in tale )ile. then .2.inputrc" ]. In questi casi ~/. ro)ile. 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. Il sorgente di -ash contiene dei )ile profile di ese* io er uso generale o individuale. $i fi done # Settings for program initialization source /etc/java. +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. 9uesto 3 una orzione del bashrc allegato alla docu*entazione di -ash7 Ca itolo 3.1. co*e la shell -ourne. ?etc?bashrc Nei siste*i che o))rono *olte lici ti i di shell..05b/startup-files. less. Il sorgente contiene dei )ile bashrc d:ese* io.2. 9uesti e quello nell:ese* io recedente necessitano di *odi)iche er )arli )unzionare nel vostro a*bienteV 3.sh . Potreste anche trovare che nel vostro siste*a /etc/profile contiene solo l:a*biente di shell e le i* ostazioni d:avvio. bell. viene letto anche da altre shell.1.o a licazioni Yava nei loro navigatori di rete. dal *o*ento che .bashrc dell:utente otrebbe untare a /etc/bashrc er includerlo nel rocesso di inizializzazione della shell al *o*ento dell:autenticazione. Il )ile /etc/bashrc otrebbe essere richia*ato in /etc/profile o nei )ile di inizializzazione shell di un singolo utente.HOSTNAME=`/bin/hostname` HISTSIZE=1000 # Keyboard..) for i in /etc/profile. o ure otreste trovarne una co ia in /usr/share/doc/bash-2. 4uardate la 2ezione 3. .etc.d/*. *entre /etc/bashrc contiene le de)inizioni co* lessive del siste*a er le )unzioni di shell e gli alias.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. do if [ -r "$i" ].

1. 9uesto )ile contiene una )unzione. 3. 8:a*biente di -ash ## .. In questo )ile gli utenti ossono aggiungere delle con)igurazioni eAtra o ure ca*biare i valori rede)initi7 franky~> cat ." } 6scludendo gli alias generali.$. Nella 2ezione 3.bash_profile file # # # # Executed from the bash shell when you log in.2.2. # SunOS) # stty erase # .." kill -9 $pid echo "slaughtered.bashrc source ~/. ps!ill7 le )unzioni saranno studiate in dettaglio nel Ca itolo 11.bash_profile 9uesto 3 il )ile di con)igurazione re)erito er con)igurare i singoli a*bienti degli utenti.1. contiene degli utili alias che )anno )unzionare i co*andi anche quando li scrivete in *odo errato. 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... *) stty sane Ca itolo 3. 3. # # # ################################################################# source ~/.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).bash_profile ################################################################# # # # . ~/.bash_login case "$OS" in IRIX) stty sane dec stty erase .1.2 trattere*o degli alias.

1.2. verr! letto questo )ile.bashrc Ca itolo 3. er ese* io quando ci si 3 autenticati in a*biente gra)ico utilizzando le )inestre del ter*inale di F.profile In assenza di ~/.2. esac 9uesto utente con)igura il carattere bac?s ace er l:autenticazione in di))erenti siste*i o erativi.bash_profile. che oi sono accessibili anche dalle altre shell.1.bashrc # /home/franky/.bash_login. 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.. 3.bashrc e . ~/.bash_profile) # # # ####################################################################### # file protection umask 002 # all to me. l:utente non deve )ornire un no*e utente o una ass>ord7 non viene )atta nessuna autenticazione.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.#. read to group and others # miscellaneous w cal `date +"%m"` `date +"%Y"` In *ancanza di ~/. 1 arte ciE.bash_login dell:utente. 3.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 . ~/. il che signi)ica che non dovete inserire le stesse i* ostazioni in *olte lici )ile. viene letto ~/.3. -ash cerca ~/. vengono letti .profile. Nell:ese* io..bashrc . In questo ~/. /ale utente ottiene anche il calendario del *ese corrente7 ####################################################################### # # # Bash_login file # # # # commands to perform from the bash shell at login time # # (sourced from .2..2.1.bash_profile e di ~/.ggi 3 i@ )requente utilizzare una shell senza autenticazione. 5na volta a erta una tale )inestra. Z. 'icordatevi che altre shell otrebbero non co* rendere la sintassi di -ash. 9uando ciE accade.bashrc a cui si )a ri)eri*ento nei )ile letti al *o*ento dell:autenticazione. PuE tenere le stesse con)igurazioni. 8:a*biente di -ash #$ . 3.

3.$. Z.0. 4li alias sono trattati nella 2ezione 3.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.bashMlogout 9uesto )ile contiene istruzioni s eci)iche er la rocedura di chiusura della sessione HlogoutI.2. 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. /etc/bashrc fi # shell options set -o noclobber # my shell variables export PS1="\[###BOT_TEXT###33[1. then . franky ~> cat .1.. 'icordate che i )ile ca* ione otrebbero necessitare di *odi)iche er )unzionare nel vostro siste*a.# Source global definitions if [ -f /etc/bashrc ].44m\]\u \w\[###BOT_TEXT###33[0m\] " export PATH="$PATH:~/bin:~/scripts" # my aliases alias cdrecord='cdrecord -dev 0. 8:a*biente di -ash #& .bash_logout ####################################################################### # # # Bash_logout file # # # # commands to perform from the bash shell at logout time # # # ####################################################################### Ca itolo 3.$.

Notate che source resourcefile 3 lo stesso di . 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.1. resourcefile. 2ezione 2. 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. In tal caso rosso signi)ica ericolo. 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." o co*e queste7 Ca itolo 3.clear franky ~> 3. Inter retando lo scri t in questo *odo. 8:a*biente di -ash #7 . Potreste aggiungere delle linee co*e questa7 echo "Ora è in esecuzione . 9uesto ese* io di*ostra anche l:utilizzo di inviti di))erenti da arte di utenti di))erenti.3. non reoccu atevi eccessiva*ente.bash_profile.. Ca)biare i (ile di con(igurazione 9uando e))ettuano delle *odi)iche ad uno qualsiasi dei )ile recedenti. 9uando avete un invito verde. gli utenti devono riconnettersi al siste*a od usare source con il )ile alterato a))inché i ca*bia*enti ossano avere e))etto.3.2I.

2.hq.gtkrc-1.o:~ G_BROKEN_FILENAMES=1 GDK_USE_XFT=1 GDMSESSION=Default GNOME_DESKTOP_SESSION_ID=Default GTK_RC_FILES=/etc/gtk/gtkrc:/nethome/franky/. I co*andi en o printen ossono essere utilizzati er *ostrare le variabili a*bientali.bashrc:" export PS1="[valore qualsiasi]" echo "PS1 adesso è impostato a $PS1" 3. 0ipi di variabili Co*e visto negli ese* i recedenti.1.2. le variabili di shell sono in caratteri *aiuscoli convenzione.:~:/usr/local:/usr:/ CFLAGS=-O2 -fomit-frame-pointer COLORTERM=gnome-terminal CXXFLAGS=-O2 -fomit-frame-pointer DISPLAY=:0 DOMAIN=hq.1.1.garrels. -ash tiene un elenco di due ti i di variabili7 er 3.2-gnome2 GWMCOLOR=darkgreen GWMTERM=xterm HISTFILESIZE=5000 history_control=ignoredups HISTSIZE=2000 HOME=/nethome/franky HOSTNAME=octarine.echo "Ora si impsta PS1 in . 8:a*biente di -ash #" .garrels.2. 1ariabili 3.0 LANG=en_US LDFLAGS=-s LD_LIBRARY_PATH=/usr/lib/mozilla:/usr/lib/mozilla/plugins LESSCHARSET=latin1 LESS=-edfMQ LESSOPEN=|/usr/bin/lesspipe.be INPUTRC=/etc/inputrc IRCNAME=franky JAVA_HOME=/usr/java/j2sdk1. 2otto c:3 un risultato ti o7 franky ~> printenv CC=gcc CDPATH=.4. 1ariabili globali 8e variabili globali Ho variabili a*bientali O environment variable I sono dis onibili in tutte le shell.be e= TOR=vi FCEDIT=vi FIGNORE=.sh %s LEX=flex LOCAL_MACHINE=octarine Ca itolo 3. 9uesti rogra**i sono co* resi nel acchetto h#util .

1.37.aliases BASH=/bin/bash Ca itolo 3. Il risultato verr! ordinato secondo le correnti i* ostazioni locali e *ostrato in un )or*ato riutilizzabile. do o aver eli*inato le )unzioni che vengono *ostrate dal co*ando set7 franky ~> diff set.Shell/hq.01 :or=01.garrels.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/.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.sorted printenv.2.01:cd=40.sorted | grep "<" | awk '{ print $2 }' BASE=/nethome/franky/. Variabili locali 8e variabili locali sono dis onibili solo nella shell corrente. +i sotto c:3 un )ile di)) realizzato con)rontando i risultati di printen e set.33:so=01.34:ln=01.hq.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.36:pi=40.2. a arir! un elenco di tutte le variabili Hco* rese quelle a*bientaliI e le )unzioni.33.05. 5sando il co*ando integrato set senza alcuna o zione.LOGNAME=franky LS_COLORS=no=00:fi=00:di=01.33.be/octarine.Linux:/nethome/franky/bin:/usr/local/bin:/usr/local/sbi n:/usr/X11R6/bin:/PS1=\[###BOT_TEXT###33[1.35:bd=40.garrels.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.Xauthority XENVIRONMENT=/nethome/franky/.44m\]franky is in \w\[###BOT_TEXT###33[0m\] PS2=More input> PWD=/nethome/franky SESSION_MANAGER=local/octarine. 8:a*biente di -ash #% .

2.3. ossia*o suddividerle anche in categorie in base al ti o dei loro contenuti. 3. *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 $( .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 &.2. 8e variabili ossono contenere anche delle ci)re.2. 1ttribuire alle variabili locali un no*e in *inuscolo 3 una convenzione che qualche volta viene a licata. In base a ciE. Creazione delle variabili +i base le variabili sono in lettere *aiuscole e sono sensibili a ciE. 3.05b. 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(. siete liberi di usare i no*i che re)erite o di *ischiare *inuscole con *aiuscole.0(1)-release' COLUMNS=80 DIRSTACK=() DO_FORTUNE= EUID=504 GROUPS=() HERE=/home/franky HISTFILE=/nethome/franky/. Per ora lavorere*o con valori interi e stringa nelle nostre variabili.BASH_VERSINFO=([0]="2" BASH_VERSION='2. 1ariabili per contenuto 1 arte la distinzione delle variabili in locali e globali.1. /uttavia.

sportare variabili 5na variabile creata co*e quelle dell:ese* io recedente 3 dis onibile soltanto nella shell corrente. Singh" franky ~> bash franky ~> echo $full_name franky ~> exit Ca itolo 3. 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. 6: una buona usanza virgolettare le stringhe quando si assegnano dei valori alle variabili7 ciE ridurr! le ossibilit! di sbagliare. 8e variabili che vengono es ortate sono de)inite co*e variabili a*bientali. CiE 3 di*ostrato nell:ese* io7 franky ~> full_name="Franky M.VARNAME=" alore" 8:inseri*ento di s azi attorno al segno uguale causer! degli errori.3. 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. Per assare variabili ad una sottoshell. abbia*o bisogno di e portarle utilizzando il co*ando integrato e+port. . 8:a*biente di -ash $1 . 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. 6: una variabile locale7 i rocessi )igli della shell corrente non si cureranno di questa variabile. Singh" franky ~> echo $full_name Franky M.2.

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. 2e questo ara*etro 3 de)inito con un no*e di )ile e la variabile MAILPATH non 3 i* ostata. 8a variabile viene *odi)icata er contenere un altro no*e.1. Singh franky ~> 9uando all:inizio si rova a leggere il valore di full_name in una sottoshell. Poi viene avviata una nuova sottoshell in cui 3 visibile la variabile es ortata dalla genitrice.#.franky ~> export full_name franky ~> bash franky ~> echo $full_name Franky M.#. Il valore di questa variabile 3 usato anche er l:es ansione della tilde JZK. In alcuni casi -ash assegna un valore rede)inito alla variabile. 1ariabili riservate della shell Bourne -ash utilizza certe variabili di shell nello stesso *odo della shell -ourne. 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. *a nella genitrice il valore di questa variabile resta lo stesso.2. esso non 3 l! H echo *ostra una stringa vuotaI. 5n elenco di caratteri che se arano dei ca* i7 utilizzato quando la shell suddivide le arole co*e arte di un:es ansione. 8:a*biente di -ash $2 . Singh franky ~> export full_name="Charles the Great" franky ~> echo $full_name Charles the Great franky ~> exit franky ~> echo $full_name Franky M. -ash in)or*a l:utente dell:arrivo di osta nel )ile s eci)icato. 1ariabili riservate 3. 8a directorG ersonale HhomeI dell:utente corrente7 quella rede)inita er l:integrato cd. 3. 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.2.

: 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.2. 8:indice dell:ulti*o argo*ento di o zioni elaborato dall:integrato getopts.2. *a altre shell nor*al*ente non le trattano in *odo s eciale.OPTARG OPTIND PATH PS1 PS2 Il valore dell:ulti*o argo*ento di o zioni elaborato dall:integrato getopts. 8a corrente linea di co*ando. 8a stringa ri*aria dell:invito HpromptI. 2e questa variabile 3 de)inita quando -ash viene invocato er eseguire uno scri t di shell. 8a stringa secondaria dell:invito HpromptI. 8:indice dell:attuale osizione del cursore relativa all:inizio della corrente linea di co*ando. 5n elenco di directorG se arato dai due unti J7K in cui la shell cerca dei co*andi. Il valore rede)inito 3 [:Us<UvU\ :[. arola contenente BASH_ENV BASH_VERSION BASH_VERSINFO COLUMS COMP_CWORD COMP_LINE COMP_POINT COMP_WORDS COMPREPLY Ca itolo 3. 8:intero no*e del ercorso utilizzato er eseguire la corrente richiesta di -ash. 5tilizzata dall:integrato select er deter*inare la larghezza del ter*inale quando si sta* ano elenchi di selezione. Il nu*ero di versione della istanza corrente di -ash. 5n indice all:interno di ${COMP_WORDS} della l:attuale osizione del cursore. 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.#. Il valore rede)inito 3 [:T :[. Tabella 1#. 5na variabile *atriciale a sola lettura i cui ele*enti contengono le in)or*azioni di versione er questa istanza di -ash. 3. 1ariabili riservate di Bash 9ueste variabili sono de)inite od utilizzate da -ash. 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. 8:a*biente di -ash $3 . I* ostata auto*atica*ente in base alla ricezione di un segnale 4)'5)6C7.

5tilizzato er stabilire la categoria delle localizzazioni er tutte quelle categorie non selezionate s eci)icata*ente con una variabile che inizia con LC_. 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. 5na variabile *atriciale che contiene l:elenco dei gru a artiene l:attuale utente. degli sche*i utilizzati er decidere quali linee di co*ando debbano essere salvate nella lista della cronologia.ino a tre carattere che controllano l:es ansione della cronologia. 9uesta variabile scavalca il valore di LANG e di ogni altra variabile LC_ che s eci)ica una categoria di localizzazione. Controlla il co* orta*ento della shell quando riceve un carattere %&co*e unico ingresso. Il valore rede)inito 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. 8:a*biente di -ash . degli sche*i che de)iniscono l:insie*e dei no*i dei )ile da ignorare durante l:es ansione dei no*i. se arato dai due unti J7K. o l:indice nell:elenco della cronologia. suddiviso dai due unti J7K. Il reale I+ nu*erico dell:utente corrente. di solito $((.bash_history. 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. che revale sul rede)inito /etc/inputrc. i a cui . Il no*e del )ile di inizializzazione 'eadline. 5n elenco. Il nu*ero cronologico. del co*ando corrente. Il nu*ero *assi*o di co*andi da ricordare nella lista della cronologia Hil valore rede)inito 3 $((I. Il no*e del corrente host. 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. Il nu*ero *assi*o di linee contenute nel )ile di cronologia. Il no*e del )ile in cui viene salvata la cronologia dei co*andi. 5n elenco. 5na stringa che descrive la *acchina in cui sta girando -ash. 8:editor utilizzato co*e integrato fc. Il no*e di qualsiasi )unzione di shell attual*ente in esecuzione. la sostituzione ra ida e la tokenizzazione. +eter*ina se un co*ando viene aggiunto al )ile della cronologia.

gni volta che si )a ri)eri*ento a questo ara*etro. 2e i* ostata. 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. 8:I+ di rocesso del rocesso genitore della shell.=P1NL< 2L2/6=. 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. 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. -ash *ostra i *essaggi di errore generati dall:integrato getopts. 9uanto s esso Hin secondiI la shell dovrebbe controllare la osta nei )ile s eci)icati nelle variabili MAILPATH o MAIL. nel )or*ato standard 4N5 CP5<C. viene generato un nu*ero casuale co* reso tra ( e 327&7. 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. 5na stringa che descrive il siste*a o erativo in cui sta girando -ash. Il valore di questa variabile 3 utilizzato co*e invito del co*ando select. 2e questa variabile si trova nell:a*biente quando si avvia bash. . e sequenze di racccolta Hcollating e8uence I con es ansione dei no*i di )ile e corris ondenza di sche*i Hpattern matchingI. 1ssegnare un valore a questa variabile seleziona il generatore di nu*eri casuali.2IF. 8a recedente directorG di lavoro i* ostata dall:integrato cd. Il nu*ero di linea nello scri t o nella )unzione di shell attual*ente in esecuzione. 8a directorG corrente di lavoro co*e de)inita dal co*ando integrato cd. 8:a*biente di -ash $$ . 5na stringa che descrive nella sua interezza il ti o di siste*a in cui viene eseguito -ash. er tradurre LC_MESSAGES LC_NUMERIC LINENO LINES 9uesta variabile deter*ina la categoria della localizzazione utilizzata er il )or*ato dei nu*eri. la shell entra in *odalit! P. 5tilizzato dall:integrato select er stabilire la lunghezza della colonna er gli elenchi di selezione di sta* a. 2e i* ostata con il valore 1. MACHTYPE MAILCHECK OLDPWD OPTERR OSTYPE PIPESTATUS POSIXLY_CORRECT PPID PROMPT_COMMAND PS3 PS4 PWD RANDOM Ca itolo 3. 9uesta variabile deter*ina la localizzazione utilizzata stringhe tra do ie virgolette recedute da un segno Q\R. classi di equivalenze.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.

Tabella 1#1: 2ariabili peciali di ba h )arattere $* @efini1ione 6s ansione ai ara*etri osizionali. 9uesti ara*etri ossono essere solo re)erenziati7 un assegna*ento a loro non 3 consentito. Para)etri speciali 8a shell tratta in *odo s eciale diversi ara*etri. 2e in ostata con un valore *aggiore di zero. 8:a*biente di -ash $& . TIMEFORMAT TMOUT UID Controllate le agine *an. se arato dai due unti J7K. 3. 9uesta variabile au*enta con il nu*ero dei secondi da quando 3 stata avviata la shell. iniziando da uno. delle o zioni di shell abilitate. o quelle i* ostate dalla shell stessa Hco*e ad ese* io -iI. 9uando avviene l:es ansione con gli a ici do i. attraverso il co*ando integrato set. 5n elenco. TMOUT viene trattata co*e il timeout rede)inito er la )unzione read. 2i es ande all:I+ di rocesso della shell. in)o o doc di -ash er in)or*azioni estese.REPLY SECONDS SHELLOPTS SHLVL 8a variabile rede)inita er l:integrato read. 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. 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. 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.2. 9uando avviene l:es ansione con gli a ici do i. 1lcune variabili sono di sola lettura. 6s ansione ai ara*etri osizionali.$. 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. iniziando da uno. ciascun ara*etro si es ande in una arola se arata. Incre*entata di uno ogni volta che viene avviata una nuova istanza di -ash. 2i es ande all:I+ di rocesso del co*ando in sotto)ondo HasincronoI eseguito i@ Ca itolo 3. 8:attuale I+ utente nu*erico dell:utente corrente. 6s ansione al nu*ero di ara*etri osizionali in deci*ale.

quest:ulti*i intendono Q\_R. 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. 1$. I ara*etri osizionali sono le arole che seguono il no*e di uno scri t di shell. POSPAR1="$1" POSPAR2="$2" POSPAR3="$3" echo echo echo echo echo "$1 è il primo parametro posizionale.sh uno due tre quattro cinque uno è il primo parametro posizionale. 9uando si controlla la osta. due è il secondo parametro posizionale.7." "$2 è il secondo parametro posizionale. In quasi tutti i casi in cui i rogra**atori usano Q\^R. +i i@ sulla valutazione di questi ara*etri nel Ca itolo 7 e nella 2ezione %. due è il secondo parametro posizionale. $3. AB s. le variabili vengono aggiunte ad una *atrice interna.di recente. \$1. \$2. $0 2i es ande al no*e della shell o dello scri t di shell. Q\^R uE causare errori ed anche )alle nella sicurezza del vostro so)t>are. 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. è il terzo parametro posizionale." $_ Con l:esecuzione uno otrebbe dare un qualsiasi nu*ero di argo*enti7 franky ~> positional. $3. $2. $2. $3 e cosD via. 1$. franky ~> positional. $2." "$3 è il terzo parametro posizionale. questo ara*etro contiene il no*e del )ile di osta.sh uno due uno è il primo parametro posizionale. 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. Il numero totale di parametri posizionali è 5.sh # Questo script legge 3 parametri posizionali e li stampa. 1lcuni ese* i sugli altri ara*etri s eciali7 franky ~> grep dictionary /usr/share/dict/words dictionary Ca itolo 3. co*e viene di*ostrato con questo se* lice scri t7 #!/bin/bash # positional. 8unghe secondo necessit!. 8:a*biente di -ash $7 . Il numero totale di parametri posizionali è 2. $# contiene il nu*ero totale dei ara*etri. tre è il terzo parametro posizionale." "Il numero totale di parametri posizionali è $#. 6ssi sono collocati nelle variabili $1. \$3.

8:a*biente di -ash $" .%. +o o aver *esso un lavoro H jobI in sotto)ondo.log echo backup riuscito >> /home/franky/log/home_backup.tar.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. &iciclo degli script con le variabili 1 arte il rendere i@ leggibile lo scri t. #!/bin/bash # Questo script esegue una copia di salvataggio della mia home directory. Redirige gli errori perché ne vengono # generati alcuni se l'archivio è inesistente. 3. scp /var/tmp/home_franky.tar.bz2 bordeaux:/opt/backup/franky > /dev/null 2>&1 # Crea una marca temporale in un file di registrazione. 8:I+ del rocesso della sua shell 3 1(&&2. uno scri t *olto se* lice che esegue una co ia di salvataggio HbackupI della directorG ersonale di frank! su un server re*oto. Considerate l:ese* io seguente. ! contiene l:I+ del rocesso del lavoro in sotto)ondo. che deter*ina l:assegna*ento della variabile _. Quindi crea un nuovo file compresso. cd /home # Questo crea l'archivio tar cf /var/tmp/home_franky. ? contiene un codice d:uscita diverso da ( HzeroI.tar franky > /dev/null 2>&1 # Per prima cosa rimuove il vecchio file bzip2.bz2 2> /dev/null bzip2 /var/tmp/home_franky. 9uando si co**ette un errore.2. oi carol dovr! e))ettuare abbastanza nu*erose *odi)iche ri*a di oter usare lo Ca itolo 3. le variabili vi consentiranno anche di a licare un scri t in un altro a*biente o er un altro uso. 8a shell in )unzione 3 bash. rm /var/tmp/home_franky. date >> /home/franky/log/home_backup.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.tar # Copia il file in un altro host – abbiamo le chiavi ssh per fare questo lavoro senza # interventi. In secondo luogo su onete che frank! voglia dare il suo scri t a carol.

1.bz2 SERVER=bordeaux REMOTEDIR=/opt/backup/franky LOGFILE=/home/franky/log/home_backup.3. 3. ossono revenire che arole riservate vengano riconosciute co*e tali e sono in grado di disabilitare l:es ansione dei ara*etri. rendete variabili tutti i )ile.3.2. CosD. 3. Ridirige gli errori dal momento che # ne produce alcuni se l'archivio non esiste.tar BZIPFILE=/var/tmp/home_franky.log cd $BACKUPDIR # Questo crea l'archivio tar cf $TARFILE $BACKUPFILES > /dev/null 2>&1 # Per prima cosa rimuove il vecchio file bzip2. ecc. Caratteri di escape Ca itolo 3. 9uesto 3 un ese* io7 #!/bin/bash # Questo script fa una copia di salvataggio della mia directory personale.scri t er salvare altre directorG. date >> $LOGFILE echo salvataggio riuscito >> $LOGFILE @irector. Caratteri tra gli apici 3. # Cambiate i valori delle variabili per far funzionare lo script per voi: BACKUPDIR=/home BACKUPFILES=franky TARFILE=/var/tmp/home_franky.3. 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. no*i server. no*i utente. senza dover scorrere l:intero scri t er controllare dove 3 resente un ara*etro. directorG. Per directorG i@ volu*inose e una larghezza di banda in)eriore. oluminose e banda passante limitata 9uello so ra 3 solo un ese* io che ognuno uE co* rendere. usate rs. usando una iccola directorG e un host sulla stessa sottorete.tar. la di*ensione della directorG e della osizione del server re*oto. 8:a*biente di -ash $% . Per un )acile riciclaggio. esso uE richiedere una inso ortabile quantit! di te* o er eseguire le co ie di salvataggio con questo *eccanis*o. 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. avrete bisogno di *odi)icare un valore er una volta.nc er *antenere le directorG allineate ad entra*bi i ca i. scp $BZIPFILE $SERVER:$REMOTEDIR > /dev/null 2>&1 # Crea una marca temporale in un file di registro. Poi crea un nuovo file compresso. Perché? =olti tasti hanno dei signi)icati s eciali in alcuni contesti. In base alla vostra larghezza di banda.

8:a*biente di -ash &( . 5na barra inversa Hback la hI senza a ici. 2pici doppi 5sando gli a ici do i si conserva il valore letterale di tutti i caratteri. dagli a ici inversi. 6ssa i* edisce il valore letterale del carattere i**ediata*ente successivo. Il ri*o echo *ostra il valore della variabile. 2e un carattere di nuova linea a are subito do o la barra inversa. ``I e la barra inversa. 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. anche se receduto da una barra inversa. viene i* iegata in -ash co*e carattere di esca e. ad eccezione del segno del dollaro.3. dagli a ici do i. ad eccezione della nuovalinea Hne$lineI. 5na virgoletta do ia uE essere tra virgolette do ie )acendola recedere da una 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. le barre inverse vengono tolte dal )lusso in ingresso quando sono seguite da uno di questi caratteri. *a con il secondo il segno del dollaro viene reso con esca e. 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. gli a ici inversi Hvirgolette inverse o backtick O a ici singoli inversi. U.3.I caratteri di esca e si usano er ri*uovere il signi)icato s eciale di un singolo carattere. Con le virgolette do ie. 8a barra inversa conserva il suo signi)icato solo quando 3 seguita dal dollaro. franky ~> echo “$data” 2((2122& franky ~> echo "`data`" Sun Apr 20 11:22:06 CEST 2003 Ca itolo 3. 5n a ice singolo non uE trovarsi tra a ici singoli.3. Il segno del dollaro e gli a ici inversi *antengono il loro s eciale signi)icato con gli a ici HvirgoletteI do i. da barra inversa o da nuovalinea. 3. Continuia*o con l:ese* io recedente7 franky ~> echo '$data' $data 3. 2pici singoli 4li a ici singoli H::I vengono utilizzati er conservare il valore letterale di ogni carattere racchiuso tra di loro.#.

8:a*biente di -ash &1 . tali )ra**enti o arole vengono es ansi o risolti.3&L& o zionale. seguita da un P&4T4C9)PT o zionale. 3.3. In generale +o o che il co*ando 3 stato suddiviso in )ra**enti H tokenI Hv.$. nell:ordine in cui vengono es ansi.3. 1irgolettatura 2 3I8C Parole nella )or*a [\:2/'IN4:[ vengono trattate in *odo s eciale.#. Ci sono otto ti i di es ansione eseguita. +o o tutte le es ansioni. 2ezione 1. 8e sequenze di esca e tra*ite barra inversa si ossono trovare nella docu*entazione di -ash. 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. con es ansione da sinistra a destra.1I.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. il segno dollaro viene ignorato. D. 4li sche*i HpatternI da sotto orre all:es ansione delle gra))e rendono la )or*a di un P9%:. viene eseguita la ri*ozione degli a ici. la sostituzione 3 tra a ici do i.#.1. Ca itolo 3. 2e la stringa viene tradotta e ri* iazzata. . %spansione della shell D.2. 2e la localizzazione corrente 3 QCR o QP. 3. 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.1.franky ~> echo "I'd say: ###BOT_TEXT###quot;Go for it!###BOT_TEXT###quot;" I'd say: "Go for it!" franky ~> echo "###BOT_TEXT###quot; More input>" franky ~> echo "\" \ 3. che trattere*o nelle rossi*e sezioni.%.2.2.2IFR. seguito da una serie di stringhe se arate da virgole tra una co ia di gra))e. 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.

consiste in un nu*ero non receduto da Q]R oR<R. il re)isso della tilde viene sostituito dall:ele*ento corris ondente reso dalla catasta H tackI delle directorG. 6se* io7 franky ~> export PATH="$PATH:~/testdir" ~/testdir sar! es ansa a $HOME/testdir. I risultati di ogni stringa es ansa non vengono riordinati. se i* ostato. la arola viene lasciata i**utata. la Ca itolo 3.3.gni assegnazione di variabile 3 veri)icata er re)issi tilde senza a ici che seguono i**ediata*ente un [7[ o [b[. senza la tilde.#. la tilde viene sostituita dal valore della variabile di shell HOME. Per evitare con)litti con l:es ansione dei ara*etri. 2e il no*e di autenticazione non 3 valido o l:es ansione della tilde )allisce. . 2e quest:ulti*o 3RZ<R. 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. conservando l:ordine da sinistra a destra7 franky ~> echo p{a. 2e i caratteri che seguono la tilde nel re)isso tilde consistono in un nu*ero N. essa 3 sostituita con la directorG ersonale dell:utente che sta utilizzando la shell. il valore della variabile di shell PWD sostituisce il re)isso tilde. cosicché se $HOME 3 /var/home/franky. -ash non a lica alcuna inter retazione sintattica al contesto dell:es ansione o del testo tra gra))e. i caratteri nel re)isso della tilde successivi alla tilde stessa vengono trattati co*e un ossibile no*e er l:autenticazione HloginI. In questo caso viene eseguita anche l:es ansione della tilde. 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 no*e di autenticazione 3 una stringa vuota H null tringI. la stringa Q\aQ non viene considerata co*e soggetta ad es ansione delle gra))e. 2e HOME non 3 i* ostata. . se non c:3 una barra senza a iciI vengono considerati un prefi o della tilde Htilde#prefixI. 2e il re)isso tilde 3 QZ]R. 3. MAILPATH e CDPATH.8e es ansioni delle gra))e ossono essere annidate. 2e nessuno dei caratteri nel re)isso della tilde sta tra degli a ici.e. si intende Q]R. eventual*ente re)issato da un Q]R o un Q<R.i.o. e la shell attribuir! il valore es anso. 2e il re)isso tilde. uno uE usare no*i di )ile con la tilde nelle assegnazioni a PATH. 1ltri*enti il re)isso tilde viene ri* iazzato dalla directorG ersonale associata al no*e di autenticazione s eci)icato. il valore della variabile di shell OLDPWD. +i conseguenza. 8:a*biente di -ash &2 . 9ualsiasi es ansione delle gra))e )or*ata in *odo errato viene lasciata senza *odi)iche. tutti i caratteri )ino alla ri*a barra senza a ici Ho tutti i caratteri. viene sostituito.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.spansione della tilde 2e una arola inizia con un carattere tilde non virgolettato HQZRI.

directorG /var/home/franky/testdir verr! aggiunta al contenuto della variabile PATH. 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. 9uando vengono utilizzate le gra))e.[ co*e no*e della variabile. 8e gra))e sono richieste quando[P1'1=6/'.c[. anche nel caso i@ se* lice. Il no*e o il si*bolo dei ara*etri da es andere ossono essere racchiusi tra gra))e. una sostituzione di co*andi o un:es ansione di ara*etri. dal *o*ento che ca ita tutte le volte. 3. che otrebbe essere inter retata co*e arte del no*e.#.[ stesso.#. Il valore di [aP1'1=6/'.c[ viene sostituito. 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. 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*. 8:a*biente di -ash &3 . che sono o zionali *a servono er roteggere la variabile dall:essere es ansa dai caratteri i**ediata*ente seguenti. 0i sar! sicura*ente )a*iliare l:es ansione diretta dei ara*etri. tra gli altri i ara*etri osizionali. CiE 3 noto co*e e pan ione indiretta Hindirect expan ionI. -ash utilizza il valore della variabile )or*ato dal resto di [P1'1=6/'.[ 3 seguito da un carattere che non deve essere inter retato co*e arte del suo no*e. ossono non essere assegnati in questo *odo. /ale variabile viene oi es ansa e quel valore viene usato nella restante sostituzione. i ara*etri s eciali. 2e il ri*o carattere di [P1'1=6/'. Ca itolo 3.[ 3 un unto escla*ativo. iuttosto che il valore del [P1'1=6/'. 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. 8a )or*a base dell:es ansione dei co*andi 3 [\aP1'1=6/'.[ 3 un ara*etro osizionale con i@ di una ci)ra o ure quando [P1'1=6/'.

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 &&

create uno degli sche*i in GLOBIGNORE con [. a *eno che non sia i* ostata l:o zione di shell dotglob. il carattere della barra deve essere se* re )atto corris ondere es licita*ente. 9uando uno sche*a viene utilizzato er la generazione di un no*e di )ile. 4li argo*enti nulli es liciti H[[[[ o [::[I vengono *antenuti.spansione del no)e dei (ile +o o la sco* osizione delle arole.2 non 3 de)inito o il suo valore 3 esatta*ente [es azioTetabTenuovalineaT[ Hquello rede)initoI. insie*e ad ogni adiacente carattere di s azio bianco di IFS. 8a variabile di shell GLOBIGNORE uE essere utilizzata er restringere l:insie*e dei no*i di )ile che corris ondono allo sche*a. 8:a*biente di -ash &7 . non si esegue la sco* osizione. non avviene alcuna sco* osizione delle arole.[ all:inizio del no*e del )ile o che segue i**ediata*ente una barra inversa deve essere )atto coincidere es licita*ente. ne deriva un argo*ento nullo e viene *antenuto. /uttavia. [?[ e [J[.3. anche quando GLOBIGNORE 3 de)inito. la arola viene ri*ossa.. 8:o zione dotglob 3 disabilitata quando GLOBIGNORE non 3 de)inita. vengono ignorati se* re. 3. In altri casi. 2e l:o zione nullglob 3 de)inita e non esistono corris ondenze.: 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. %spansione e scomposi1ione delle parole 2e l:es ansione non avviene.[ non 3 trattato in *odo s eciale. 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 GLOBIGNORE 3 de)inito. 9ualsiasi carattere nell:IFS che non sia uno s azio bianco di IFS. deli*ita un ca* o. la arola viene ri*ossa.[. 2ezione 2.[ coincideranno.#. 2e 3 i* ostata l:o zione di shell nocaseglob e non ci sono corris ondenze. l:i* ostazione di GLOBIGNORE ha l:e))etto di abilitare l:o zione di shell dotglob. allora qualsiasi sequenza di caratteri IFS serve er deli*itare le arole. e . 2e non si trovano no*i di )ile co*bacianti. 5na sequenza di caratteri di s azio bianco IFS viene considerata anche co*e un deli*itatore. 2e il valore di IFS 3 nullo. 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. il carattere [. 2e co* are uno di questi caratteri. I )ile dei no*i .. la arola viene lasciata senza *odi)iche. e l:o zione della shell nullglob 3 disabilitata. cosicché tutti gli altri no*i di )ile inizianti er [. . a *eno che non sia stata i* ostata l:o zione <) Hv. Per ottenere il vecchio co* orta*ento di ignorare i no*i di )ile inizianti con [. il carattere [.^[.es ansioni in arole su questi caratteri. 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. 9uando un no*e di )ile coincide. allora la arola 3 considerata co*e uno 4C7%. -ash analizza ogni arola alla ricerca dei caratteri [^[.2I. 2e I. ciascun no*e di )ile coincidente che corris onde anche ad uno degli sche*i in GLOBIGNORE 3 ri*osso dalla lista delle coincidenze. Ca itolo 3.. 2e IFS ha un valore diverso da quello base. 2e un ara*etro senza valore viene es anso all:interno di a ici do i.

Ca itolo 3././. viene controllata er vedere se ha un alias.' alias PAGER='less -r' alias Txterm='export TERM=xterm' alias XARGS='xargs -r' alias cdrecord='cdrecord -dev 0.3.' alias .. e -ash non cercher! di es andere ricorsiva*ente il testo di ri* iazzo.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. CiE signi)ica che uno uE creare un alias ls di ls -F.='cd .1.. allora la successiva arola del co*ando che segue l:alias verr! anche controllata er l:es ansione degli alias. franky: ~> alias alias .0 -speed=8' alias e='vi' alias egrep='grep -E' alias ewformat='fdformat -n /dev/fd0u1743.0. er ese* io... *a una arola che 3 identica ad un alias da es andere non viene es ansa una seconda volta.='cd .='cd .. quella arola viene sostituita dal testo dell:alias. 5n altro uso degli alias 3 er correggere degli errori di scrittura. co* resi i *etacaratteri della shell. 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.. 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`. 2e cosD 3. 8a ri*a arola di un testo di ri* iazzo viene controllata er la resenza di alias. .$. 2e l:ulti*o carattere di un valore di alias 3 uno s azio o un carattere tab../..ornite alias senza o zioni er *ostrare un elenco di alias noto alla shell corrente. Il no*e degli alias e il testo di ri* iazzo uE contenere qualsiasi valido dato in ingresso di shell. 8a shell conserva un elenco degli alias che ossono essere de)initi ed eli*inati con i co*andi integrati alias e unalias.. eccetto che il no*e dell:alias non uE contenere [b[... 8a ri*a arola di ogni se* lice co*ando.' alias . 8:a*biente di -ash &" . 2lias 3. se riva di a ici..$.

3. 4li alias vengono es ansi quando viene letto un co*ando.3G Avail 1018M 105M 3. 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. /ale co* orta*ento 3 anche un roble*a quando vengono eseguite delle )unzioni. non quando la )unzione viene eseguita. +i i@ sulle )unzioni nel Ca itolo 11. Ca itolo 3. =entre gli alias sono i@ se* lici da co* rendere. *ettete se* re le de)inizioni degli alias in una riga se arata. 8:a*biente di -ash &% .9G 5. Le fun1ioni sono piJ eloci 4li alias vengono resi in considerazione do o le )unzioni e cosD la risoluzione 3 i@ lenta. 8a shell -ourne HshI non riconosce gli alias. I rocessi )igli non ereditano gli alias. esso viene riconosciuto solo all:interno della shell corrente. +unque.3G 121M 13G 13G 243M 3. franky ~> alias dh='df -h' franky ~> dh Filesystem /dev/hda7 /dev/hda1 /dev/hda2 /dev/hda3 none /dev/hda6 /dev/hda5 Size 1. Per essere sicuri.7G 5.2.2G Used 272M 9.4M 8. Per un uso er*anente.7G 7. 4li alias vengono es ansi quando viene letta la de)inizione di una )unzione. erché la de)inizione di una )unzione 3 essa stessa un co*ando co* osto. inserite l: alias in uno dei vostri )ile di inizializzazione della shell7 se inserite l:alias unica*ente nella riga di co*ando.2G 4. e non utilizzate alias in co*andi co* osti.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. I co*andi che seguono la de)inizione di alias in quella linea non sono in)luenzati dal nuovo alias. a *eno che non venga i* ostata l:o zione expand_aliases *ediante l:integrato di shell shopt. gli alias de)initi in una )unzione non sono dis onibili se non do o l:esecuzione di quella )unzione. +i conseguenza.$. Creazione e ri)ozione degli alias 4li alias si creano usando l:integrato di shell alias.4li alias non vengono es ansi quando la shell non 3 interattiva. le )unzioni di shell sono re)erite in luogo degli alias er quasi ogni sco o. non quando esso viene eseguito.3G 0 3.

2IF7 willy:~/scripts> bash --posix script.2. Possono essere anche incluse nei )ile di con)igurazione delle risorse di shell. sia durante l:o erativit! della shell stessa.%. er abilitare un:o zione. ] er disabilitarla7 willy:~/test> set -o noclobber willy:~/test> touch test willy:~/test> date > test iuttosto Ca itolo 3. 3. 5na quantit! di o zioni ha una scorciatoia da un carattere7 er ese* io. 5sate il trattino O Hda hI.1.3.%. l:o zione xtrace corris onde a set -x. In questa sezione dare*o uno sguardo i@ a ro)ondito alle o zioni di -ash. 6lteriori opzioni di Bash 3. Il seguente co*ando esegue uno scri t in *odalit! co* atibile P. . 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.sh Per *odi)icare te* oranea*ente il corrente a*biente. 8:a*biente di -ash 7( .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. .%. otre**o usare set. sezione 2hell -uilt<in Co**ands<T/he 2et -uilt<in er una descrizione di ogni o zione.pzioni di visualizzazione 1bbia*o gi! trattato di una co ia di o zioni che sono utili er correggere i vostri scri t. o er l:utilizzo in uno scri t.

'. 9uesti )ile contengono o zioni di shell. 2icco*e arecchi caratteri hanno do i o tri li signi)icati in base all:a*biente. 3o))ario 8:a*biente -ash uE essere con)igurato global*ente ed in base al singolo utente. che reviene l:es ansione di caratteri s eciali7 willy:~/testdir> set -o noglob willy:~/testdir> touch * willy:~/testdir> ls -l * -rw-rw-r-. +i seguito un ulti*o ese* io che *ostra l:o zione noglob. er ese* io.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. er ese* io -u. -ash i* iega vari *etodi di es ansione dei dati inseriti nella riga di co*ando er decidere quali co*andi eseguire. che reviene la sovrascrittura dei )ile esistenti da arte di o erazioni di ridirezione. 8o stesso vale er le o zioni a singolo carattere. 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. 1d eccezione dei ara*etri riservati della shell -ourne. de)inizioni di )unzioni e diversi altri blocchi di costruzione er crearci un a*biente con)ortevole. di -ash e quelli s eciali. i no*i delle variabili ossono essere scelti i@ o *eno libera*ente. con uscita di una shell non interattiva quando si incontrano tali errori. i* ostazioni er variabili. Ca itolo 3.1 willy willy 0 Feb 27 13:37 * 3. che tratteranno le variabili non de)inite co*e errore quando de)inite. 2i usano vari )ile di con)igurazione er de)inire in *odo articolareggiato il co* orta*ento della shell. 8:a*biente di -ash 71 . 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. -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.

. Per ri*a cosa eseguire*o alcuni esercizi generali sulla de)inizione e la variabili. o ure in *odalit! video invertito. VAR1. [13[ e [-uon co* leanno[. =ostrate i valori di tutte tre le variabili. 'i*uovete VAR3. VAR2 e VAR3N inizializzatele er tenere ris ettiva*ente i valori [tredici[. re)eribil*ente in un colore vivace co*e il rosso o rosa.sercizi Per questo esercizio dovrete leggere le agine *an di useradd. Potete vedere le restanti due variabili in una nuova )inestra di ter*inale? &.*. che vengono co iati nella directorG ersonale di ogni utente a ena aggiunto. i* ostate l:invito con qualcosa co*e [PericoloVV root sta )acendo cose in U>[. $.3. 2 eri*entate le vostre *odi)iche aggiungendo un nuovo utente ed autenticandovi co*e quello. erché stia*o er usare la directorG /etc/skel er conservare i )ile rede)initi della con)igurazione della shell. 2. Non scordatevi di a licare chmod ai vostri scri tV Ca itolo 3. 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. 8o scri t dovrebbe calcolare la su er)icie di un rettangolo che ha queste *isure. 7. 3. +ovrebbe essere corredato di co**enti e generare dei risultati eleganti. 2crivete uno scri t in cui assegnate due valori interi a due variabili. %. 9ueste sono variabili locali o globali? #. resentazione delle 1. Per l:account root. Create 3 variabili. ". 8:a*biente di -ash 72 . =odi)icate /etc/profile in *odo che tutti gli utenti vengano salutati al *o*ento della autenticazione H rovate questoI.

8a *aggior arte dei caratteri. '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 #.c aN. 8:oggetto che recede 3 o zionale e sar! )atto corris ondere al*eno una volta. 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.spressioni regolari #. 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.=c < Corris onde ad ogni carattere. *a non i@ di = volte. 8:oggetto che recede sar! )atto corris ondere al*eno N volte. 8:oggetto che recede sar! )atto corris ondere da N a i@ volte.1. 8:oggetto che recede sar! )atto corris ondere da una a i@ volte.1.1. ? ^ ] aNc aN. 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 #. 8:oggetto che recede sar! )atto corris ondere esatta*ente N volte. #. co* rese tutte le lettere e le ci)re. . 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 .1. 8:oggetto che recede sar! )atto corris ondere da zero a i@ volte.Capitolo #. 8e es ressioni regolari . Il blocchi )onda*entali er realizzarle sono delle es ressioni regolari che coincidono con un singolo carattere.2.

o ure in qualsiasi altro genere di dati in uscita voi abbiate richiesto con le o zioni. +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. 'a resenta anche i caratteri non co* resi nell:intervallo della lista. 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. [UH[. 2e il bGte )inale di un )ile in ingresso non 3 un nuovalinea. #. g \ Ub UUe UT Corris onde alla stringa vuota all:inizio di una linea. 0eri)icate nella docu*entazione del vostro siste*a se i co*andi che usano es ressioni regolari su ortano le es ressioni estese. +al *o*ento che un nuovalinea 3 ure un se aratore in un elenco di *odelli. Corris onde alla stringa vuota alla )ine di una riga.2. [UX[. Ca itolo #. .intervallo in un elenco.1. il quale invece ha la recedenza sull:alternanza. [H[. e [I[ erdono il loro signi)icato s eciale7 usate invece le versioni con barra inversa [U?[. 8a ri etizione ha la recedenza sul concatena*ento. non c:3 *odo di con)rontare dei caratteri di nuovalinea in 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. gre ne )ornisce uno in *odo tacito. [Ua[. Corris onde alla stringa vuota all:estre*it! di una arola. Corris onde alla stringa vuota alla )ine della arola.2. [][. 2ebbene gre si as etti di eseguire la co* arazione su un testo. e [UI[.spressioni regolari ele)entari contro estese Nelle es ressioni regolari ele*entari i *etacaratteri [?[. Corris onde alla stringa vuota all:inizio della arola. co ia Hdi consuetoI la linea nello standard out ut. [X[.se)pi di utilizzo di grep #. . [U][. +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.3. 5na sottoes ressione intera uE essere racchiusa tra arentesi er scavalcare queste regole di recedenza. #. 8e es ressioni regolari 7# .1. [a[. Corris onde alla stringa vuota )ornita che non 3 all:edge della arola.

bash. Ca itolo #.bash* | grep -v history /home/cathy/.directorG. in *aiuscolo o in *inuscolo. il quale su orta le es ressioni regolari estese.ate attenzione che la ricerca 3 er la tringa [ s[ e non er il comando ps. in *odo da tralasciare i con)ronti con ~/. *a gli acccount con la shell nologin non vengono *ostrati. utilizzando le es ressioni regolari. Poi *ostra i nu*eri di linea contenenti questa stringa di ricerca. 5rep e le espressioni regolari Se non siete su Linu+ Noi usia*o in questi ese* i 4N5 gre . escludendo le coincidenze con la stringa hi tor!. . 8:ulti*o co*ando *ostra le linee da tutti i )ile nella sua directorG ersonale che iniziano con ~/.gnu. 9uindi conta il nu*ero di account che hanno /bin/false co*e shell. #. veri)icate con l:o zione <0 che versione state utilizzando.44m\]$USER is in \w\[###BOT_TEXT###33[0m\] " Con il ri*o co*ando l:utente cath! *ostra dal )ile /etc/passwd le linee contenenti la stringa root.bashrc:PS1="\[###BOT_TEXT###33[1. . Con il terzo co*ando controlla quali utenti non stanno bash.2.org. 4N5 gre uE essere scaricato da htt 7. 2e state lavorando su siste*i ro rietari.2.bash_history che otrebbe contenere la *edesi*a stringa.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 ~/.. 8e es ressioni regolari 7$ .ra vedia*o che cos:altro ossia*o )are con gre . 4N5 gre 3 di base nei siste*i 8inuA..

saranno *ostrate tutte le linee dalla tabella del )ile sGste*. allora co* arer! qualsiasi carattere N. Per ottenere l:inter retazione tradizionale delle es ressioni regolari. #. UT corris onde alla )ine di una arola. 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. utilizzando la sequenza di con)ronto e l:insie*e dei caratteri del singolo siste*a. cathy ~> grep [yf] /etc/group sys:x:3:root. Per ese* io. 1ll:interno di un:es ressione tra arentesi.bashrc | grep '###BOT_TEXT###lt;PATH' export PATH="/bin:/usr/lib/mh:/lib:/usr/bin:/usr/local/bin:/usr/ucb:/usr/dbin:$PATH" In *aniera si*ile.#.2. una e pre ione di intervallo 3 )or*ata da due caratteri se arati da un trattino. in *odo da non *ostrare MANPATH e d altri ossibili ercorsi7 cathy ~> grep export ~/. Classi di caratteri 5na e pre ione tra parente i 3 un elenco di caratteri racchiusi tra [J[ e [K[. In)ine.1.postfix ftp:x:50: Ca itolo #.[g[. selezionate ri*a le linee [eA ort[ e oi cercate quelle che iniziano con la stringa [P1/B[. otete usare l:a*biente C i* ostando la variabile a*bientale LC_ALL con il valore [C[.N resente in esso. nello s eci)ico a*biente C.2. 6ssa )a corris ondere ogni singolo carattere co* reso tra i due caratteri non esclusi. 6ssa con)ronta ogni singolo carattere di quella lista7 se il ri*o carattere dell:elenco 3 l:accento circon)lesso.bashrc. 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. 8e es ressioni regolari 7& . [Ja<dK[ 3 equivalente a [JabcdK[.2. 2e volete trovare una stringa che sia una arola se arata Hracchiusa tra s aziI.adm tty:x:5: mail:x:12:mail. 3 *eglio utilizzare la -w. 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 ~/. 0edete il *an di grep o le agine in)o er *aggiori in)or*azioni su tali es ressioni rede)inite. Per ese* io. l:es ressione regolare [J(123#$&7"%K[ con)ronta ogni singola ci)ra.2.bin. =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[.2. certe classi deno*inate di caratteri sono rede)inite all:interno delle es ressioni tra arentesi.

usate degli a ici singoli.[ er la corris ondenza di un solo carattere. usate l:asterisco.h###BOT_TEXT###gt;' /usr/share/dict/words catch clash cloth coach couch cough crash crush 2e volete *ostrare le linee contenenti il carattere letterale unto. 9uesto ese* io seleziona tutte le arole che iniziano con [c[ e ter*inano con [h[ nel dizionario di siste*a7 cathy ~> grep '###BOT_TEXT###lt;c.. 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 '###BOT_TEXT###lt;c. 9etacaratteri @wildcardA 5sate il [. cosa che non restituisce alcuna linea.2.d/*.sh . Co)parazione dei )odelli utilizzando le (unzionalit" di Bash . 8e es ressioni regolari 77 . do #. ci sono *olte co* arazioni di *odelli che otete eseguire diretta*ente nella shell senza dover ricorrere ad un rogra**a esterno. usate l:o zione -F con grep.3. 5sando gli a ici viene rodotto un risultato7 cathy ~> grep * /etc/profile cathy ~> grep '*' /etc/profile for i in /etc/profile.1. Per co* arare *olte lici caratteri. Inter!alli dei caratteri 1 arte grep e le es ressioni regolari.. Nell:ese* io seguente CathG ri*a rova a trovare il carattere asterisco in /etc/profile senza usare gli a ici.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 [)[.*h###BOT_TEXT###gt;' /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.3.3. Ca itolo #. #.2.

vengono riconosciuti diversi o eratori estesi di co* arazione dei *odelli. [blan?[. [s ace[. Ca itolo #. Classi di caratteri 8e classi di caratteri si ossono s eci)icare all:interno delle arentesi quadre utilizzando la sintassi J7C81227K. se le co ie di caratteri sono se arati da un trattino. [lo>er[. [cntrl[. [ unct[. [u er[.[b[. 8e es ressioni regolari 7" . 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. #.Co*e gi! sa ete. 8eggete di i@ nelle agine in)o di -ash. [>ord[ o [Adigit[. sezione -asic shell )eatures<T2hell 6A ansions<T. 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!. [ rint[. [A[. [ascii[. 2e il ri*o carattere tra arentesi 3 [V[ o [g[.0/ 997376 Apr 18 15:39 Schedule.3.2IF ed ha uno dei valori [alnu*[. [digit[. se i* ostata. [G[. 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. )orzatene questo co* orta*ento i* ostando LC_COLLATE o LC_ALL a [C[. 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. includetelo co*e ri*o o ulti*o carattere dell:insie*e. verr! co* arato qualsiasi carattere non incluso. o [z[. '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.ilena*e 6A ansion<TPattern =atching. [gra h[. iniziando da [a[.2.sdc 9uando 3 attiva l:o zione di shell extglob Hutilizzando l:integrato shoptI. 8:ordina*ento di ende dall:a*biente corrente e dal valore della variabile LC_COLLATE. [al ha[.org1. Per con)rontare il trattino H[<[I. dove C8122 3 de)inita nello standard P. [c[. 2e volete essere sicuri di avere l:inter retazione tradizionale degli intervalli.

sercizi 9uesti esercizi vi aiuteranno a adroneggiare le es ressioni regolari. Per ora otete s eci)icare il no*e utente nello scri t. elencate le unit! disco locali. 8e es ressioni regolari 7% . =ostrate i )ile di con)igurazione in /etc contenenti nu*eri nei loro no*i. che 3 )onda*entale in qualsiasi a*biente 5NIF. $. . il database Postgre298 e cosD via. 8a versione 4N5 di grep giunge con dovizia di docu*entazione. utilizzando grep. 3o))ario 8e es ressioni regolari sono degli stru*enti otenti er selezionare delle linee articolari dai )ile o dai dati in uscita. 11. 9ueste sottodirectorG quanti )ile README contengono? Non contate nulla che abbia la )or*a di ['61+=6. Potete trovare un:alternativa a -c -1 utilizzando grep? 5sando la tabella del )ile sGste* H er ese* io. ". 2. il nu*ero di linee che soddis)ano la stringa di ricerca e contate quante volte ricorre la stringa. #.#. che siete calda*ente consigliati di leggereV -ash ha delle )unzionalit! integrate er co* arare *odelli e uE riconoscere classi e intervalli di caratteri. =ostrate un elenco delle sottodirectorG /usr/share/doc contenenti in)or*azioni sulla shell. #. Ca itolo #. 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. &. 1.unaMstringa[. Per ese* io.ate un elenco dei )ile della vostra directorG ersonale che sono stati *odi)icati *eno di 1( ore )a. 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.$. 12. le es ressioni regolari sono utilizzate nel )oglio elettronico 6Acel che viene )ornito con la suite =icroso)t Cindo>s . . 2ta* ate tutte le linee dallo stesso )ile che non contengono la stringa recedente. In questo ca itolo abbia*o reso con)idenza con il co*ando grep. =ostrate un elenco di tutti gli utenti nel vostro siste*a che si sono autenticati con la shell -ash co*e rede)inita. =ettere questi co*andi in uno scri t di shell che generi dei risultati co* rensibili. 1(. %. =olti co*andi 5NIF usa es ressioni regolari7 im. =ostrate le in)or*azioni di localhost dal )ile /etc/hosts. 7. 'ealizzate uno scri t che veri)ichi se un utente esiste in /etc/passwd. etc/fstabI. 3. non dovete lavorare con argo*enti e condizioni in questa )ase.))ice. +alla directorG /etc/group/ *ostrate tutte le linee che iniziano con la stringa [dae*on[. perl.#. *a tralasciando le directorG.

sed 3 di grande aiuto.2. /ale caratteristica consente di utilizzare dei co*andi di *odi)ica negli scri t. 9uando si resenta la necessit! di sostituire del testo in un grande nu*ero di )ile. 3 la sua ca acit! di )iltrare testi che riceve da )onti di incanala*ento. CiE che distingue sed da altri editor. 8:editor non *odi)ica gli originali dati in ingresso. Il risultato viene inviato allo standard out ut. 2ezione #.1. Non vi serve interagire con l:editor *entre sta )unzionando7 questo 3 il *otivo er cui sed talvolta viene de)inito un batch editor. 8a sintassi del co*ando sed non ha s eci)iche di un )ile in uscita. se* li)icando enor*e*ente i co* iti ri etitivi di revisione. I co*andi di *odi)ica sono si*ili a quelli usati nell:editor i7 Ca itolo $. *a i risultati si ossono salvare in un )ile utilizzando la redirezione dei dati in uscita.Capitolo $.1. )ate ri)eri*ento alle agine in)o e *an di sed. 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. $.1. Per in)or*azioni dettagliate. 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. Introduzione $. co*e i e ed.2.1. $. 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. 8:editor di )lussi 4N5 sed "( .

2. otete assegnare delle o zioni a sed. &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. Ca*bia HchangeI il testo nella linea corrente con quello nuovo. 2ta* a HprintI il testo. Inserisce Hin ertI il testo al di so ra della linea corrente. Nella tabella successiva c:3 una anora*ica7 Tabella =#. in questo caso Ca itolo $. 9odi(ica interattiva $. 8egge HreadI un )ile. 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. Tutti questi erori mi fanno impazzire. Cancella HdeleteI il testo. 0oglia*o sed er trovare le linee che contengono il nostro *odello di ricerca. Così tanti erori. *a non otreste eseguire un [trova e sostituisci[ utilizzando tale co*ando.2. 8:editor di )lussi 4N5 sed "1 . Molti erori. 2crive H$riteI in un )ile. E' un testo con erori. Questa è una linea che non contiene errori. 1ggiunge i co*andi contenuti nel )ile 2C'IP/<. 2ta* a le in)or*azioni sulla versione ed esce. 'icerca H earchI e sostituisce un testo.Tabella =#1 ) comandi di ed per la modifica )omando aU cU d iU r s > Fisultato 1ggiunge HappendI del testo sotto la linea corrente. 3ta)pa delle linee contenenti un )odello 9uesto 3 qualcosa che otreste )are con grep. 1 arte la *odi)ica dei co*andi. =odo silenzioso. CiE 3 solo er iniziare.I86 all:insie*e dei co*andi da )ar )unzionare *entre si stanno elaborando i dati in entrata. $. 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. Questa è l'ultima linea.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 "#

sh #!/bin/bash # Questo è un semplice script che potete usare per convertire testi in HTML. 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 $.3. 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.sh test conversione test.sed 1i\ <html>\ <head><title>html generato da sed</title></head>\ <body bgcolor="#ffffff">\ <pre> $a\ </pre>\ </body>\ </html> sandy ~> cat txt2html." SCRIPT="/home/sandy/scripts/script... in modo che avvenga solo una volta # l'aggiunta." sandy ~> $1 contiene il ri*o argo*ento di un dato co*ando. 8:editor di )lussi 4N5 sed "$ .. sandy ~> cat script. sandy ~> txt2html. poi sostituiamo i nuovelinea.$PID.sed" NAME="$1" TEMPFILE="/var/tmp/sed. echo "conversione $1. 3crittura dei (ile dei dati in uscita 8a scrittura dei dati in uscita HoutputI si esegue utilizzando l:o eratore di redirezione di uscita >. togliamo tutti i caratteri di nuovalinea. $. # Primo. le linee )iniscano con una barra inversa. 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.tmp" sed "s/\n/^M/" $1 | sed -f $SCRIPT | sed "s/^M/\n/" > $TEMPFILE mv $TEMPFILE $NAME echo "finito.2. tutte.• quando si aggiunge o sostituisce un testo.. tranne l:ulti*a.

3. )atelo recedere da una linea co*e [<<9uesto 3 un collega*ento si*bolico<<[. =ettete il risultato in un )ile te* oraneo. Create uno scri t che *ostri le linee contenenti degli s azi bianchi da un )ile. Cancellate le ri*e 3 linee di ogni )ile te* oraneo. CiE uE risultare di grande aiuto se tendete a di*enticare barre inverse e si*ili. 0iene utilizzato s esso er eseguire delle o erazioni cerca<e<sostituisci su linee contenenti un *odello.$. Create un )ile contenente i co*andi di sed er eseguire i due co* iti recedenti. Create un )ile contenente co*andi di sed che veri)ichino collega*enti si*bolici e )ile nor*ali. CiE lo rende adatto ad un uso non interattivo. 2. &.#. Ca itolo $. 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. 2e un )ile 3 un collega*ento si*bolico.. aggiungete una stringa nella stessa linea con un co**ento co*e [e<<< questo 3 un )ile nor*ale[. 8:editor sed usa co*andi si*il< i ed accetta es ressioni regolari. con su orto della evidenziazione della sintassi.sandy ~> 9uesto non 3 co*e dovrebbe essere )atto in realt!7 tale ese* io di*ostra sola*ente delle ca acit! di sed. 7. $.usr. 4uardate la 2ezione &.3 er una soluzione i@ decente di questo roble*a. 8o stru*ento sed uE leggere co*andi da linea di co*ando o da uno scri t. 2ta* ate nell:uscita standard soltanto le linee contenenti il *odello [an[.bin che hanno la lettera [a[ co*e secondo carattere. sono in grado di riconoscere la sintassi di sed.ate un elenco dei )ile in . 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[. sed facile 4li editor avanzati. 2ta* ate un elenco delle linee nella vostra directorG scripts ter*inanti con [.sh[. $.viene usato co*e dato in ingresso. . 'icordatevi che otreste dover togliere l:alias a ls. $. 9uesto scri t dovrebbe utilizzare uno scri t sed e *ostrare delle in)or*azioni sensate all:utente. utilizzando i costrutti 3%')6 e %6D di a-!. 5n lungo elenco della directorG radice. Controllate i risultati. . =ettete il risultato in un )ile te* oraneo.sercizi 9uesti esercizi sono diretti a di*ostrare ulterior*ente cosa sed uE )are. 1. . 8:editor di )lussi 4N5 sed "& . 2e il )ile 3 un nor*ale )ile. #.

+al *o*ento che il rogra**a a-! 3 s esso solo un lin? a ga-!. Cosa signi)ica vera*ente? Ca itolo &. un altro di))uso editor di )lussi. 8a )unzione basilare di a-! 3 di cercare nei )ile linee od altre unit! di testo contenenti uno o i@ *odelli. Per tale *otivo i rogra**i a-! sono s esso iacevoli da leggere e scrivere. Il linguaggio di rogra**azione 4N5 a>? "7 . Cos74 gaBC? 4a>? 3 la versione 4N5 del rogra**a 5NIF co*une*ente dis onibile a-!. 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.Capitolo %.1. %. vengono eseguite delle s eciali azioni su quella linea. 9uando una linea corris onde ad uno dei *odelli.1. 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. sono stati scritti libri interi sulle varie versioni di a-!. 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. 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>?[. di solito 3 i@ di))icile descrivere chiara*ente i dati che il vostro rogra**a elaborer!. 9uando si lavora con linguaggi rocedurali. noi )are*o ri)eri*ento ad esso co*e a-!.1. Introduzione a gaBC %.

2I 9uesta variabile 3 rede)inita er essere di uno o i@ s azi o tabulazioni. $3. 8a variabile $0 HzeroI contiene il valore dell:intera linea. terzo )ino all:ulti*o ca* o di una linea in ingresso.2. 2ezione &. 3ta)pa di ca)pi selezionati Il co*ando print in a-! e*ette dei dati selezionati dal )ile in ingresso. I loro no*i erano 1ho.gni regola recisa un solo *odello da cercare ed una o erazione da eseguire nel *o*ento in cui si riscontra il *odello. 2e il rogra**a 3 breve.1. Il progra))a print %. 8e variabili $1.3. Presero il ri*o carattere di ciascuno dei loro no*i e li *isero assie*e. …. $N contengono i valori del ri*o. 9uando a-! legge una linea di un )ile. 3 i@ se* lice lanciarlo da linea di co*ando. s eci)icate un programma a-! che dice ad a-! cosa )are.1. CosD il no*e del linguaggio avrebbe otuto essere stato tuttal i@ [>a?[. condizioni ed altri costrutti di rogra**azione. Il linguaggio di rogra**azione 4N5 a>? "" . $2.2. Il rogra**a consiste in una serie di regole Hrule I7 uE anche contenere de)inizioni di )unzioni.2. I comandi di ga#$ 9uando )ate girare a-!. 9uesto otrebbe a arire cosD7 a>? -f FILEPROGRAMMA fileiningresso %. dove vedia*o sei colonne in uscita del co*ando df7 Ca itolo &./e* o )a negli anni :7( tre rogra**atori decisero di creare questo linguaggio. . )unzionalit! avanzate che er ora ignorere*o. Sernighan e Ceinberger. secondo. cicli. ". CiE viene illustrato nella i**agine successiva. Ci sono diversi *odi er avviare a-!. 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.

il no*e del )ile. quest:ulti*i a arirebbero Ca itolo &.2.-igura >#1/ Campi in a$k Nei dati in uscita di ls -l. di solito uno s azio. Il linguaggio di rogra**azione 4N5 a>? "% . che contiene la di*ensione dei )ile. )onfigura1ione locale Notate che la con)igurazione dei dati in uscita del co*ando ls 'l otrebbe essere di))erente nel vostro siste*a. ". In tal caso il carattere se aratore di uscita rede)inito.sh kelly@octarine ~/test> 9uesto co*ando ha sta* ato la quinta colonna di un lungo elenco di )ile.sed 120temp_file 126test 120twolines 441txt2html. verr! inserito tra ciascun ca* o in uscita. utilizzando solo il se aratore dei dati in uscita. ci sono % colonne. 8a resentazione di ora e data di ende dalle vostre i* ostazioni d:a*biente. Formattare i campi 2enza )or*attare. 9uesti dati in uscita non sono *olto leggibili a *eno che utilizziate il *odo u))iciale di ri)eri*ento alle colonne.2. che 3 quello di se arare con una virgola quelle che volete sta* are. e l:ulti*a colonna. 8:istruzione print usa questi )ile nel *odo seguente7 kelly@octarine ~/test> ls -l | awk '{ print $5 $9 }' 160orig 121script.

Potete estrarre qualsiasi nu*ero di colonne ed anche invertirne l:ordine. 0iene e*essa una lunga lista che *ostra la quantit! totale dei blocchi nella directorG quando l:argo*ento 3 una directorG. 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.sh kelly@octarine ~/test> . 8:utilizzo della barra inversa consente anche la co ia e l:incollaggio delle linee so rastanti in una )inestra di ter*inale. il vostro *onitor non lo 3. segni del dollaro ed altri *etacaratteri dovrebbero essere resi con l:esca e di una barra inversa. 1ggiungia*o ure l:o zione -d er la *edesi*a ragione.sservate l:uso della barra inversa. 0. Il linguaggio di rogra**azione 4N5 a>? %( .2.3. %. 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.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.3. e certa*ente non lo 3 neanche la carta sta* ata.iuttosto scarni. Inserendo una co ia di tabulazioni e una stringa er indicare che ti o di dati sono questi. 8a barra inversa in questo ese* io segna la continuazione di una linea. 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. nel caso l:asterisco si es anda ad una directorG. 9uesta linea ci 3 inutile.2. 8:o zione -h con ls viene usata er )ornire dei )or*ati di*ensionali u*ana*ente leggibili er i )ile i@ grandi. 2ezione 3. Il co)ando print e le espressioni regolari Ca itolo &. quindi aggiungia*o un asterisco. =entre i vostri dati in ingresso nella linea di co*ando ossono essere di lunghezza virtual*ente illi*itata.

il secondo 3 sotto esca e erché )a arte di una stringa da ricercare Hla )ine del no*e del )ileI. 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% /.conf xinetd.conf$/ { print $9 }' amd. Il linguaggio di rogra**azione 4N5 a>? %1 .conf antivir. ".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.5na es ressione regolare si uE usare co*e *odello includendola tra barre.conf xinetd.etc dei )ile che ter*inano er [.conf xcdroast.con)[ ed iniziano o con [a[ o con [A[. oiché hanno un signi)icato s eciale er il rogra**a in a-!.vol1 : 8% kelly is in ~> oi 4li a ici devono essere sotto esca e. signora? kelly is in /etc> Ca itolo &.conf antivir.conf$/ { print $9 } END { print \ "Posso fare qualcosa ancora per lei.conf xcdroast.conf xcdroast. .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 '/###BOT_TEXT###lt;[a|x].conf xinetd. 6ssa viene controllata ris etto al testo intero di ogni record. signora?" }' amd. %odelli speciali Per )ar recedere l:e*issione da co**enti.*\. +i sotto un altro ese* io in cui cerchia*o nella directorG .*\. utilizzando le es ressioni regolari estese7 kelly is in /etc> ls -l | awk '/###BOT_TEXT###lt;(a|x).2.*\.conf$/ { print $9 }' File trovati: amd.conf antivir.conf Posso fare qualcosa ancora per lei. utilizzate l:istruzione B%GI?N kelly is in /etc> ls -l | \ awk 'BEGIN { print "File trovati:\n" } /###BOT_TEXT###lt;[a|x].

2. ecc. seguiti da un altro nu*ero e segno di ercentuale. altre a sola lettura.2. 8a sua sintassi 3 riconosciuta dalla *aggioranza degli editor che eseguono l:evidenziazione della sintassi er altri linguaggi. Il se aratore di ca* i viene ra resentato nella variabile integrata FS.awk BEGIN { print "*** ALLARME ALLARME ALLARME ***" } /###BOT_TEXT###lt;[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. Notate che questa 3 un o: diversa dalla variabile IFS usata dalle shell aderenti a P. 2ezione &.. 5no scri t a-! contiene istruzioni in a-! che de)iniscono *odelli ed azioni. Il valore della variabile del se aratore di ca* i uE essere ca*biata nel rogra**a in a-! con Ca itolo &. % iden1ia1ione della sintassi 1>? 3 un linguaggio di rogra**azione.. Il separatore di ca)pi i))essi Il eparatore di campi.2IF.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. 2i aggiunge un *essaggio )inale. Co*e illustrazione. kelly is in ~> cat diskrep. co*e C. realizzere*o un ra orto che *ostri le nostre artizioni i@ iene. 5li script in gaBC Non a ena i co*andi tendono ad essere un o: i@ lunghi. -ash. Le variabili di gaBC =entre a-! sta elaborando il )ile i**esso. 0.3. che uE essere sia un singolo carattere sia un:es ressione regolare. %. 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. otreste desiderare di *etterli in uno scri t.1. B/=8. usa diverse variabili.2. controlla il *odo in cui a-! s ezzettata in ca* i un record i**esso. in *odo da riutilizzarli. %.$. 1lcune sono *odi)icabili.3. oi )or*atta tutte le linee che contengono un otto o un nove all:inizio di una arola.%. Il linguaggio di rogra**azione 4N5 a>? %2 .

2. Nell:ese* io sottostante. 1nt>er . otrebbe a arire co*e questo7 kelly is in ~> cat printnames. Il separatore dei ca)pi in e)issione Nor*al*ente i ca* i sono se arati da s azi nell:e*issione..1. dove gli argo*enti vengono se arati da virgole7 Ca itolo &. Cong.awk BEGIN { FS=":" } { print $1 "\t" $5 } kelly is in ~> awk -f printnames. Cong. Il se aratore dei ca* i in ingresso rede)inito 3 uno o i@ s azi bianchi o tabulazioni. 2e necessario. cosicché ro rio il ri*o record viene letto con il corretto se aratore.awk /etc/passwd --output omitted-- 2cegliete con attenzione il ca* o di i**issione er evitare roble*i. 2 esso il *o*ento giusto er )are ciE 3 all:inizio dell:esecuzione ri*a che qualsiasi i**issione sia stata elaborata. 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. usate un a-! o sed eAtra er uni)or*are i )or*ati di i**issione dei dati. 2(((F[ Il vostro a-! )ornir! un:e*issione errata er questa linea. I separatori di e)issione %. Per )are questo. %. Il linguaggio di rogra**azione 4N5 a>? %3 . &# hoo 2t. 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. usate il *odello s eciale B%GI?. eddy Eddy White willy William Black cathy Catherine the Great sandy Sandy Li Wong kelly is in ~> In uno scri t a-!. 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. CiE diventa chiaro quando usate la sintassi corretta er il co*ando print.3. Ph+.3..l:o eratore di assegnazione b. &# hoo 2t. 1nt>er .2.

print tratter! le voci in uscita co*e un solo argo*ento. l:e*issione del rogra**a avviene tutta insie*e su una linea singola. Il separatore dei record in uscita 8:e*issione di un a intera istruzione print 3 chia*ata record in u cita. o*ettendo cosD l:uso del eparatore di emi ione rede)inito.3.o ure in ciascun record di e*issione7 kelly@octarine ~/test> cat processed. Il linguaggio di rogra**azione 4N5 a>? %# . assegnate nuovi valori a OFS ed a ORS7 kelly@octarine ~/test> awk 'BEGIN { OFS=". OFS. %. Il valore rede)inito di questa variabile 3 [Un[.$2}' test record1.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.2. ORS="\n--> fatto\n" } { print "Record numero " NR ":\t" $1. . %. Il nu)ero di record 8:integrato NR contiene il nu*ero dei record che vengono elaborati." .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. un carattere di nuovalinea. $2}' test record1 data1 record2 data2 kelly@octarine ~/test> 2e non *ettete le virgole.data2 --> kelly@octarine ~/test> 2e il valore di ORS non contiene un 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. 8o otete utilizzare alla )ine er contare il nu*ero totale dei record.awk BEGIN { OFS="-" . 9ualsiasi stringa di caratteri uE essere utilizzata co*e se aratore di ca* i in e*issione i* ostando questa variabile integrata.2.$2 } END { print "Numero di record elaborati: " NR } Ca itolo &. ORS="\n-->\n" } \ { print $1. ORS. 0iene incre*entato do o la lettura di una nuova linea di i**issione.data1 --> record2.3.

%.2 diviene *olto i@ se* lice quando usia*o uno scri t a-!7 kelly@octarine ~/html> cat make-html-from-text. il valore della variabile 3 qualsiasi valore sia stato assegnato er ulti*o.awk test Record numero 1: record1-data1 --> fatto Record numero 2: record2-data2 --> fatto Numero di record elaborati: 2 --> fatto kelly@octarine ~/test> %.awk { totale=totale + $5 } { print "Inviare conto per " $5 " dollari a " $4 } END { print "---------------------------------\nTotale entrate: " total } kelly@octarine ~> awk -f totale. Il contenuto dei )ile da i**ettere uE anche essere assegnato alle variabili. otete de)inirne di ro rie. Il linguaggio di rogra**azione 4N5 a>? %$ . I valori ossono essere assegnati diretta*ente utilizzando l:o eratore b.#.kelly@octarine ~/test> awk -f processed. 9uando a-! incontra un ri)eri*ento ad una variabile che non esiste Hche non 3 redeter*inataI. 6lteriori ese)pi 8:ese* io della 2ezione $. 1ariabili de(inite dall7utente 1 arte le variabili integrate.3. Per tutti i ri)eri*enti successivi.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.3.$. 8e variabili ossono essere un valore nu*erico o stringa.awk BEGIN { print "<html>\n<head><title>HTML generato da awk</title></head>\n<body bgcolor=###BOT_TEXT###quot;#ffffff###BOT_TEXT###quot;>\{ 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. viene creata la variabile ed inizializzata co*e stringa vuota. 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.html Ca itolo &.

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.3. CiE si )a )ornendo una stringa.%. anche er i reali autori dei rogra**i che usano tali linguaggi. 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. 8a sintassi 3 la stessa dell:istruzione printf del linguaggio C7 v. statistiche ed altre o erazioni sul )lusso dei dati i**essi. 1ltre cose che dovreste conoscere di a-!7 • Il linguaggio resta ben conosciuto su 5NIF e si*ili. se sta* are un segno e quante ci)re sta* are do o la virgola deci*aleI. 3o))ario Il rogra**a di utilit! ga-! inter reta un linguaggio di rogra**azione dagli sco i s eciali. 8a dichiarazione al volo di variabili 3 diretta e consente se* lici calcoli di so**e. 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. la vostra guida introduttiva del C. 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. 8e agine in)o di ga-! contengono s iegazioni esaurienti. se sta* are un es onente. In altri ter*ini. utilizzate printf.accia*o di nuovo ri)eri*ento alla directorG contenente gli initscri t nel vostro siste*a. • 2ia Perl che a-! condividono la re utazione di essere inco* rensibili. 6: la versione libera del generale co*ando a-! di 5NIF. che controlla co*e e dove sta* are gli altri argo*enti. PerciE docu*entate il vostro codiceV Ca itolo &. 0ariabili e co*andi si ossono inserire negli scri t a-! er l:elaborazione di sotto)ondo Hbackground proce ingI.d/* %.%sempi di a-! nel ostro sistema . Perl 3 i@ di))icile da a rendere. Il linguaggio di rogra**azione 4N5 a>? %& . gestendo delle se* lici *ansioni di ri)or*attazione dei dati con a ena una *anciata di linee di codice. /uttavia a-! ha una curva di a rendi*ento i@ accentuata Hsigni)ica che i* arate *olte cosa in un te* o iuttosto ristrettoI. %.#. chia*ata tringa di formato. *a er l:esecuzione di co* iti si*ili ora si utilizza i@ )requente*ente Perl.

Ca itolo &. scrivere uno scri t -64IN e 6N+ er co* letare la tabella o ure )atelo in B/=8. dc=esempio. mail -s Uso spazio su disco <voi@vostro_comp> < risultatoI. 1. Per ri*a cosa eseguite i co*andi da linea di co*ando. 2e tutto si di*ostra )unzionante. 8o scri t dovrebbe creare un:e*issione sensata Hsensate er essere letta dal ca oI. Il linguaggio di rogra**azione 4N5 a>? %7 . 9uindi inseriteli in uno scri t. create lo scri t er la artizione /7 questa 3 resente in ogni siste*a 5NIFI.sercizi 9uesti sono alcuni ese* i ratici in cui a-! uE essere utile. er ese* io. usate tale in)or*azione. 'ealizzate uno scri t -ash. 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. 2e il de*one quota 3 in )unzione. se sa ete qualcosa di F=8. altri*enti usate find. 2. 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 </entry> </row> In aggiunta.%. 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. 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.$. )ate in *odo che lo scri t vi invii un *essaggio elettronico con i suoi risultati Hutilizzate. dc=com cn: Nome Cognome sn: Cognome numerotelefonico: Numero telefonico Create un )ile contenente una co ia di record di rova e controllate. . utilizzando a-! e i co*andi standard di 5NIF.

2e l:argo*ento FILE di una sola delle ri*itive 3 nella )or*a /dev/fd/N.then. Istruzioni condizionali %" . se nessuna delle condizioni testate 3 vera.1. Introduzione a i( '.else  i costrutti if. Istruzioni condizionali In questo ca itolo discutere*o dell:uso delle condizioni negli scri t -ash. se il suo stato di ritorno 3 zero. 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. allora viene veri)icato il descrittore di )ile [N[. stdout e stderr e i loro ris ettivi descrittori di )ile ossono essere utilizzati er controlli. 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.then.elif. 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. Il costrutto if vi er*ette di s eci)icare tali condizioni. viene eseguito anche l:elenco dei )GQ7?@I')G?S%GK%?TI.else  l:utilizzo e la rova dei ara*etri osizionali  le istruzioni if annidate  le es ressioni booleane  l:uso delle istruzioni case '. 2 esso si usano le es ressioni unarie er esa*inare lo stato di un )ile. )GQ7?@I'T%ST i* lica s esso test di con)ronti nu*erici o stringa.1. *a uE essere anche qualsiasi co*ando che restituisce uno stato zero quando ha successo e qualche altro stato quando )allisce.Capitolo '. 1nche stdin. Ca itolo 7.1. 8o stato di rientro Hreturn tatu I 3 lo stato di uscita dell:ulti*o co*ando eseguito o zero.

0ero se FILE esiste ed 3 eseguibile. 0ero se FILE esiste ed 3 un )ile regolare. 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.+ 3 a erto e si ri)erisce ad un ter*inale. 0ero se FILE esiste ed 3 leggibile. o se FILE1 esiste e FILE2 no. Istruzioni condizionali . 0ero se . ure o ure se FILE2 esiste e 0ero se FILE1 e FILE2 si ri)eriscono alla stessa unit! e nu*eri di inode.I.1. named pipe H.1. 0ero se FILE esiste ed il suo bit stic?G 3 i* ostato.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. 0ero se FILE1 3 i@ vecchio di FILE2. o FILE1 no. 0ero se FILE esiste ed 3 scrivibile. 0ero se FILE esiste ed 3 un incanala*ento no*inato. 9ueste ri*itive sono *esse tra arentesi quadre er indicare la veri)ica di un:es ressione condizionale. . 0ero se FILE esiste ed 3 una directorG.I86 esiste ed 3 uno s eciale )ile a blocchi. 0ero se il descrittore di )ile . 0ero se 3 abilitata l:o zione di shell [. 0ero se FILE esiste ed ha una di*ensione *aggiore di zero.NN1=6[ 0ero se la lunghezza di [2/'IN41[ 3 zero. 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 FILE esiste ed il suo bit 24I+ 3 attivo. %% Ca itolo 7.1.I. 0ero se FILE esiste. 0ero se FILE esiste ed 3 uno s eciale )ile a caratteri. 0ero se FILE esiste ed 3 un collega*ento si*bolico.'. 0ero se FILE esiste ed il suo bit 25I+ H2et 5ser I+I 3 i* ostato.P/I..

+i seguito. [ARG1 OP ARG2] 8e es ressioni si ossono co*binare utilizzando i seguenti o eratori. elencati in ordine decrescente di recedenza7 Tabella ?#.1.2. 6: i* ortante ricordare che then e fi sono considerati co*e istruzioni se arate nella shell. CiE uE essere usato er scavalcare la nor*ale recedenza degli o eratori. un aio di se* lici ese* i.[-n STRINGA] o [STRINGA] [STRINGA1 == STRINGA2] [STRINGA1 != STRINGA2] [STRINGA1 < STRINGA2] [STRINGA1 < STRINGA2] ure 0ero se la lunghezza di [2/'IN41[ 3 diversa da zero. *inore o uguale a. 0ero se o %R6F1 o %R6FP 3 vero. ris ettiva*ente. [1'41[ e [1'42[ sono degli interi. *aggiore di. [1'41[ 3 uguale a. essi sono se arati da un unto e virgola. 0ero se %R6F1 ed %R6FP sono entra*bi veri.P[ 3 uno tra -eq. rogra**a eseguibile. +:altra arte. 8:integrata J Ho testI valuta le es ressioni condizionali usando un insie*e di regole basate sul nu*ero di argo*enti. -ne. 0ero se [2/'IN411[ viene do o di [2/'IN412[ in ordine al)abetico secondo i ara*etri locali. diverso da. la arentesi quadra a erta deve essere chiusa do o l:elencazione delle condizioni. ad eccezione del fi di chiusura. 0ero se [2/'IN411[ viene ri*a di [2/'IN412[ in ordine al)abetico secondo i ara*etri locali. 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. -gt o -ge. '. quando vengono inseriti nella linea di co*ando.2IF. =aggiori in)or*azioni su questa *ateria si ossono trovare nella docu*entazione di -ash. 9uesti o eratori binari arit*etici restituiscono vero se. Pro rio co*e if viene chiuso con fi.1. Istruzioni condizionali 1(( . 0ero se le stringhe non sono uguali. *inore di. 0ero se le stringhe sono uguali./ 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. -lt. scri t di shell eseguibile o istruzione di shell. -le. 2i uE usare [b[ al osto di [bb[ er stretta co* atibilit! con P. Ca itolo 7. ovvero *aggiore o uguale a [1'4[. [. In uno scri t le diverse arti dell:istruzione if nor*al*ente sono ben distinte.

" fi echo echo ".1.sh #!/bin/bash echo "Questo script verifica l'esistenza del file messages. . echo "I tuoi file sono protetti da sovrascritture" .fatto.. Verifica.2. Istruzioni condizionali 1(1 ..fatto.1.. '.#.1. Ca itolo 7.2.1." anny ~> .sh Questo script verifica l'esistenza del file messages.. 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.1." echo "Verifica.3. otreste ottenere dei risultati di))erenti dando lo stesso co*ando in uno scri t. '." if [ -f /var/log/messages ] then echo "/var/log/messages esiste.. echo .1. se utilizzate controlli delle condizioni che di endono dall:a*biente. 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. 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. Controllo dei (ile Il ri*o ese* io veri)ica l:esistenza di un )ile7 anny ~> cat msgcheck." fi L&ambiente 8:ese* io so rastante )unzioner! quando inserito nella linea di co*ando7 anny ~> if [ -o noclobber ] . fi I tuoi file sono protetti da sovrascritture anny ~> /uttavia. 3e)plici applicazioni di i( '. /var/log/messages esiste. then echo ./msgcheck....'.

Se non c'è. fi per oggi hai lavorato sodo a sufficienza.1. then echo "non è un account locale" . fi non è un account locale anny > '. 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 ] .fi Ca itolo 7. Istruzioni condizionali 1(2 ." Ancora immissione> echo . 2e il nu*ero di setti*ana 3 ari. echo "per oggi hai lavorato sodo a sufficienza.2.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". anny > 9uesto scri t viene eseguito da cron ogni do*enica.txt` anny > echo $num 201 anny > if [ "$num" -gt "150" ] Ancora immissione> then echo . 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." | mail -s "Bidoni spazzatura fuori" your@your_domain. In caso contrario non fa nulla.2. then echo "Domenica sera: metti fuori i bidoni della spazzatura. questa è una settimana pari e perciò # invia un messaggio. if [ $NUMSETTIMANA -eq "0" ]. Con(ronti nu)erici 4li ese* i sottostanti usano i con)ronti nu*erici7 anny > num=`wc -l lavoro.

5n ese* io7 freddy scripts> genere="maschile" freddy scripts> if [[ "$genere" == "f*" ]] Ca itolo 7.1.1.2.2.2.1. Signora. . 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. fi Con -ash. Con(ronti di stringhe 5n ese* io di con)ronto tra stringhe er rovare l:I+ utente7 if [ "$(whoami)" != 'root' ]. 6so di i( piD avanzato '.'. Costrutti i(?then?else '.".N6KK. e un:altra se danno )also.3. Istruzioni condizionali 1(3 .1." exit 1. exit 1) ?essuna uscita5 2e invocate e+it in una sottoshell. fi Piacere di conoscerla.N6II[ e [JJ62P'622I.se)pio banale 9uesto 3 il costrutto da i* iegare er intra rendere una strada d:azione se i co*andi if danno vero. 5sate a e c al osto di HeI se non volete che -ash si divida in una sottoshell. 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. questa non asser! le variabili a quella genitrice. co*e questo7 test "$(whoami)" != 'root' && (echo state usando account senza privilegi.2. otete abbreviare questo ti o di costrutto. anny > Seri programmatori 8a *aggior arte dei rogra**atori re)erisce usare il co*ando integrato test. 0edete le agine in)o di -ash er *aggiori in)or*azione sulle co* arazioni dei *odelli con i costrutti [HH62P'622I. che equivale all:uso delle arentesi quadre er i con)ronti. [XX[ s eci)ica cosa )are se la rova d! )also. '. then echo "Non hai il permessso di avviare $0 in quanto utente non root.

$0 si ri)erisce al no*e dello scri t." 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 @. Istruzioni condizionali 1(# . 5sando [[. 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.Ancora immissione> then echo "Piacere di conoscerla. == e != inter retano le stringhe a destra co*e *odelli di glob di shell er con)rontarli ris etto al valore a sinistra. se 01'b[var con spazi[.2.2. er ese* io7 [[ "valore" == val* ]]/ Co*e l:elenco )GQ7?@I')G?S%GK%?TI che segue l:istruzione then. @@ i* edisce la divisione in arole dei valori di variabile.2. 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. Signora. Per il nostro sco o utilizzia*o i ara*etri osizionali $1.1. $# )a ri)eri*ento al nu*ero degli argo*enti a linea di co*ando. er cui le stringhe letterali con *etacaratteri non cercano di es andersi nei no*i dei )ile. Inoltre [[ reviene l:es ansione dei no*i di ercorso. 5n altro ese* io che a* lia quello della 2ezione 7. $2. $N. Controllo degli argo)enti a linea di co)ando Invece di i* ostare una variabile e oi eseguire uno scri t. i.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. '. 9uello seguente 3 un se* lice ese* io7 Ca itolo 7. CosD. co*e un server 8+1P.1. s esso 3 i@ elegante *ettere i valori delle variabili nella linea di co*ando.

3." fi anny ~> bash -x peso. '. then echo "Uso: $0 peso_in_kili altezza_in_centimetri" Ca itolo 7.-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. if [ ! $# == 2 ]. peso="$1" altezza="$2" pesoideale=$[$altezza .110] if [ $peso -le $pesoideale ] .2.sh 55 169 + peso=55 + altezza=169 + pesoideale=59 + '[' 55 -le 59 ']' + echo 'dovreste mangiare un poco di grassi in più.1.' Dovreste mangiare un poco di grassi in più. Istruzioni condizionali 1($ .sh #!/bin/bash # Questo script stampa un messaggio sul vostro peso se glielo date in chili e l'altezza # in centimetri. 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." else echo "Dovreste mangiare un poco di frutta in più. then echo "Dovreste mangiare un poco di grassi in più.

then echo "Dovreste mangiare un poco di grassi in più." fi . \ in partizione". 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"." else echo "Dovreste mangiare un poco di frutta in più. NOMEFILE="$1" echo "Proprietà di $NOMEFILE:" if [ -f $NOMEFILE ]." fi anny ~> peso.$ er un *odo i@ elegante di sta* are *essaggi sull:utilizzo.sh 70 150 Dovreste mangiare un poco di frutta in più. In tal caso il co*ando if va corretto o utilizzando i do i a ici attorno al no*e del )ile.1. CosD. In alternativa. quando non si )orniscono argo*enti. ?omi di file con spa1i 8:ese* io so rastante )allir! se il valore di uE essere esa*inato co*e a arole *ulti le. Istruzioni condizionali 1(& . dovete )arlo una volta sola. il secondo co*e $2 e cosD via. Il nu*ero totale di argo*enti viene conservato in $#.". '. 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.sh 70 150 33 Uso: $0 peso_in_kili altezza_in_centimetri Il ri*o argo*ento viene identi)icato co*e $1."}')" else echo "File inesistente. Ca itolo 7.$1".sservate che il )ile 3 stato ri)erito ad una variabile7 in questo caso 3 il ri*o argo*ento dello scri t. 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. anny ~> peso.exit fi peso="$1" altezza="$2" pesoideale=$[$altezza – 110] if [ $peso -le $pesoideale ] .2. o usando @@ il luogo di @.$6. quando volete *odi)icare un no*e di un )ile in uno scri t. 6sa*inate la 2ezione 7.#.2.

I costrutti i(?then?else '.sh #!/bin/bash # Questo script esegue una prova semplicissima per controllare lo spazio su disco. Istruzioni condizionali 1(7 .2. 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 '.daily> cat testdischi.2.2.2. va in esecuzione la lista 7LTFI')GQ7?@I')G?S%GK%?TI ed il co*ando 3 co* leto. Istruzioni i( annidate Ca itolo 7.se)pio 9uesto 3 un ese* io che otete inserire nel vostro crontab er un:esecuzione quotidiana7 anny /etc/cron. . '. se il suo stato di uscita 3 zero. 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. spazio=`df -h | awk '{print $5}' | grep % | grep -v Use | sort -n | tail -1 | cut -d "%" -f1 -` valoreallarme="80" if [ "$spazio" -ge "$valoreallarme" ]. 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. viene eseguita la lista dei )GQ7?@I')G?S%GK%?TI. se lo stato di ritorno 3 zero.1. viene eseguita invece ogni lista elif e.2.2.'.2. 2e )GQ7?@I'6FGS7 restituisce uno stato diverso da zero.3.

." elif [ $[$anno % 4] -eq 0 ].#.ra gli altri editor. then echo "Questo è un anno bisestile. 2ezione 3. Febbraio ha 29 giorni. 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. Istruzioni condizionali 1(" .#. then echo "Questo è un anno bisestile. CiE equivale alla istruzione let." else echo "Questo non è un anno bisestile." fi anny ~/testdir> date Tue Jan 14 20:37:55 CET 2003 anny ~/testdir> provabisestile. Febbraio ha 28 giorni. -igura ?#. . Potete usare tanti livelli di if annidati quanti siete in grado di gestire logica*ente. then if [ $[$anno % 100] -ne 0 ].1ll:interno dell:istruzione if otete usare un:altra istruzione if. Febbraio ha 29 giorni. Ca itolo 7.&I. Febbraio ha 28 giorni.2. 9uesto 3 un ese* io veri)ica gli anni bisestili7 anny ~/testdir> cat provabisestili.sh Questo non è un anno bisestile.perazioni booleane 8o scri t so ra uE essere abbreviato utilizzando gli o eratori booleani [1N+[ HffI e [. anno=`date +%Y` if [ $[$anno % 400] -eq "0" ].'[ HXXI. '.sh #!/bin/bash # Questo script verificherà se siamo o meno in un anno bisestile./ % empio dell"u o degli operatori booleani Noi utilizzia*o le arentesi do ie er rovare un:es ressione arit*etica Hv. 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." fi else echo "Questo non è un anno bisestile.

se un:istruzione non )unziona con successo o ure se ca ita qualche altro errore. then echo "Pweepwishpeeterdepweet!" exit 2 else echo "Leggerai questo segno?!" exit 3 fi fi 9uesto scri t 3 richia*ato nel rossi*o.2. in *odo che ossono essere intra rese azioni diverse in base al )alli*ento o al successo del rocesso [)iglio[.3. then echo "Hmmmmmm pesce. 5n argo*ento zero signi)ica che lo scri t ha )unzionato con successo. Lui sarà felice solo # quando gli sarà dato pesce. 2e non viene dato alcun argo*ento al co*ando e+it. then if [ "$animale" == "pinguino" ]. Tux vuole pesce!" exit 1 elif [ "$animale" == "delfino" ].sh #!/bin/bash # Questo script agisce in base allo stato di uscita dato da pinguino.sh7 anny ~/testdir> cat pinguino. 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.1. 9uesto argo*ento 3 il codice in nu*ero intero del lo stato di uscita. che restituisce il suo codice di uscita al genitore cibo.'. then echo "A Tux non piace quello. +i seguito c:3 un ese* io con lo scri t pinguino. Abbiamo aggiunto anche un delfino e (presumibilmente) # un cammello.sh export menu="$1" export animale="$2" cibo="/nethome/anny/testdir/pinguino.. 6so dell7istruzione eEit e i( 1bbia*o gi! incontrato breve*ente l:istruzione e+it nella 2ezione 7.sh" $cibo $menu $animal case $? in 1) Ca itolo 7. che d:altra arte es orta le sue variabili menu e animale7 anny ~/testdir> cat cibo. Tux felice!" elif [ "$animale" == "delfino" ]. Istruzioni condizionali 1(% . che viene restituito al [genitore[ e conservato nella variabile $?.sh #!/bin/bash # Questo script ti lascia presentare diversi menu a Tux. 9ualsiasi altro valore uE essere usato dai rogra**atori er restituire *essaggi di))erenti al rocesso [genitore[. la shell genitrice utilizza il valore corrente della variabile $?. 8:istruzione e+it accetta un argo*ento o zionale.$.sh legger*ente adattato. then echo "Pweetpeettreetppeterdepweet!" else echo "*prrrrrrrt*" fi else if [ "$animale" == "pinguino" ]..2. if [ "$menu" == "pesce" ].

. C'è una partizione piena per $spazio %. 3) echo "Guardia: Compra il cibo che lo Zoo fornisce agli animali. Nell:ese* io di*ostria*o l:uso dei case er inviare un *essaggio di avverti*ento i@ selettivo con lo scri t disktest.sh mela pinguino A Tux non piace quello.. Co*e otete vedere." . i codici di stato d:uscita ossono essere scelti libera*ente. altrimenti diventano violenti..gni case 3 un:es ressione che corris onde ad un *odello. *) echo "Guardia: Non scordare la guida!" . Ciascun case e i suoi relativi co*andi vengono de)initi clau ola Hclau eI.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. Tux vuole pesce! Guardia: Meglio che tu dia loro un pesce.. tu ***....3. Istruzioni condizionali 11( .." . [7-8]*) Messaggio="Inizia a pensare di cancellare qualcosa. come pensi che sopravvivano??" . . 6so delle istruzioni case '. Per le condizioni i@ co* lesse.echo "Guardia: Meglio che tu dia loro un pesce. esac anny ~/testdir> . 2) echo "Guardia: E' a causa della gente come te che lasciano la terra tutto il tempo. esse tendono a con)ondere.gni clausola va ter*inata con [NN[. +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. *a non a ena avete a che )are con una co ia di ossibili diverse azioni da intra rendere. altrimenti diventano violenti. 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. Condizioni se)pli(icate 8e istruzioni if annidate otrebbero essere belle./cibo.1.. '.3. I co*andi in LIST7')GQ7?@I er la ri*a coincidenza vengono eseguiti. CASEN: LIST7')GQ7?@I$$ esac ." ." ..... 9[1-8]) Ca itolo 7.sh7 anny ~/testdir> cat disktest. utilizzate la sintassi di case7 case ESPRESSIONE in CASE1: LIST7')GQ7?@I$$ )7S%P: LIST7')GQ7?@I$$ .. /utte le istruzioni case ter*inano con l:istruzione esac.

C'è una partizione piena per 87 %.. 99) Messaggio="Qui mi sommergono! C'è una partizione a $spazio %!" .12.. Una partizione è piena al $spazio %. status) status anacron .0.5/8." . 14 Jan 2003 22:10:47 +0100 Received: (from anny@localhost) by octarine (8." .12.h0ELAltn020413@octarine> To: anny@octarine Subject: disk report Tue Jan 14 22:10:47 CET 2003 Inizia a pensare di cancellare qualcosa.1]) by octarine (8..ggetto7[ e [+a7[. [. stop) stop . un de*one che attiva co*andi eriodica*ente con una )requenza s eci)icata in giorni.0.se)pio di initscript 4li initscri t Ho cript di inizializzazioneI s esso )anno uso delle istruzioni case er avviare. esac echo $Messaggio | mail -s "rapporto dischi `date`" anny anny ~/testdir> You have new mail. 14 Jan 2003 22:10:47 +0100 Date: Tue..3.12. *) Messaggio="Mi sembra di funzionare con una quantità inesistente di spazio su disco. )er*are ed interrogare servizi di siste*a.5/Submit) id h0ELAltn020413 for anny.. 14 Jan 2003 22:10:47 +0100 From: Anny <anny@octarine> Message-Id: <200301142110. 5n ese* io teorico si uE trovare nella rossi*a sezione.5) with ESMTP id h0ELAlBG020414 for <anny@octarine>. ..5/8. Istruzioni condizionali 111 ..2. 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[. 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.. '. 9uesto 3 un estratto dello scri t che avvia 1nacron. 4li scri t di avvio usano i casi start e stop er )ar artire o )er*are i rocessi del siste*a.. Tue. case "$1" in start) start . Tue.Messaggio="Meglio sbrigarsi con quel nuovo disco. restart) Ca itolo 7. =olti altri ese* i dell:uso delle istruzioni case si ossono trovare nella directorG di scri t init del vostro siste*a.12..

CiE vi consente di eseguire con)ronti arit*etici e testuali. =odi)icate lo scri t provabisestile. 3.. lo scri t dovrebbe sta* are un Ca itolo 7.else che sta* i le in)or*azioni sul *ese corrente. 2crivete uno scri t chia*ato qualedemone. .sercizi 9ui ci sono alcune idee er )arvi iniziare ad usare if negli scri t7 1. 0. #. e di veri)icare codici d:uscita. '. +e)inizioni i@ co* lesse delle condizioni vengono di solito inserite in una istruzione case.fi s esso recede dei co*andi in uno scri t di shell er revenire la generazione di e*issioni. 0eri)icate che venga )ornito esatta*ente un solo argo*ento. *) echo $"Uso: $0 {start|stop|restart|condrestart|status}" exit 1 esac I co* iti da eseguire in ciascun caso.stop start . 5sate un costrutto if. co*e )er*are ed attivare il de*one. in *odo lo scri t uE essere avviato sullo s)ondo H backgroundI o attraverso il rogra**a di utilit! cron.elif.then. then stop start fi . 2.2.sh che controlli se i de*oni httpd e init stanno girando nel vostro siste*a.ate lo stesso. '. 5n se* lice test if. 8e azioni si ossono deter*inare *ediante l:uso dell:istruzione if. $. . il Ca itolo 11 er *aggiori s iegazioni. sono de)initi nelle )unzioni. 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.$. che traggono arzial*ente origine dal )ile /etc/rc.. 2e sta )unzionando httpd. =odi)icate /etc/profile in *odo da ottenere un *essaggio s eciale di saluto quando vi connettete al siste*a co*e root. 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. usando un:istruzione case e un utilizzo alternativo del co*ando date.sh della 2ezione 7. Istruzioni condizionali 112 .d/functions. condrestart) if test "x`pidof anacron`" != x. l:anno. i**issioni e )ile necessari agli scri t.then.# in *odo che richieda un unico argo*ento.#.d/init.

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

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

. then echo -e "\a\a\aPweetpeettreetppeterdepweet!\a\a\a\n" else echo -e "*prrrrrrrt*\n" fi else if [ "$animale" == "pinguino" ]. Tux felice!\n" elif [ "$animale" == "delfino" ]. then echo -e "Hmmmmmm pesce. Co*e ese* io di aggiunta di co**enti. 'edigere scri t interattivi 11$ .\n" Ca itolo ". *igliorere*o un o: i rogra**i cibo. *.1.sh if [ "$#" != "2" ].27 michel ~/test> cat pinguino. abbiamo aggiunto in più una coppia # di animali.sh #!/bin/bash # Lo script vi lascia presentare menu differenti a Tux.sh e inguino. 8o stato di ritorno 3 se* re zero. se arati da s azi e ter*inati con un carattere di nuovalinea. 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. Per renderlo più divertente.\n" cibo="/nethome/anny/testdir/pinguino... 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.2. Lui sarà felice solo quando # gli sarà dato un pesce. Tux vuole pesce!\n" exit 1 elif [ "$animale" == "delfino" ]. 6so del co)ando integrato echo Il co*ando integrato echo e*ette i suoi argo*enti. then echo -e "A Tux non piace quello.2. if [ "$menu" == "pesce" ].1.sh della 2ezione 7. then if [ "$animale" == "pinguino" ].ese* i nelle rossi*e sezioni. • -n7 so ri*e i nuovalinea in *ezzo al testo.sh" $cibo $menu $animale risultato="$?" echo -e "Pasto eseguito. echo accetta una co ia di o zioni7 • -e7 inter reta i caratteri di esca e con la barra inversa..sh #!/bin/bash # Lo script agisce in base allo stato di uscita dato da pinguino.

###BOT_TEXT###quot;\n" ###BOT_TEXT###quot;Compra il cibo che fornisce lo Zoo all'entrata.... 3) echo -e "Guardia: echo -e "Guardia: . 8a tabella seguente o))re una anora*ica delle sequenze riconosciute dal co*ando echo7 Tabella 8-1.###BOT_TEXT###quot;\n" ..sh cibo-in-menu nome-animale ###BOT_TEXT###quot;Sarebbe meglio dare loro un pesce.. esac fi echo "Uscendo." echo -e "\a\a\aGrazie per la visita allo Zoo... 'edigere scri t interattivi . Tu ***"" Guardia: "Vuoi avvelenarli sul serio?" Uscendo. Grazie per la visita allo Zoo. 2) echo -e "Guardia: ... 11& Ca itolo "... altrimenti diventano ###BOT_TEXT###quot;Nessuna meraviglia se abbandonano il nostro pianeta.or* )eed Nuovalinea 'itorno carrello o C' HCarriage 9eturnI. Guardia: "Compra il cibo che fornisce lo Zoo all'entrata.sh mela Uso dello script cibo: ...3.2.. speriamo di vedervi presto di nuovo! michel ~/test> cibo. /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. . Tu ***###BOT_TEXT###quot;\n" ###BOT_TEXT###quot;Vuoi avvelenarli sul serio?###BOT_TEXT###quot;\n" ###BOT_TEXT###quot;Non scordare la guida!###BOT_TEXT###quot;\n" 2i uE trovare di i@ sui caratteri esca e nella 2ezione 3. 2 azio indietro o back pace/ 2o ri*e i nuovalinea in *ezzo al testo 6sca e.sh mela cammello Nutrire con una mela un cammello. speriamo di vedervi presto di nuovo!\n" michel ~/test> cibo. Sequenze di escape utilizzate dal comando echo Se(uen1a \a \b \c \e \ \n \r \t \! \ ###BOT_TEXT###""" Significato 1llar*e Hca* anelloI. *) echo -e "Guardia: .case "$risultato" in 1) echo -e "Guardia: violenti./cibo. Sai leggere il segnale?! Non dare da mangiare al cammello! Pasto eseguito.

la linea da leggere viene assegnata alla variabile REPLY. 8a ri*a arola della linea viene assegnata al ri*o no*e. 1ltri argo*enti NAME vengono ignorati. 2ezione 3. Il ri*o carattere di +68I= viene usato er ter*inare la linea i**essa. la seconda arola al secondo no*e e cosD via. ai no*i restanti si assegnano dei valori vuoti./ &pzioni dell"integrato read Gp1ione -a ANAME Significato 2i assegnano le arole a indici sequenziali della variabile *atriciale ANAME. *. NOMEN. a *eno che non sia stato incontrato un carattere di )ine<)ile H6.###BOT_TEXT###quot;"" \#$$ Il carattere a otto bit il cui valore 3 il valore ottale NNN Hda una a tre ci)re ottaliI. readline viene usato er ottenere la linea 117 -d DELIM -e Ca itolo ". le agine in)o di -ash. 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. 'edigere scri t interattivi . 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. Cattura dell7i))issione dell7utente *. I caratteri nel valore della variabile IFS vengono utilizzati er dividere la linea i**essa in arole o )ra**enti HtokenI7 v.#. 8:integrato di -ash read su orta le seguenti o zioni7 Tabella A#. v. NOME1.. 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.2. 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 ci sono *eno arole da leggere nel )lusso d:ingresso ris etto ai no*i. al osto di nuovalinea. Il codice di ritorno del co*ando read 3 zero. iniziante er (. 6so del co)ando integrato read Il co*ando integrato read 3 la contro artita dei co*andi echo e printf. /utti gli ele*enti vengono ri*ossi da ANAME ri*a dell:assegnazione. 8a sintassi del co*ando read 3 la seguente7 read [opzioni] NOME1 NOME2 . /enete in *ente che otrebbero esserci delle di))erenze tra le diverse versioni di -ash.1.2.. 2e non vengono )orniti no*i.. con le arole restanti e i loro relativi se aratori assegnati all:ulti*o no*e.

seguito da [INVIO]: 2000 2000 è un anno bisestile. *. then echo "$anno è un anno bisestile." fi michel ~/test> provabisestile. una co ia barra inversa<nuovalinea otrebbe non essere utilizzata co*e rosecuzione di linea. "$USER".sh #!/bin/bash # Questo script verificherà se avete dato un anno bisestile o meno. 8a barra inversa viene considerata a artenente alla linea. -p PROMPT -r -s -t TIMEOUT -u FD 9uesto 3 un chiaro ese* io che *igliora lo scri t provabisestile. 8:invito HpromptI viene *ostrato solo se l:i**issione roviene da un ter*inale. seguito da [INVIO]:" read anno if (( ("$anno" % 400) == "0" )) || (( ("$anno" % 4 == "0") && ("$anno" % 100 != "0") )). i caratteri non vengono ri ortati con echo.sh #!/bin/bash # Questo è un programma che conserva aggiornata la vostra rubrica degli indirizzi. &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.2. 2e viene data questa o zione. =ostra PROMPT senza nuovalinea in *ezzo ri*a di tentare di leggere qualsiasi i**issione." else echo "Tquesto non è un anno bisestile. echo "Batti l'anno che desideri controllare (4 cifre).-n NCHARS read ritorna do o la lettura dei caratteri NCHARS iuttosto di attendere l:intera linea di i**issione." echo -n "Inserisci il tuo nome e premi [INVIO]: " read nome echo -n "Inserisci il tuo genere (maschio/femmina) e premi [ENTER]: " Ca itolo ". amici="/var/tmp/michel/amici" echo "Ciao. +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. michel ~/test> cat amici. 8egge i**issioni dal descrittore di )ile FD. /ale o zione non ha e))etti se read non sta leggendo i**issioni da ter*inale o da un incanala*ento HpipeI.2. In articolare.sh Batti l'anno che desideri controllare (4 cifre). la barra inversa non si co* orta co*e carattere di esca e. 2e l:i**issione roviene da un ter*inale. 'edigere scri t interattivi 11" .sh del recedente ca itolo7 michel ~/test> cat leaptest. Questo script ti registrerà nel database degli amici di Michel. =odalit! silenziosa.

michel. *a vi dir! se* re che siete stati aggiunti alla lista. 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. 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. chiusura in corso.read -n 1 genere echo grep -i "$nome" "$amici" if [ $? == 0 ]. then echo "Sei già registrato." exit 1 fi fi michel ~/test> cp amici." exit 1 elif [ "$genere" == "m" ].sh /var/tmp. +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. 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. Questo script ti registrerà nel database degli amici di Michel. Questo script ti registrerà nel database degli amici di Michel. Ca itolo ". anny. 'edigere scri t interattivi 11% . . then echo "Sei stato aggiunto alla lista degli amici di Michel. Potete risolvere questo roble*a utilizzando delle s eciali *odalit! di accesso al )ile dello scri t Hv.sh Ciao. cd /var/tmp michel ~/test> touch amici. Tante grazie!" else echo "Sei stato aggiunto alla lista degli amici di Michel. 8o scri t conserva solo le in)or*azioni che interessano a =ichel." exit 1 else echo -n "Quanti anni hai? " read anni if [ $anni -lt 25 ].ra altre ersone ossono eseguire lo scri t7 [anny@octarine tmp]$ amici. michel ~/test> cat amici Notate che qui non 3 stato o*esso alcun risultato. SKI@ e SGI@ nella guida [Introduzione a 8inuA[I. chmod a+w amici michel ~/test> amici. a *eno che non ci siate gi!.sh Ciao.

• 2e l:e*issione standard del co*ando corrente viene incanalata verso l:i**issione standard del co*ando successivo. che in realt! 3 un collega*ento si*bolico a /proc/<ID_processo>./proc/self/fd/0 root root 17 Oct 2 07:46 /dev/stdout -> . ris ettiva*ente con i nu*eri di descrittori di )ile (. o ure indirizzare le e*issioni verso un )ile. 8a redirezione uE ure ca itare in uno scri t. 'edigere scri t interattivi 12( . &edirezione e descrittori dei (ile *. vengono ercorse le seguenti )asi. • 8a redirezione del co*ando corrente viene elaborata da sinistra a destra. tdout e tderr./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. In generale Co*e sa ete dall:utilizzo ele*entare della shell. 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. 9uesti valori nu*erici sono conosciuti co*e descrittori di )ile Hfile de criptor I.2. 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. 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.2.1 lrwx-----. in *odo che quest:ulti*o uE ricevere i**issioni da arte di un )ile.. 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. allora /proc/<ID_processo_corrente>/fd/1 viene aggiornato er essere destinato ad un altro incanala*ento anoni*o.*.1 -l /dev/std* root root 17 Oct 2 07:46 /dev/stderr -> . 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-----.3. 8a redirezione uE essere usata anche er a rire e chiudere )ile del a*biente di esecuzione della shell corrente./proc/self/fd/2 root root 17 Oct 2 07:46 /dev/stdin -> . • 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.1. In seguito l:utente uE rivedere il )ile di e*issione o uE usarlo co*e i**issione er un altro scri t.1 lrwx-----. Ca itolo ". 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. I descrittori di )ile *eglio conosciuti sono tdin.. 1 e 2.. 9uando si esegue un dato co*ando. er ese* io.3.

cron pipe:[124441] /proc/21974/fd *.2. 1ltresD. cosD che non otrete iniziare a )are una qualunque *eritevole correzione degli errori. # (/tmp/crontab. 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. non ca*bia i@ nulla erché il rocesso shell )iglio user! gli stessi descrittori di )ile di quello genitore.cron total 0 lr-x-----.2. &edirezione degli errori +agli ese* i recedenti 3 chiaro che otete )ornire )ili in ingresso e uscita ad uno scri t Hv.$Id: chap8. 9uando avviate uno scri t dalla linea di co*ando. se siete )ortunati.1 michel michel 64 Jan l-wx-----.1 michel michel 64 Jan l-wx-----.1 michel michel 64 Jan 24 l-wx-----.1 michel michel 64 Jan lr-x-----. 9uesto viene ra resentato nell:ese* io sottostante. • 2olo ora viene eseguito il co*ando corrente.v 1. gli errori vi )aranno )allire il vostro scri t e non verranno intercettati o inviati da nessuna arte.edit the master and reinstall. *a alcuni tendono a di*enticarsi di redirigere gli errori O e*issione che otrebbe essere di esa da questi. 9uando si redirigono gli errori.• 8a chiusura [NTf<[ del descrittore di )ile ha l:e))etto di cancellare il collega*ento si*bolico /proc/self/fd/N. er ese* io quando avviate uno scri t utilizzando il rogra**a di utilit! cron.1 michel michel 64 Jan 24 l-wx-----. gli errori vi saranno inviati a *ezzo osta ed eventuali cause di )alli*ento otrebbero essere svelate. Per ese* io. 'edigere scri t interattivi 121 .xml. i descrittori di )ile standard sono incanala*enti o altri )ile Hte* oraneiI.at total 0 lr-x-----. 9uando non 3 dis onibile un tale genitore.21968 installed on Fri Jan 24 11:30:41 2003) # (Cron version -. restate attenzione che l:ordine di recedenza 3 signi)icativo.3.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.2.1 michel michel 64 Jan 24 lr-x-----. a *eno che non venga utilizzata una qualche )or*a di redirezione.at /var/spool/at/spool/a0000c010959eb /proc/21949/fd 6 uno con cron7 michel ~> crontab -l # DO NOT EDIT THIS FILE .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.1 michel michel 64 Jan 24 11:32 11:32 11:32 11:32 0 1 2 3 -> -> -> -> pipe:[124440] /var/tmp/fdtest.# er *aggiori in)or*azioniI.at at> <EOT> job 10 at 2003-01-24 11:07 michel ~> cat /var/tmp/fdtest. questo co*ando )ornito in /var/spool ls -l * 2> /var/tmp/inaccessibile-in-spool Ca itolo ". 2e non siete cosD )ortunati. 2ezione ".

dovrete trovare il *odo di risolvere il roble*a. 8:a ertura del )ile /dev/fd/N equivale a du licare il descrittore dei )ile 6. oi la sua i**issione standard che 3 l:e*issione del co*ando filter e.2.piepagina.#. *.2. 2i ossono trovare centinaia di ese* i nei )ile di avvio del vostro siste*a. 1. 6sso s esso viene co*binato anche con la redirezione verso /dev/null. vedrete che questi equivalgono ris ettiva*ente a /dev/fd/0& /dev/fd/1 e /dev/fd/2. Il co*ando cat er ri*a cosa legge il )ile testata.gz | cat testata. 8:uso rinci ale dei )ile /dev/fd 3 er la shell. CiE si uE )are. Per co*odit!. non i* orta quali e*issioni o errori dia. usando un trattino H<I er indicare che un rogra**a dovrebbe leggere da un incanala*ento HpipeI. il )ile piepagina. er ulti*o. Il co*ando ls -l * > /var/tmp/listaspool 2>&1 diriger! sia i**issione che errori standard verso il )ile listaspool.rediriger! l:e*issione standard del co*ando ls verso il )ile inaccessibile-in-spool in /var/tmp.txt . -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. 'edigere scri t interattivi 122 .#. 2e il vostro siste*a *ette a dis osizione /dev/stdin. 5n ese* io7 michel ~> filter corpo.txt. Questo testo viene stampato alla fine di ciascun lavoro di stampa.txt. Il co*ando ls -l * 2 >& 1 > /var/tmp/listaspool dirige solo l:e*issione standard verso il )ile di destinazione. Testo da filtrare. 6so di ?dev?(d 8a directorG c contiene voci chia*ate 0. 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 ". /dev/stdout. 2e /dev/fd non 3 dis onibile in un siste*a. 2 e cosD via. erché l:errore standard viene co iato nell:e*issione standard ri*a che questa sia rediretta.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. s esso gli errori vengono rediretti verso /dev/null se 3 certo che non servano. I))issioni ed e)issioni di (ile *. 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.1. il costrutto usato nel recedente co* lesso di ese* i.txt. er ese* io. er ese* io quando volete solo eseguire un co*ando.

#.2.all:e*issione standard 3 un:idea sbagliata che si 3 insinuata in *olti rogra**i.gz | cat testata. +o o che un descrittore di )ile 3 stato assegnato ad un )ile. v.#. *. 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. co*e 3 di*ostrato nell:ese* io seguente7 michel ~> exec 4> risultati. 8:uso di /dev/fd consente uni)or*it! e reviene la con)usione7 michel ~> filter corpo. 2iete )orte*ente consigliati di non usarlo. &ead e eEec *.2. Ci otrebbero essere anche roble*i quando si s eci)ica il trattino co*e ri*o argo*ento. @escrittore di file W 8:uso di questo descrittore dei )ile otrebbe causare dei roble*i. Questo testo viene stampato alla fine di ciascun lavoro di stampa.2. tutti i dati in uscita vengono er di i@ incanalati attraverso lp er inviarli alla sta* ante rede)inita. &ead negli script 123 Ca itolo ". dal *o*ento che otrebbe essere inter retato co*e una o zione del co*ando recedente. *.1. esso uE essere utilizzato con gli o eratori di redirezione della shell. ca itolo 1&. 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.2. uE essere i* iegato er assegnare un descrittore di )ile ad un )ile. Per ese* io.#.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. 'edigere scri t interattivi .txt /dev/fd/0 piepagina. otete usare il nu*ero del descrittore del )ile. Testo da filtrare.2.txt /dev/fd0 piepagina.txt michel ~> filter corpo.gz | cat testata. 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. [1dvanced -ash< 2cri ting 4uide[. Invece di usare il no*e del )ile.2.txt.2.txt.txt >& 4 michel ~> cat risultati.txt | lp In questo chiaro ese* io.

# cancella fd 7 exec 0<&7 7<&echo -n "Inserire un commento o [INVIO] per nessun commento: " read commento.. Inserire un commento o [INVIO] per nessun commento: in DNS centrale michel ~/testdir> cat /var/tmp/sysconfig..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" echo "Salvataggio informazioni degli host..out rm "$CONFIG" 2>/dev/null echo "L'emissione sarà salvata in $CONFIG. li mette insieme in un file # di salvataggio e consente di aggiungere commenti a ciascun file. Inserire un commento o [INVIO] per nessun commento: password suggerita: blue lagoon Salvataggio informazioni degli host.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.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 "...sh #!/bin/bash # Questo script crea un indice dei file config importanti.out." # 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. 'edigere scri t interattivi 12# ... Salvataggio informazioni su account di root." # Per primo prepara un file hosts privo di commenti TEMP="/var/tmp/hosts. echo $commento >> "$CONFIG" rm "$TEMP" michel ~/testdir> notesistema.. CONFIG=/var/tmp/sysconfig.sh L'emissione sarà salvata in /var/tmp/sysconfig." 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).

sh #!/bin/bash # Questo script stampa l'emissione standard senza modifiche. INPUTDIR="$1" # fd 6 punta la destinazione fd 1 (uscita console) nella shell corrente exec 6>&1 # fd 1 punta l'incanalamento. echo "Questi sono i programmi di navigazione internet di questo sistema:" Ca itolo ".kingarthur. mentre l'errore standard # viene rediretto per l'elaborazione con awk.0.requente*ente il vostro scri t otrebbe chia*are un altro rogra**a o scri t che richieda ingresso di dati. 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.127. esegue ls ls "$INPUTDIR"/* 2>&1 >&6 6>&. CiE si )a usando la sintassi e+ec fdH8' Nell:ese* io so rastante.168. | awk 'BEGIN { FS=":" } { print "NON HAI ACCESSO A" $2 }' 6>&# fd 6 chiuso per la shell corrente exec 6>&- *. viene chiuso ogni volta che all:utente serve avere accesso alla vera eri)erica di i**issione standard.\ # Chiude fd 6 per awk.2. fd 2 punta la destinazione fd 1 (incanalamento o pipe).0. /utte le linee lette )ino a quel unto vengono oi usate co*e i**issione standard er un co*ando.1 tintagel. il descrittore dei )ile 7.com tintagel in DNS centrale *.3. # fd 1 punta la destinazione fd 6 (uscita console). +ocu)enti here .42. che 3 stato assegnato all:i**issione standard. ma non per ls. 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. 3 buona rassi chiudere un descrittore dei )ile quando non ve ne sia i@ bisogno. 9uello che segue 3 un se* lice ese* io di redirezione del solo errore standard verso un incanala*ento HpipeI7 michel ~> cat listdirs.#.1 localhost.localdomain localhost 192.sh #!/bin/bash # Questo script fornisce agli utenti un modo semplice per scegliere tra i navigatori.2. Chiusura dei descrittori dei (ile +al *o*ento che i rocessi )igli ereditano i descrittori di )ile a erti. 'edigere scri t interattivi 12$ . fd 6 chiusa.#. solita*ente la tastiera.#.

Success! tuxracer 100 % done 1/1 Installed: tuxracer 0. usando yum.# 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. attendi per favore.i386] Is this ok [y/N]: EnterDownloading Packages Running test transaction: Test transaction complete.61-26.core Server: Fedora Linux 2 . 2ebbene si arli di un docu*ento here. si su one che si tratti di un costrutto all:interno dello stesso scri t.i386 Transaction(s) Complete Ca itolo ". generic Server: Fedora Linux 2 . 9uesto 3 un ese* io che installa auto*atica*ente un acchetto. 'edigere scri t interattivi 12& .NK[." $browser & michel ~> inizionavigazione.61-26..updates Finding updated packages Downloading needed headers Resolving dependencies Dependencies resolved I will do the following: [install: tuxracer 0.sh Questi sono i programmi di navigazione internet di questo sistema: mozilla links lynx konqueror opera netscape Quale preferisci? opera Avvio opera." exit 1 fi yum install $1 << CONFIRM y CONFIRM 6 questo 3 co*e )unziona lo scri t... if [ $# -lt 1 ].i386 – freshrpms Server: JPackage 1.i386 . then echo "Uso: $0 pacchetti./install.i386 .5. lo scri t ris onde [G[ auto*atica*ente7 [root@picon bin]# . anche se nor*al*ente dovreste con)er*are7 #!/bin/bash # Questo script installa i pacchetti automaticamente.5 for Fedora Core 2 Server: JPackage 1.sh tuxracer Gathering header information file(s) from server(s) Server: Fedora Linux 2 .. 9uando a are l:invito con la stringa [Is this o? JG.

calcolate quanta birra un utente *aggiore di 1" anni ha bevuto statistica*ente H1(( litri. 1bbia*o ribadito l:i* ortanza del )ornire *essaggi esaurienti agli utenti dei nostri scri t.sercizi 9uesti esercizi sono a licazioni ratiche di costrutti trattati in questo ca itolo. 1.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. compress e 1ip. I* le*entate le seguenti )unzionalit!7  Controllate il nu*ero di argo*enti. '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. 3 *eglio dare tro e in)or*azioni iuttosto che insu))icienti. 2e 3 uguale o *aggiore di 1& sta* ate un *essaggio che dice che questo utente ha il er*esso di bere alcolici. Co*e se* re. b1ipP.annoI e sta* ate questa in)or*azione er l:utente. 2crivete un scri t che chieda l:et! dell:utente. i docu*enti here sono un ti o di costrutto di shell che consente la creazione di elenchi. /ale costrutto si uE usare anche er eseguire senza interventi co* iti di sotto)ondo. 5tilizzate un docu*ento here che resenti all:utente una co ia di scelte er la co* ressione del )ile. CiE nor*al*ente si )a utilizzando la co*binazione echo.  +eter*inate se la directorG backups ha abbastanza s azio libero er tenere la co ia d:e*ergenza. 2e 3 resente un qualche argo*ento. 8o scri t dovrebbe )unzionare senza argo*enti. 2. 8e scelte otrebbero essere g1ip. *antenendo le scelte degli utenti. 9uando si scrivono degli scri t. indi rovate quella orzione di codice iuttosto di scrivere tutto in una sola volta. e di co*e questi ossano essere co*binati con la ricezione di dati in ingresso dall:utente. altri*enti interattivi.*. 3. 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. Ca itolo ".read. 2crivete ciascun asso.#. otreste rovarli utilizzando una directorG test che non contenga tro i dati. uscite do o aver sta* ato un *essaggio di istruzioni. . 'ealizzate uno scri t che renda un )ile co*e argo*ento. quando altri usano i vostri scri t. Co*e eAtra. *. 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. 'edigere scri t interattivi 127 .

grou e . $.shado>7 creare la directorG ersonale dell:utente HhomeI Hcon i er*essi correttiVI7 aggiungere l:utente ai gru i secondari desiderati. 4uardate info tar o Introduzione a 8inuA. ca itolo % [Pre arazione dei vostri dati[. data di scadenza di questo account.etc. 2ta* are un *essaggio contenente tale I+. 2ta* are un *essaggio contenente l:I+ del gru o.etc.  creare un gru o rivato er questo utente veri)icando il )ile /etc/group. Ca itolo ". gru i eAtra a cui otrebbe a artenere il nuovo utente. 'iscrivete lo scri t della 2ezione 7.etc. In)or*ate l:utente che lo scri t sta )acendo questo. Chiedete all:utente se desidera una co ia di salvataggio co* leta o incre*entale.  Condividere le in)or*azioni con l:utente o eratore7 un co**ento che descriva questo utente.# in *odo che esso legga l:i**issione dall:utente iuttosto che la renda dal ri*o argo*ento. ass>d. una scelta da un elenco di shell Hcontrollate l:accettabilit!.1.  2ta* ate un *essaggio che in)or*i l:utente circa la di*ensione della co ia di salvataggio co* ressa. . altri*enti uscite sta* ando un *essaggioI. 'ealizzate uno scri t deno*inato semplice-useradd. 'edigere scri t interattivi 12" .  I* ostare la ass>ord di questo utente co*e conosciuta stringa rede)inita. 8o scri t dovrebbe7  1ccettare solo un unico argo*ento o istruzioni. In caso di co ia di salvataggio incre*entale )ate solo questa se quella co* leta non 3 i@ vecchia di una setti*ana.2. 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.  Con le in)or*azioni ottenute. 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. aggiungere una linea a . ure uscire do o la sta* a di un *essaggio di  Controllare /etc/passwd e decidere sul ri*o I+ utente libero. er in)or*azioni di sotto)ondo #.sh che aggiunga un utente locale al siste*a.  Co* ri*ete la co ia di salvataggio utilizzando un qualsiasi stru*ento di co* ressione.

2e non sono stati eseguiti dei co*andi erché LISTA non si es ande ad alcuna voce. Co)piti ripetitivi 1l ter*ine di questo ca itolo sarete in grado di  usare i cicli for. e decidere quale ciclo sia adatto nella circostanza.1. scri t. 8o stato di ritorno 3 lo stato d:uscita dell:ulti*o co*ando eseguito. 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. sebbene i sia usato *olto )requente*ente. Il ciclo ter*ina quando NOME ha assunto ciascun valore di LISTA e non sono ri*aste voci in LISTA. 2ezione 3..2.2I. lo stato di ritorno 3 zero. .se)pi .2.1. stringhe o nu*eri.Capitolo . )GQ7?@I er andare in esecuzione uE anche essere un qualsiasi co*ando del siste*a o erativo.  realizzare scri t che accettino un nu*ero variabile di argo*enti.1. . il suo valore viene i* ostato con la seconda voce in lista e cosD via.. NOME uE essere qualsiasi no*e di variabile.2.1. LISTA uE essere un qualunque elenco di arole. . viene ri* iazzato con in $@ e for esegue )GQ7?@I una volta er ciascun ara*etro osizionale che 3 stato i* ostatoHv.  usare gli integrati di -ash brea! e continue. 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 %.1.. Il ciclo (or . 8a ri*a volta che viene eseguito il ciclo. rogra**a o istruzione di shell.1. Co* iti ri etitivi 12% . 9uesto ciclo consente di s eci)icare un elenco di valori.1. NOME viene i* ostato con la ri*a voce di LISTA. Co)e (unziona? Il ciclo for 3 il ri*o dei tre costrutti di ciclo della shell. -hile e until.  realizzare scri t che usino l:istruzione select.2. 8a seconda volta.. che ossono essere gi! scritte o ure rodotte da qualsiasi co*ando.$ e 2ezione 7.

do NUOVONOME=$(ls "$i" | sed -e 's/html/php/') cat beginfile > "$NUOVONOME" cat "$i" | sed -e '1.1. Strani caratteri . done [carol@octarine ~/articles] ls *.xml file3.bak . co*e questa7 for i in $PATHNAME/*.sbin che sono solo dei )ile di testo uro ed eventual*ente gli scri t7 for i in `ls /sbin`. Co* iti ri etitivi 13( . do file /sbin/$i | grep ASCII. sarebbe i@ corretto utilizzare il co*ando basename. 8a conversione viene eseguita estraendo le ri*e 2$ linee e le ulti*e 21. done .xml file2.xml file2.21d'| tac >> "$NUOVONOME" cat endfile >> "$NUOVONOME" done +al *o*ento che qui non )accia*o un conteggio delle linee.inirete nei guai se la lista si es ande ai no*i dei )ile contenenti s azi ed altri caratteri irregolari. secondo un certo sche*a. in )ile PBP. che rovescia le linee in un )ile..bak file2.xml file3.xml* file1.xml > lista [carol@octarine ~/articles] for i in `cat lista`. do cp "$i" "$i".bak 9uesto invece elenca i )ile in . 8eggete le agine *an er *aggiori in)or*azioni.sh #!/bin/bash # specifico script di conversione per i miei file da html a php LISTA="$(ls *.xml file1. iniziare a lavorare sui vostri sorgenti 3 sicuro7 [carol@octarine ~/articles] ls *.xml [carol@octarine ~/articles] ls *.xml. +o o aver dato il co*ando.2.2.html)" for i in "$LISTA".25d' | tac | sed -e '1.bak file3.xml. 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.xml. 5n costrutto i@ ideale er ottenere la lista sarebbe quello di utilizzare la )unzione di globbing della shell. Il comando basename Invece di usare sed er sostituire il su))isso ht*l con h .xml file1. do comandi done Ca itolo %. 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. sostituendo queste con due *arcatori HtagI PBP che )orniscono le linee di intestazione e di i3 agina7 [carol@octarine ~/html] cat html2php.xml.salvataggio di ogni )ile . Il roble*a si risolve usando tac.

2.1.1. Il ciclo Bhile .2. )GQ7?@I')G?S%GK%?TI uE essere qualsiasi rogra**a..gni ora viene creata una nuova directorG contenente le i**agini di quell:ora.2. 8o scri t gira dietro le quinte. .gni giorno viene creata una nuova directorG contenente 2# sottodirectorG.2.. . Co* iti ri etitivi 131 . 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*.2. # (usa scp e le chiavi SSH per una directory remota) # Viene creata una nuova ogni ora. 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. i="0" while [ $i -lt 4 ] do xterm & i=$[$i+1] done .2.2. ....gni cinque *inuti viene scattata una )oto. il ciclo esce7 n uno scri t viene eseguito il co*ando successivo all:istruzione done. 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. #!/bin/bash # Questo script copia file dalla mia directory home a quella del webserver. Non a ena )GQ7?@G')G?TFGLLG )allisce. 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.2. 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. ure .se)pi . Ca itolo %. . scri t o costrutto di shell.2.

2igni)ica questo7 continua l:esecuzione )inché non venia*o interrotti con la )orza Hcon !ill o )trl*)I.2. do echo "In che materia vuoi consigli?" cat << materie politica startrek kernelnewbies sport bofh-excuses magia amore Ca itolo %.2. 0eri)iche regolari si ossono ottenere con il rogra**a di utilit! cron. do DESTDIR=$WEBDIR/"$DATA"/"$ORA" mkdir "$DESTDIR" mv $PICSDIR/*. do DATA=`date +%Y%m%d` ORA=`date +%H` mkdir $WEBDIR/"$DATA" while [ $ORA -ne "00" ].jpg "$DESTDIR"/ sleep 3600 ORA=`date +%H` done done .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. Ksate il sistema 8:ese* io recedente 3 a sco o di*ostrativo. Co* iti ri etitivi 132 . do touch pic-`date +%s`. #!/bin/bash # Questo genera un file ogni 5 minuti while true.PICSDIR=/home/carol/pics WEBDIR=/var/www/carol/webcam while true.sservate l:uso dell:istruzione true.sservate l:uso del co*ando date er generare tutti i ti i di no*i di )ile e directorG. 9uesto iccolo scri t uE essere utilizzato er e))ettuare una si*ulazione7 esso genera )ile.. Non scordate di redirigere l:e*issione e gli errori quando utilizzate scri t che vengono eseguiti dal vostro crontabV .jpg sleep 300 done . 4uardate le agine *an er *aggiori in)or*azioni.

Co* iti ri etitivi 133 .2." break else SOMMA=$[$SOMMA + $PUNTEGGIO] NUM=$[$NUM + 1] MEDIA=$[$SOMMA / $NUM] fi done echo "Uscita. then echo "Sii serio.2. prova di nuovo: " elif [ "$PUNTEGGIO" == "q" ]. Calcolo di una )edia 9uesto scri t calcola la *edia di un:i**issione di utente. viene sta* ato un *essaggio. if (("$PUNTEGGIO" < "0")) || (("$PUNTEGGIO" > "100")). Coraggio.#. che viene testata ri*a dell:elaborazione7 se l:i**issione non rientra nell:intervallo. PUNTEGGIO="0" MEDIA="0" SOMMA="0" NUM="0" while true. ..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. then echo "Classifica media: $MEDIA%." . do echo -n "Inserisci il tuo punteggio [0-100%] ('q' per finire): ". read PUNTEGGIO. 2e si re*e ( il ciclo si interro* e7 #!/bin/bash # Calcola la media di una serie di numeri. 6 di nuovo il test true ri ete i co*andi della lista )GQ7?@I')G?S%GK%?TI ancora e ancora. Ca itolo %.sservate co*e le variabili nelle ulti*e linee sono lasciate senza a ici er oter e))ettuare i calcoli arit*etici.

Co*e abbia*o gi! s iegato in nuovalinea ogni volta che a are. do DATA=`date +%Y%m%d` ORA=`date +%H` mkdir $WEBDIR/"$DATA" while [ $ORA -ne "00" ]. while true.. done done Ca itolo %. # Se le immagini occupano troppo spazio. e )GQ7?@I' )G?S%GK%?TI uE essere qualsiasi co*ando 5NIF.. do rm -rf "$i".. ad eccezione che il ciclo viene eseguito )intanto HuntilI che )GQ7?@G'T%ST viene eseguito con successo. [N[ otrebbe essere ri* iazzato con una o i@ .3..ino a quando questo co*ando )allisce. Cos74? Il ciclo until 3 *olto si*ile al quello -hile. di nuovo. 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. le più vecchie vengono rimosse. # Una nuova directory viene creata ogni ora.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. )GQ7?@G'T%ST uE. recedenza. 2e non 3 dis onibile abbastanza s azio su disco. che veri)ichi la dis onibilit! di s azio su disco. do DISCOPIENO=$(df -h $WEBDIR | grep -v File | awk '{print $5 }' | cut -d "%" -f1 -) until [ $DISCOPIENO -ge "90" ]. Co* iti ri etitivi 13# . il ciclo continua.2I. essere qualsiasi co*ando che uE uscire con uno stato di successo o )alli*ento.3. ri*uovete le i**agini dai *esi recedenti7 #!/bin/bash # Questo script copia file dalla mia directory home in quella del webserver. o ure zero se nessuno 3 stato eseguito.2.2. . .1.sh *igliorato Hv. scri t o costrutto di shell.2.se)pio 5no scri t riordinaimmagini. 2ezione %. Il ciclo until .3. do DESTDIR=$WEBDIR/"$DATA"/"$ORA" mkdir "$DESTDIR" mv $PICDIR/*.

Non a ena tutte le linee di i**issione sono state lette. Co* iti ri etitivi 13$ .ino a che ci sono linee di i**issione nel ciclo. e i cicli .#. mv "$file".#. &edirezione dell7i))issione Invece di controllare un ciclo testando il risultato di un co*ando o in base all:i**issione dell:utente. la redirezione dovrebbe avvenire do o l:istruzione done. In tali casi.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. . verso cui # vengono spostati i vecchi file. . La redirezione dell7I?. il ciclo esce. 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. otete s eci)icare un )ile da cui leggere l:i**issione che controlla il ciclo.. read 3 il co*ando di controllo.1. NUMARCHIVIO=`date +%Y%m%d` DESTDIR="$PWD/archivio-$NUMARCHIVIO" mkdir "$DESTDIR" # uso degli apici per intercettare i nomi di file che contengono spazi.. +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. # Potrebbe essere qualcosa per cron (se leggermente adattato) da eseguirsi # settimanalmente o mensilmente.sh #!/bin/bash # Questo script crea una sottodirectory nella directory corrente.gz "$DESTDIR" echo "$file archived" done I )ile vengono co* ressi riva di s ostarli nella directorG di archiviazione..#.2. Ca itolo %. # uso di read -d per un utilizzo maggiormente aprova di errore: find "$PWD" -type f -a -mtime +5 | while read -d $'###BOT_TEXT###00' file do gzip "$file".. l:esecuzione dei co*andi del ciclo continua. . &edirezione dell7e)issione Nell:ese* io sottostante. in *odo da corris ondere alla )or*a comando H file 9uesto genere di redirezione )unziona anche con altri ti i di cicli. s esso.

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

*) echo "Quella non è una scelta valida: prova un numero da 0 a 10. . 2e non va )atta alcuna conversione.. 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. 0) echo "OK. do if [[ "$nome" != *[[:upper:]]* ]]. 4uardate le agine info er *aggiori notizie. la variabile di controllo releva il valore dell:ele*ento successivo della lista. . un co*ando continue riavvia l:esecuzione del ciclo. 9uando viene usato in un costrutto -hile o until. then continue fi ORIG="$nome" NUOVO=`echo $nome | tr 'A-Z' 'a-z'` Ca itolo %.2. ri rende invece l:esecuzione con )GQ7?@G'T%ST all:inizio del ciclo. -hile o select. 9uando viene usato in un ciclo for. 10) $FORTUNE educazione .$. non lo scri t.. 9uesti co*andi non *angiano tro e risorse del siste*a e. ris ar*iando risorse di siste*a.. roble*i si*ili ossono essere risolti usando sed e a-!..$. L7integrato continue 8:istruzione continue ri rende l:iterazione di un ciclo enclosing for..3.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". Co* iti ri etitivi 137 .se)pi Nell:ese* io seguente i no*i dei )ile vengono convertiti in lettere *inuscole. arrivederci!" break ." . [carol@octarine ~/test] cat inminuscolo. CiE si uE di*ostrare aggiungendo un co*ando echo al ter*ine dello scri t... che otrebbero anche non essere necessari quando si inseriscono dei test nei osti giusti di uno scri t. /uttavia 3 utile conoscere questo ti o di costruzione quando si eseguono dei co* iti esanti. . esac done 'icordatevi che brea! interro* e il ciclo. *olto )acil*ente.

mv "$ORIG" "$NUOVO" echo "Il nuovo nome di $ORIG è $NUOVO" done 9uesto scri t ha al*eno un di)etto7 sovrascrive i )ile esistenti. *a 3 sicura solo in caso di una sovrascrittura accidentale. .1. 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. 8:o zione noclobber er -ash 3 utile solo quando avviene una redirezione.1. 6so di select Il costrutto select er*ette una generazione se* lice di *enu.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 . LISTA 3 sta* ata Ca itolo %. 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..%./ test test~ Il tr 3 arte del acchetto textutil 7 uE eseguire tutti i ti i di tras)or*azioni di caratteri. 8:o zione -b al co*ando m )ornisce *aggiore sicurezza. co*e se )osse stato s eci)icato in $@./ . Co* iti ri etitivi 13" ..1. In generale .%. 2e non 3 resente in LISTA/ vengono sta* ati i ara*etri osizionali. 8:es ansione viene sta* ata nell:errore standard H tandard errorI7 ciascuna voce 3 receduta da un nu*ero.%.. generando un elenco di voci. Creazione di )enu con l7integrato select ..

. 2e questa linea consiste in un nu*ero che corris onde ad una delle voci. 2e la linea 3 vuota. Co* iti ri etitivi 13% . +al *o*ento che la *aggioranza degli utenti non ha un indizio su quale chiave sia usata er la sequenza 6. 9uesto interro* e il ciclo.sh Questo script può rendere privato qualunque file di questa directory. 9ualsiasi altro valore della linea letta i* oster! PAROLA a))inché sia una stringa nulla.se)pi 9uesto 3 un ese* io *olto se* lice.sh #!/bin/bash echo "Questo script può rendere privato qualunque file di questa directory.H6nd .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. 2e viene letto un carattere %&. non 3 *olto alla ortata degli utenti7 [carol@octarine testdir] cat private. le voci e l:invito PS3 vengono nuova*ente *ostrati.ileI. . il ciclo si interro* e.%.solo una volta..1. 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!. co*e otete vedere. il valore di PAROLA viene i* ostato con il no*e di quella voce. ora è accessibile solo a te. 8a linea letta viene salvata nella variabile REPLY. *a.) . do echo "Hai scelto $NOMEFILE ($REPLY).2./private. 3 i@ alla loro ortata avere un co*ando brea! co*e una delle voci." break Ca itolo %." echo "Inserisci il numero del file che desiderate proteggere:" select NOMEFILE in *." touch "$ABBANDONO" select NOMEFILE in *." echo "Inserisci il numero del file che intendi proteggere:" PS3="La tua scelta: " ABBANDONO="TERMINA QUESTO PROGRAMMA – Ora miu sento sicuro. Con la sta* a di tutte le voci. viene sta* ato l:invito PS3 e viene letta una sola linea dall:i**issione standard. ." chmod go-rwx "$NOMEFILE" done [carol@octarine testdir] . do case $NOMEFILE in "$ABBANDONO") echo "Uscita.. Inserisci il numero del file che desiderate proteggere: 1) archivio-20030129 2) bash 3) privato.

e N 3 #.. 8o stato di ritorno 3 zero a *eno che N sia *aggiore di \P o *inore di zero7altri*enti 3 non<zero. Il nu*ero degli argo*enti viene ridotto ogni volta che shift viene eseguito e )inal*ente diventa zero. esac done rm "$ABBANDONO" . Co* iti ri etitivi 1#( .. un nu*ero. usa istruzioni shift er elaborare ogni )ile nella lista generata Ca itolo %. 3otto)enu 9ualunque istruzione all:interno di un costrutto select uE essere un altro ciclo select.%.2. 9uesto co*ando rende un solo argo*ento.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. $10 diventa $7 e gli originali $1. In tali casi. v.2. 9uesta condizione 3 vera er tutto il te* o che il nu*ero degli argo*enti 3 *aggiore di zero.1. +i base la variabile P23 non viene *odi)icata quando si inserisce un ciclo select annidato. i ara*etri osizionali non vengono *odi)icati Hil nu*ero totale di argo*enti. al che il ciclo -hile ter*ina. .. Che cosa (a? Il co*ando shift 3 uno degli integrati della shell -ourne che giungono con -ash. 2ezione 7.. $2 e $3 vengono scartati..2I e il co*ando non ha e))etto. $5 diviene $2 e cosD via.'.sh. I ara*etri osizionali da N]1 a \P vengono rino*inati con i no*i di variabile da $1 a $# . 2u onete di avere un co*ando che accetta 1( argo*enti. 8:ese* io sottostante. gli argo*enti vengono nor*al*ente elaborati in un ciclo -hile con una condizione di veri)ica ari a HH\PII.1.'. er ese* io quando gli utenti ossono dare quanti argo*enti desiderino. 8a variabile $1 e l:istruzione shift )anno elaborare ogni ele*ento. I ara*etri osizionali vengono s ostati a sinistra da questo nu*ero. *) echo "Hai scelto $NOMFILE ($REPLY)" chmod go-rwx "$NOMEFILE" .2. L7integrato shi(t .. 2e N 3 zero o *aggiore di \P. 2e volete un invito diverso nel sotto*enu. assicuratevi di i* ostarlo al *o*ento giusto. 2e N non 3 resente. . si su one che sia 1. 6. abilitando sotto*enu dentro *enu. . pulizia..'. allora $4 diviene $1.N+1.

3o))ario In questo ca itolo abbia*o trattato di co*e ossano essere incor orati dei co*andi ri etitivi in Ca itolo %. 2oltanto do o verr! chia*ato il co*ando da eseguire7 nell:ese* io so rastante questo dovrebbe essere rm. verr! utilizzata una nuova linea di co*ando. Co* iti ri etitivi 1#1 . Nel rossi*o ese* io abbia*o *odi)icato lo scri t della 2ezione ". 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.. +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. )ino a che questa sar! iena o )inché non ci saranno i@ argo*enti. 2e ci sono i@ argo*enti. CosD )acendo.# in *odo che accetti i@ acchetti da installare alla volta7 #!/bin/bash if [ $# -lt 1 ]. 9uesto ha il vantaggio che la linea di co*ando viene rie* ita )ino a raggiungere il li*ite del siste*a. l:uso di +args velocizza arecchio i vostri scri t e le restazioni della vostra *acchina.. do if [[ $(ls "$1") == "" ]]. do yum install "$1" << CONFIRM y CONFIRM shift done .2. dirN" if [ "$#" == "0" ]. fi shift done 'e+ec s." else find "$1" -type f -a -atime +365 -exec rm -i {} \.da find7 #!/bin/bash # Questo script può cancellare file usati per l'ultima volta oltre 365 giorni fa.#. niente da fare. then echo "Directory vuota. then echo "$USO" exit 1 fi while (( "$#" )). then echo "Uso: $0 pacchetto/i" exit 1 fi while (($#)).. USO="Uso: $0 dir1 dir2 dir3 .*.

etc in *odo che un a**inistratore di siste*a rinci iante ossa *odi)icare )ile senza ti*ori. .sh della 2ezione 7. -hile o until. sta* ate un *essaggio sull:uso. Il ciclo for esegue un co* ito er un deter*inato nu*ero di volte. utilizzate until o -hile er recisare quando il ciclo dovrebbe ter*inare. Co* iti ri etitivi . 2crivete uno scri t che renda esatta*ente un argo*ento. 1. un de*one dei no*i.$. co*e 1 ache.sercizi 'icordate7 quando realizzate scri t. Non )ate lavori inutiliV &. 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 %.. Il costrutto select si usa er sta* are *enu negli scri t interattivi. Create uno scri t che )ar! una co ia HricorsivaI dei )ile in . il de*one N/P. un de*one della gestione dell:ali*entazione e cosD viaN  er ogni scelta l:utente ossa )are. 2e non sa ete quante volte un co*ando dovrebbe essere eseguito.. co*e il no*e del >eb server. sta* ate un altro *essaggio. I cicli si ossono interro* ere o ri etere utilizzando le istruzioni brea! e continue. .$. un no*e di directorG.#. o ure una co*binazione di questi co*andi. 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. 8a *aggior arte dei co*uni cicli vengono realizzati utilizzando le istruzioni for. veri)icate se un )ile esiste o *eno. $. 2e l:argo*ento non 3 una directorG.costrutti di ciclo. Pensate ad una *igliore soluzione ris etto a mo e -b er lo scri t della 2ezione %.$ Jesercizio n. sta* i alcune in)or*azioni sensibili.1 *a ensate ad un *odo er ter*inare do o che l:utente ha eseguito 3 cicli. 2e il nu*ero degli argo*enti 3 *aggiore o *inore di uno.3 er revenire la sovrascrittura dei )ile esistenti. Potete s iegare erché 3 cosD i* ortante *ettere le variabili tra a ici do della 2ezione %. Per ese* io. 2crivete uno scri t si*ile a quello in 2ezione %. 'iscrivete lo scri t qualedemone. 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.2? i nell:ese* io #. 3.$K in *odo che7  sta* i un elenco dei server da controllare. il server 22B. +ella directorG indicata sta* ate i ri*i cinque )ile i@ grandi e i cinque )ile che sono stati *odi)icati i@ di recente. lavorate a assi e rovate ogni asso ri*a di incor orarlo nel vostro scri t.. 2.

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

ossia*o li*itare l:assegna*ento di valori alle variabili. ciE dovr! essere )atto una sola volta. -ash co* rende *olti ti i diversi di variabili o ara*etri.Capitolo 1-.inora non ci sia*o interessato *olto a quale genere di variabile abbia*o assegnato. una cosiddetta matrice Ho arra!I di variabili HVAR0. 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. 2ssegna)ento di valori in generale Co*e abbia*o visto. +i i@ sulle variabili 1## . otete anche s eci)icare una variabile che sia una costante. 6so dell7integrato declare 5tilizzando un:istruzione declare.1.2. VAR1.1. 1-. i VARNI. er ese* io quando si gestiscono nu*eri tele)onici e di altro ti o.1. 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. cosicché. esistono solo ri)eri*enti al no*e di variabile della costante. cosicché le nostre variabili otrebbero contenere qualsiasi valore assegnato loro. 0ipi di variabili 1-. 5na variabile uE essere anche una serie di variabili di qualsiasi ti o. quando viene dichiarato il valore della costante. VAR2. . CiE viene )atto s esso all:inizio di uno scri t. 8a sintassi er declare 3 la seguente7 declare OPZIONI VARIABILEN alore Ca itolo 1(. 1-. quando 3 necessario *odi)icare la costante. +i piD sulle variabili In questo ca itolo trattere*o l:uso avanzato delle variabili e degli argo*enti. +o o di ciE. 1 arte gli interi e le variabili.1.

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.&I. [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. 9uando si usa < le o zioni aggiuntive vengono ignorate. se nulla 3 stato s eci)icato. +! ad ogni variabile l:attributo trace. 9uesto 3 erché. 9uando si utilizza in una )unzione.3. di base. =ostra gli attributi e valori di ogni variabile. -r -t -x 8:uso di ] al osto di O disabilita invece l:attributo. essa uE contenere solo quel ti o di dati. ed esse ne ure ossono essere eli*inate. 8:integrato readonl. 1-. 1 queste variabili do o non ossono essere attribuiti valori con susseguenti istruzioni di assegna*ento. 8a variabile viene trattata co*e un intero7 la valutazione arit*etica si esegue quando viene assegnato un valore alla variabile Hv. 2ezione 3. 4uardate le agine in)o di -ash er in)or*azioni sullo stato di ritorno. declare crea variabili locali. *a nessuna er dichiarare valori stringa. 2olo utilizzo di no*i di )unzione. *arca ogni Ca itolo 1(.1.#. 'estrizioni ossibili sono intero. costante o *atrice. =arca ciascuna variabile er l:es ortazione verso co*andi successivi tra*ite l:a*biente. +i i@ sulle variabili 1#$ . Costanti In -ash le costanti si creano rendendo a sola lettura una variabile.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. 'ende a sola lettura le variabili. 8:ese* io seguente *ostra co*e l:assegna*ento di un ti o ad una variabile in)luenzi il valore.

2.s eci)icata variabile co*e i**odi)icabile. +i i@ sulle variabili 1#& . o ure sia stata )ornita -f er un no*e di variabile al osto di un no*e di )unzione. una delle variabili o )unzioni non esista. 8e variabili *atriciali ossono essere create anche utilizzando assegna*enti co* osti in questo )or*ato7 Ca itolo 1(. 8a dichiarazione indiretta si e))ettua utilizzando la seguente sintassi er dichiarare una variabile7 MATRICE[NUMINDICE]N alore 6(. ogni variabile si ri)erisce ad una )unzione di shell7 v. 8a sintassi 37 readonl. 2e non 3 stato dato nessun argo*ento. 2e 3 stata data l:o zione -f. viene *ostrato un elenco di tutte le variabili a sola lettura. [bob in ~] readonly TUX=penguinpower [bob in ~] TUX=Mickeysoft bash: TUX: readonly variable 1-.1. 5sando l:o zione -p.gni variabile uE essere utilizzata co*e *atrice. 1ariabili )atriciali 1-. 4li attributi si a licano a tutte le variabili della *atrice7non otete avere delle *atrici *iste. Ca itolo 11.2.)6D)C% viene trattato co*e una es ressione arit*etica che deve essere calcolata co*e nu*ero ositivo. . o 3 stata )ornita -p.. Non esiste un li*ite *assi*o alle di*ensioni di una *atrice. tutte le variabili si ri)eriscono ad una *atrice di variabili. l:e*issione uE essere rei* iegata co*e i**issione. 8e *atrici artono da zero7 il ri*o ele*ento 3 indicizzato con il nu*ero (. *a il nu*ero di indice sar! ignorato. 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. e ne ure un qualche requisito che le variabili *e*bri siano indicizzate o assegnate in *odo contiguo. 4li attributi della *atrice si ossono s eci)icare utilizzando gli integrati declare e readonl. 8o stato di ritorno 3 zero. Creazione delle )atrici 5na *atrice Jarra!K 3 una variabile che contiene *olte lici valori. OPZIONE VARIABILI I valori di queste variabili do o non si ossono i@ ca*biare con un successivo assegna*ento. 2e 3 stata s eci)icata -a. a *eno che sia stata s eci)icata un:o zione non valida.

2. CiE 3 necessario. [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. +ere(erenzia)ento delle variabili di una )atrice Per )are ri)eri*ento al contenuto di una voce di una *atrice. l:indicizzazione inizia da zero. co*e otete constatare nell:ese* io seguente. 9uesto )or*ato 3 accettato anche da declare. 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.2. 1-. 2e 3 )ornito. che consente la lettura e l:assegna*ento di valori alle variabili *e*bri di una *atrice. 2e il nu*ero di indice 3 _ o ^.2.3.MATRICEN9 alore1 aloreP X alore?: . 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. usate le arentesi gra))e. 1-. er scavalcare l:inter retazione degli o eratori di es ansione da arte della shell. tutti i *e*bri di una *atrice sono re)erenziati. 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(. quello re)erenziato con nu*ero di indice zero. 2e non vengono )orniti nu*eri d:indice. Il nu*ero d:indice 3 )acoltativo.gni valore 3 oi nella )or*a di @numeroindiceCD tringa. +i i@ sulle variabili 1#7 .

Ca itolo 1(. 5n:altra ragione er cui sono di))icili da trovare dei buoni ese* i 3 che non tutte le shell su le *atrici. nel linguaggio di rogra**azione C con cui 3 scritta la *aggioranza dei co*andi 5NIF. )inal*ente ho trovato questo ese* io o erando resso un )ornitore HproviderI Internet. 8a ragione di questa *onotonia 3 che le *atrici sono strutture iuttosto co* lesse. che 3 elaborato quando si co* ilano gli integrati. I no*i degli host che necessitano di essere con)igurati sono elencati nella *atrice farm_hosts. er ese* io. sebbene in un livello i@ basso. Notate l:utilizzo dei co*andi della suite 2ecure 2hell nel cri tare le connessioni verso gli host re*oti. /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. 6 questo sarebbe uno degli ese* i i@ interessante. ortano +o o lunghi giorni di ricerche. cosicché esse in)rangono la co* atibilit!. Poi tutti questi host vengono )orniti tra*ite il )ile di con)igurazione di 1 ache.. then echo "Uso: $0 </path/to/httpd.#. then echo "Bisogna essere root per avviare $0" exit 1.[bob in ~] echo ${MATRICE[*]} <--no output--> 1-.2. +i i@ sulle variabili 1#" . di -ash.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. 9uei lettori che )ossero interessati otrebbero controllare la directorG built-ins nell:albero dei sorgenti di -ash dare un occhio a fc.. .se)pi di )atrici 6se* i ratici dell:uso delle *atrici sono di))icili da trovare. do o di che si riavvia il de*one. fi if [ -z $1 ]. 6sso distribuisce i )ile di con)igurazione del >eb server 1 ache negli host di una >eb )ar*7 #!/bin/bash if [ $(whoami) != 'root' ]. 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.def. 5n buon ese* io 3 il co*ando integrato histor. 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.

# Nome di questa macchina. 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. # # Invia una e-mail alla persona giusta. week=${week#0} # Remove possible leading zero. co*e questo che utilizza un docu*ento here7 email=`get-tester-address.53).) # count=0 while [ "x${wholist[count]}" != "x" ] do count=$(( $count + 1 )) done # # Now we calculate whose turn it is.com>' 'Larry Wall <wall@example. # week=`date '+%W'` # The week of the year (0. # (Loop until we find an empty string.com>' 'Linus Torvalds <linus@example.sh` hostname=`hostname` # Trova a chi mandare una e-mail. 6ugene e collega. er questo contributo. 6 questo 3 stato il suo *odo di risolverlo7 #!/bin/bash # This is get-tester-address. let "index = $week % $count" email=${wholist[index]} echo $email # week modulo count = the lucky person # Get the lucky person's e-mail address. (Feel free to add or # remove candidates. # Output the person's e-mail address.) # wholist=( 'Bob Smith <bob@example. # (Support for arrays was only added recently. # mail $email -s '[Demo Testing]' <<EOF The lucky tester this week is: $email Reminder: the list of demos is here: http://web. +i i@ sulle variabili 1#% . we test whether bash supports arrays.' && exit 2) # # Our list of candidates.com>' 'Jane L..com:8080/DemoSites Ca itolo 1(. Williams <jane@example.4razie.com>' ) # # Count the number of possible testers. CosD ho un:attivit! di cron che rie* ie una *atrice con tutti i ossibili candidati.example.com>' 'Eric S.) # whotest[0]='test' || (echo 'Failure: arrays not supported in this version of bash. /ale scri t viene oi usato in altri scri t. 8a ersona )ortunata viene noti)icata tra*ite osta elettronica[. Raymond <esr@example.sh # # First. usa date +%W er trovare la setti*ana dell:anno ed esegue un:o erazione di *odulo er trovare l:indice corretto. +an 'ichter ha contribuito all:ese* io seguente.

3.1. 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. 3ostituzione AMVAR:-PAROLAO 2e VAR non 3 de)inita o 3 nulla. Lunghezza di una variabile 5sando la sintassi ${#VAR} si calcoler! il nu*ero dei caratteri in una variabile. +i i@ sulle variabili 1$( . 1-.3.) EOF 1-. altri*enti viene sostituita dal suo valore.2. la sostituisce l:es ansione di PAROLA.3.(Questa e-mail è stata generata da $0 su ${hostname}.3. 0ras(or)azioni di variabili 1-. questo valore viene sostituito con il nu*ero dei ara*etri osizionali o il nu*ero di ele*enti di una *atrice in generale. . 2e VAR 3 [*[ o [@[. er ese* io in questo7 Ca itolo 1(.3.perazioni su variabili 1-. [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.3. 2rit)etica con le variabili 1bbia*o gi! trattato di questo nella 4ezione 1/</>.1.

2e il trattino H<I viene sostituito con il segno uguale HbI./vartest.2.3 er *aggiori in)or*azioni su questo ti o di rova delle condizioni.[ -z "${COLONNE:-}" ] && COLONNE=80 6: una notazione abbreviata er if [ -z "${COLONNE:-}" ]..2. da una variabile.sh presente TESTVAR è stata dichiarata.sh #!/bin/bash # Questo script controlla se una variabile è stata dichiarata. uguale a OFFSET. In caso contrario. 5na di*ostrazione7 [bob in ~] cat vartest. possiamo procedere. 2e non 3 stata i* ostata. # esce stampando un messaggio. &i)ozione di sottostringhe Per togliere un nu*ero di caratteri." [bob in testdir] . then COLONNE=80 fi 4uardate la 2ezione 7./vartest. si sta* a l:es ansione di PAROLA nell:e*issione standard H tandard outputI e le shell non interattive si chiudono."} echo "TESTVAR è stata dichiarata. +i i@ sulle variabili 1$1 .3. 1-. echo ${TESTVAR:?"C'è così tanto che ancora volevo fare. usate questa sintassi7 ${VAR:OFFSET:LUNGHEZZA} Il ara*etro LUNGHEZZA de)inisce quanti caratteri tenere. non succede nulla. 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..1. 2e viene o*esso LUNGHEZZA. 8:uso di [][ al osto del unto escla*ativo i* osta la variabile er l:es ansione di PAROLA7 se non esiste./vartest. [bob in testdir] export TESTVAR=presente [bob in testdir] .3.sh . possiamo procedere. viene resa la restante arte del contenuto della variabile7 [bob in ~] export STRINGA="questoeunnomemoltolungo" [bob in ~] echo ${STRINGA:6} Ca itolo 1(.sh: line 6: TESTVAR: C'è così tanto che ancora volevo fare.. a co*inciare dal ri*o carattere do o il unto di o))set..

2e VAR 3 * o @. PAROLA si es ande er rodurre un *odello ro rio co*e nell:es ansione dei no*i di )ile. +i i@ sulle variabili 1$2 . &i)piazzare parti di no)i di variabili 9uesto si )a utilizzando la sintassi ${VAR/MODELLO/STRINGA} Ca itolo 1(. 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. 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 [_[. co*e nell:ese* io sottostante.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. 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[. 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. 2e il *odello coincide con l:inizio del valore es anso di VAR.3.3. 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.

sercizi 9ui ci sono alcuni ro* ica i7 1. 'edigete uno scri t che i* le*enti un se* lice navigatore >eb Hin *odalit! testualeI. uno. 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. sostituzione del contenuto delle variabili e di arte di esso.  2ta* i tutti i valori degli argo*enti restanti. 2e viene dichiarato un ti o di dato. inserire i er indietro e t er ter*inare.  2e ci sono i@ di tre ara*etri osizionali.$. 'edigete uno scri t che )accia quanto segue7  =ostri il no*e dello scri t che 3 in esecuzione. +i i@ sulle variabili 1$3 . 3o))ario Nor*al*ente una variabile uE contenere qualunque ti o di dati. Controllate con zero. a *eno che siano dichiarate es licita*ente. arit*etica con le variabili. 1-.  =ostri il nu*ero totale di argo*enti assati allo scri t. 1-.  =ostri il ri*o. . usando -get e lin!s -dump er *ostrare le agine B/=8 all:utente. allora tutti gli ele*enti della *atrice saranno i* ostati er contenere solo questo ti o di dato. terzo e deci*o argo*ento )ornito allo scri t. 8e )unzionalit! di -ash consentono la sostituzione e la tras)or*azione [al volo[ delle variabili. 9uest:ulti*o ha tre scelte7 inserire un 5'8.  2ta* i il nu*ero di argo*enti. 8e variabili costanti si i* ostano usando il co*ando integrato readonl. 4li ulti*i 1( 5'8 inseriti Ca itolo 1(. tre e i@ di dieci argo*enti.#. 5na *atrice contiene un insie*e di variabili. 8e o erazioni standard co* rendono il calcolo della lunghezza di una variabile.. usate shift er *uovere tutti i valori di 3 osizioni verso sinistra.

da cui il *edesi*o utilizzando la )unzionalit! indietro. uE ri ristinare l:5'8 Ca itolo 1(. +i i@ sulle variabili 1$# .dall:utente sono conservati in una *atrice.

return. . l:elenco dei co*andi associati con quella )unzione viene eseguito. 11. e+it.. +egli s eciali co*andi integrati si trovano ri*a delle )unzioni di shell durante la ricerca dei co*andi. /unzioni In questo ca itolo trattere*o di7  Cosa sono le )unzioni  Creazione e ra resentazione di )unzioni da linea di co*ando  . 4li integrati s eciali sono7 brea!. readonl.1.1. continue. se non 3 utilizzato.. . /utti i co*andi che costituiscono una )unzione vengono eseguiti co*e dei nor*ali co*andi.. Introduzione 11.1. sono necessarie le arentesi. 9uando si chia*a una )unzione co*e un se* lice no*e di co*ando. e+port.unzioni 1$$ .2. utilizzando un solo no*e er questo gru o o routine. /ali co*andi sono Ca itolo 11. I co*andi elencati tra le arentesi gra))e costituiscono il cor o della )unzione. Cosa sono le (unzioni? 8e )unzioni di shell sono un *odo di raggru are co*andi er l:esecuzione successiva .unzioni negli scri t  Passaggio di argo*enti alle )unzioni  9uando usare le )unzioni 11. set.1.Capitolo 11. 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. 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?%. . Il no*e della routine deve essere univoco all:interno della shell o dello scri t. e al. 8:uso del co*ando integrato function 3 )acoltativo7 tuttavia. e+ec. trap e unset. shift.

unzioni 1$& . 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." echo test () { echo "Parametro posizionale 1 nella funzione è $1. 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. 5n se* lice ese* io7 [lydia@cointreau ~/test] cat mostraparam. 2e l:integrato return viene eseguito in una )unzione. gli argo*enti di questa diventano ara*etri osizionali durante la sua esecuzione. viene restituito quello stato. Il cor o di una )unzione dovrebbe ter*inare con un unto e virgola o un nuovalinea. 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. I para)etri posizionali nelle (unzioni 8e )unzioni sono co*e dei *iniscri t7 ossono accettare ara*etri.1. 9uando si esegue una )unzione.sh #!/bin/bash echo "Questo script mostra gli argomenti delle funzioni./mostraparam. 8a variabile di -ash FUNCNAME 3 i* ostata con il no*e del FUNCNAME della )unzione durante la sua esecuzione. Ca itolo 11." VALORE_RITORNO=$? echo "Il codice di uscita di questa funzione è $VALORE_RITORNO.sh parametro1 Questo script mostra gli argomenti delle funzioni. Il ara*etro osizionale ( non viene *odi)icato. 5na )unzione ha anche un siste*a er inter retare i ara*etri osizionali. 9uando si conclude una )unzione. 2e viene attribuito un argo*ento nu*erico a return. altri*enti vengono inter retate nel *odo sbagliato. la )unzione si co* leta e ri rende l:esecuzione con il co*ando successivo alla chia*ata della )unzione." } test altro_param [lydia@cointreau ~/test] . 11. . /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.eseguiti ogni qualvolta si s eci)ica FK?YIG?% co*e il no*e di un co*ando.3." echo echo "Parametro posizionale 1 dello script è $1. usare variabili conosciute solo all:interno della )unzione Hutilizzando l:integrato di shell localI e restituire valori alla shell chia*ante.

27 dir () { ls -F --color=auto -lF --color=always "$@" | less -r } Ca itolo 11. 9ostrare le (unzioni /utte le )unzioni note alla shell corrente ossono essere *ostrate usando l:integrato set senza o zioni. cosicché questa uE essere interrogata in un unto successivo.#. [lydia@cointreau ~/test] Notate che il valore di ritorno o il codice d:uscita della )unzione sono s esso conservati in una variabile. +o o l:utilizzo. le )unzioni vengono conservate. Il codice di ritorno della )unzione 3 s esso utilizzato co*e codice d:uscita dell:intero scri t. 6cco qui una er gli utenti +. 11. 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. a *eno che non venga usato unset su di loro do o l:uso.d/amd. 8e )unzioni sono i@ )lessibili ris etto agli alias e )orniscono un *odo se* lice e )acile er adattare l:a*biente dell:utente.unzioni 1$7 . ro rio co*e questo7 if [ $RETVAL -eq 0 ]. then <avvia il demone> . . 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.Parametro posizionale 1 dello script è parametro1.fi. Il codice di uscita di questa funzione è 0. 0edrete una quantit! di initscri t ter*inanti in qualcosa di si*ile a e+it $RETVAL. co*e questo ese* io dallo scri t /etc/init. 4li scri t init nel vostro siste*a usano s esso la tecnica di interrogare la variabile RETVAL in un test condizionale.1. Parametro posizionale 1 nella funzione è altro_param.then.

che 3 riscontrabile in tutti gli scri t init. in scri t di))erenti. avviare e )er*are un de*one e cosD via. Ca itolo 11. Potreste realizzare il vostro )ile ersonale /etc/functions che contenga tutte le )unzioni che usate regolar*ente nel vostro siste*a.unzioni 1$" . *entre root ottiene una co ia di directorG eAtra contenenti co*andi di siste*a.2. viene aggiunto. then if [ "$2" = "dopo" ] . =ettete solo la linea . troverete il )ile di de)inizione /etc/rc. 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($|:)" . . 2e questo no*e di ercorso non 3 ancora nel ercorso corrente. la )unzione subisce unset cosicché non viene conservata.1.d/function. devono essere scritti solo una volta.11. in *odo generico. er ese* io. then PATH=$PATH:$1 else PATH=$1:$PATH fi fi } # Manipolazione del percorso if [ `id -u` = 0 ].d/init. Il secondo argo*ento alla )unzione de)inisce se il ercorso sar! aggiunto davanti o dietro la de)inizione del PATH J ercorsoK corrente.se)pi di (unzioni negli script 11.2. 11. o erazioni co*uni co*e controllare se il rocesso gira. 5sando questo *etodo. .2. In alcuni siste*i 8inuA. 4li utenti nor*ali ottengono solo l:aggiunta di /usr/X11R6/bin ai loro ercorsi. &iciclaggio Nel vostro siste*a ci sono quantit! di scri t che usano )unzioni co*e *odo strutturato di gestire serie di co*andi. 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. +o o essere stata usata. 2e la stessa o erazione serve di nuovo. il codice viene riciclato.2./etc/functions da qualche arte all:inizio dello scri t e otete riciclare le )unzioni. I)postazione del percorso 9uesta sezione si otrebbe trovare nel vostro )ile /etc/profile.

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

. 3o))ario 8e )unzioni )orniscono un *odo )acile er raggru are co*andi che vi serve eseguire ri etitiva*ente. questo non 3 ciE che volete. 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. . cosicché redirigia*o l:errore standard H tandard errorI dal co*ando scp verso /dev/null.9uesto scri t viene avviato da cron Hsigni)ica senza interazione u*anaI. se siete interessati ai risultati inter*edi che otrebbero essere ri ristinati in caso di )alli*ento dello scri t. ro rio co*e gli scri t. . 9uando una )unzione sta )unzionando.sercizi 9ui ci sono alcune cose utili che otete )are usando le )unzioni7 1.bashrc che auto*atizzi la sta* a delle agine *an. inserite la ossibilit! er l:utente di )ornire il nu*ero di sezione delle agina *an che vuole sta* are. 2ebbene questo sia stato un ca itolo breve. 2.ate le veri)iche usando una seudo eri)erica di sta* a er rovare le )unzionalit!. 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. Co*e eAtra. 1ggiungete una )unzione al vostro )ile di con)igurazione ~/. 8e )unzioni sono dei *iniscri t e. 8:es ressione comando 8I file equivale a comando I file PI81 11.bz2L /uttavia . Il risultato dovrebbe essere che digitate qualcosa co*e printman HcomandoI. essi vengono ri ortati a quelli del rogra**a chia*ante.3. 9uando si )er*a. i ara*etri osizionali vengono *odi)icati in quelli della )unzione. in *odo che la ri*a a ro riata agina *an esca dalla vostra sta* ante. Create una sottodirectorG nella vostra directorG Ca itolo 11.#. 11. generano dei codici d:uscita o di ritorno.tar.unzioni ersonale in cui otrete conservare le 1&( .

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

1.1. in base al vostro siste*a o erativo. una shell interattiva -ash ignora 4)'T%9. Ca itolo 12. *a. 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 alla vostra shell Bash In assenza di qualsiasi intercettazione.1. 4)'TT&( e 4)'4T&P sono ignorati.1.1. utilizzando l:integrato shopt. 3egnali 12. 4)')6T viene intercettato e gestito. 5sate l:o zione hu oneAit er uccidere H killingI tutti i lavori alla ricezione di un segnale 4)'7(P. 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. ure 4)'TT)6. e 4)'E()T. e se il controllo del lavori H jobI 3 attivo. 4)'7(P nor*al*ente ter*ina una shell. In caso di dubbio.1.2. quando generati da tastiera. 12. 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. 0rovare la pagina )an dei segnali Il vostro siste*a contiene una agina *an che elenca tutti i segnali dis onibili. Ignorano questi segnali anche i co*andi che sono stati avviati co*e risultato di una sostituzione di co*andi. Cattura dei segnali 1&2 . otrebbe essere a ribile in *odo di))erente. In *olti siste*i 8inuA. ciE otrebbe essere man Z signal.1. Introduzione 12.Capitolo 12. 5na shell interattiva invier! un 4)'7(P a tutti i lavori.

. ?ome segnale Salore segnale 2I4B5P 2I4IN/ 2I4SI88 1 2 % %ffetto 1ggancia Interruzione da tastiera 2egnale di ?ill 1&3 Ca itolo 12.#. *ettere dietro le quinte o uccidere un rocesso.2. 8a sos ensione ed il ri ristino delle e*issioni sono di solito disabilitate se state usando [*oderne[ e*ulazioni di ter*inale. se nessuno viene indicato. diverso da zero se 3 ca itato un errore. 6so dei segnali con Cill 8a *aggioranza delle *oderne shell.#1/ 4egnali di controllo in 3a h )ombina1ione Significato standard dei tasti )trl*) Il segnale di interruzione. Il controllo viene restituito alla shell e l:utente uE *ettere in ri*o iano. co*e con pgrep e p!ill. 8a sos ensione ritardata 3 dis onibile solo in siste*i o erativi che su ortino tale )unzionalit!. invia 2I4IN/ al lavoro che sta girando in ri*o iano Il carattere di o pen ione ritardata. in *odo da )er*arlo e restituire il controllo alla shell.12.3.1. Invio di segnali usando la shell 5sando la shell -ash si ossono inviare i segnali seguenti7 Tabella 1. In -ash sia i no*i che i nu*eri dei segnali vengono accettati co*e o zioni. 12.1. 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. Il segnale di o pen ione invia un 4)'4TP ad un rogra**a attivo. -ash co* resa. 6ntra*bi i co*andi !ill inviano il segnale T%9. )trl*[ )trl*Y Imposta1ione del terminale Controllate le vostre i* ostazioni stt.1. il vostro siste*a otrebbe abilitare delle o zioni eAtra. e gli argo*enti otrebbero essere un lavoro HjobI o un I+ di rocesso. 8o standard +term su orta in *odo rede)inito )trl*S e )trl*Q. hanno una )unzione !ill integrata. 2i uE rivere uno stato d:uscita utilizzando l:o zione -l7 zero quando al*eno un segnale 3 stato inviato con successo. +eter*ina l:interruzione di un rocesso in corso quando tenta di leggere i**issioni dal ter*inale. I* iegando il co*ando !ill da /usr/bin. Cattura dei segnali . 9uesto 3 un elenco dei segnali i@ co*uni7 Tabella 1.

?ome segnale Salore segnale 2I4/6'= 2I42/. 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. 8a sintassi er l:istruzione trap 3 chiara7 trap ")GQ7?@I# "S%G?7LI# Ca itolo 12.2. dal *o*ento che otrebbe non )unzionare co*e ci si as etta in alcuni tra gli 5niA co**erciali. 23 %ffetto 2egnale di ter*inazione . 12. Cattura dei segnali 1&# . Per ese* io. 0rappole 12. sottraete qualsiasi ossibilit! al rocesso di eseguire una ulitura e chiusura ordinate. bloccati o ignorati. cosa che otrebbe avere s iacevoli conseguenze. 2e inviate un segnale 4)'F)LL ad un rocesso.P 1$ 17. i segnali )6T o F)LL otrebbero essere la sola *aniera. 4)'T%9.1. 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. 3 senso co*une iniziare a rovare con il segnale *eno ericoloso. 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. co*e la ulitura e la chiusura di )ile a erti. !illall otrebbe essere i@ conveniente7 accetta le stesse o zioni di !ill.1%..er*a il rocesso SIGVILL e SIGSTG6 2I4SI88 e 2I42/.. *a le a lica a tutte le istanze di un dato rocesso.P non ossono essere intercettati. quando un rocesso non *uore usando )trl*).2. 9uando si uccide un rocesso o una serie di rocessi. er ese* io erché si deve )ornire un:i**issione o ure deve essere eseguita una ri ulitura. 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. =a se non )unziona una chiusura ulita. Provate questo co*ando ri*a di ado erarlo in un a*bito roduttivo.

sh trap "echo Buu!. 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. o da un ciclo -hile o until.. o quando lo stato di ritorno di un co*ando viene invertito usando l:o eratore 0. 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. la tra ola non sar! eseguita )ino a che questo co*ando non sar! co* letato. non accadr! nulla7 #!/bin/bash # traptest.2. che cattura )trl*) roveniente dall:utente sta* ando un *essaggio.. che sono docu*entate nelle agine in)o di -ash. 2e uno dei segnali 3 D%3('." SIGINT SIGTERM echo "pid is $$" while : do sleep 60 done # Questo è la stessa cosa di "while true".3. la lista dei )GQ7?@I 3 eseguita do o ogni singolo co*ando.3. 12. 3coprire quando viene utilizzata una variabile 9uando si correggono scri t i@ lunghi.1.CiE istruisce il co*ando trap a catturare i 4%'6:L) elencati. Il co*ando trap accetta una co ia di o zioni. # Questo script in realtà non sta facendo nulla. che otrebbero essere i no*i di segnali con o senza il re)isso 4)'. Cattura dei segnali 1&$ . Notate che questi co*andi non saranno eseguiti quando lo stato di uscita diverso da zero roviene da una arte di un:istruzione if. 12.2. 9uando -ash 3 in attesa di un co*ando asincrono attraverso l:integrato -ait. 2e un segnale 3 B o %G)T. 9uando rovate ad uccidere questo rogra**a senza s eci)icare il segnale F)LL. otreste voler assegnare ad una variabile l:attributo trace ed intercettare i *essaggi di D%3(' di quella variabile.2.2. 9ui c:3 un ese* io *olto se* lice. o ure i nu*eri dei segnali. 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". 2ostituire la dichiarazione della variabile con le linee seguenti otrebbe )ornire una in)or*azione interessante su cosa stia )acendo il Ca itolo 12. 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. Nor*al*ente dichiarereste una variabile solo utilizzando un assegna*ento co*e S7FI7BIL%N alore. 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. subito do o l:esecuzione della tra ola. i )GQ7?@I vengono eseguiti quando la shell esce. 6lteriori ese)pi 12.

}" EXIT touch $LOCKFILE makewhatis -u -w exit 0 12. 'ealizzate uno scri t che scriva una i**agine di avvio Hboot imageI in un dischetto utilizzando il rogra**a di utilit! dd. exit 255.vostro scri t7 declare -t VARIABILE=valore trap "echo VARIABILE è in uso qui.sercizi 5na co ia di ese* i ratici7 1.cron con cron7 #!/bin/bash LOCKFILE=/var/lock/makewhatis. deco* resso. utilizzando l:istruzione trap. 9uesti segnali ossono essere intercettati.lock # Previous makewhatis should execute successfully: [ -f $LOCKFILE ] && exit 0 # Upon exit. a seconda dell:azione che uE essere eseguita.2. *ostrate un *essaggio che dica che tale azione render! inutilizzabile il dischetto. 3o))ario 2i ossono inviare dei segnali ai vostri rogra**i usando il co*ando !ill o delle scorciatoie da tastiera. 2oltanto la reale installazione del acchetto non dovrebbe essere interro* ibile.2. 8:unico segnale che nessun rogra**a uE ignorare 3 il segnale F)LL/ 12. Il acchetto deve essere scaricato da Internet." DEBUG # resto dello script 12. 'edigete uno scri t che auto*atizzi l:installazione di un acchetto di terze arti di vostra scelta. 2. trap "{ rm -f $LOCKFILE . Ca itolo 12. 2e l:utente rova ad interro* ere lo scri t usando )trl*).#. &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. Cattura dei segnali 1&& . 1lcuni rogra**i ignorano i segnali. estratto dall:archivio e co* ilato se queste azioni sono co* atibili.3. . remove lockfile.3.

Cattura dei segnali 1&7 .Ca itolo 12.

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.a coincidere qualsiasi carattere nel no*e del )ile . Notate che i co*andi sto . sus end. Caratteristiche della shell 1&" .1.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 1 endice 1 . 2. Wobs. Caratteristiche co)uni 8e seguenti caratteristiche sono standard in ogni shell. 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 .

tutti i co*andi csh )unzioneranno in tcsh. Tabella :#. -ourne 1gain 2hell HbashI. e. bash ha *olte i@ caratteristiche di er se stesso. tutti i co*andi sh )unzioneranno anche in bash O *a non viceversa. co*e di*ostrato nella tabella sottostante.71ione Invito rede)inito d:utente . )ompatibilit] delle shell +al *o*ento che -ourne 1gain 2hell 3 un su erinsie*e di sh. Caratteristiche di((erenti 8a tabella sottostante *ostra le rinci ali di))erenze tra la shell standard HshI. Sorn shell H!shI e C shell HcshI. Poiché la /urbo C shell 3 un su erinsie*e di csh.2. *a non invece al contrario.)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. 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.orzatura redirezione 'edirezione di stdout e stderr verso file 1 endice 1 . *olte di esse sono state incor orate da altre shell. Caratteristiche della shell 1&% .

file $! $source file o . Z<. file alias +N&. file alias +N. zioni correnti $! $.do set -f/ set -o nullglob|dotglob| nocaseglob|noglob hash hash cmds hash -r hash hash cmds hash -r 1 endice 1 . bN Significato. 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 .do case done esac e+it n for.sh bash MO !sh csh MO EcomandoE $home Z b<. 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.& $! $.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]. Caratteristiche della shell 17( . 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 . case done esac e+it n for.do source file alias + .

FrecciaSu*In io o >> !str !sh histor.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. essendo bash la shell 4N5 e quella i@ se* lice er i rinci ianti.do if 99i==5:: fi ulimit p-d read trap 2 unalias until -hile. trattandosi del *anuale della vostra shell. Caratteristiche della shell 171 . /est condizioni d:ese* io . 2ta* atevelo e ortatevelo a casa.do if 9i==5: endif limit dirs AH onintr unalias -hile 8a -ourne 1gain 2hell ossiede *olte altre caratteristiche qui non elencate. =aggiori in)or*azioni sulle caratteristiche riscontrabili solo in -ash si ossono rinvenire nelle agine in)o di -ash. quando eseguito.do r x=y cmd !cmd:s/x/y/ if " $i 'e( 5 # fi ulimit p-d read trap 2 unalias until -hile. >> !str Significato.sh bash histor. 1 endice 1 . 8a scelta re)erita sarebbe info bash.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[. studiatevelo ogni volta che avete $ *inuti. 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. 5lteriori in)or*azioni7 +ovreste leggere al*eno un unico *anuale. nella sezione [-ash )eatures[. r r str csh histor.

apt'get Progra**a di utilit! er la gestione dei acchetti. =aggiori in)or*azioni sull:uso si ossono trovare nelle agine *an o in)o.. esa*e o cancellazione di lavori dell:ulti*a esecuzione. alias Crea un alias di shell er un co*ando.5lossario 9uesta sezione contiene una anora*ica in ordine al)abetico dei co*andi 5NIF co*uni. aspell Controllo ortogra)ico. anacron 6segue co*andi eriodica*ente. at(.or*atta i )ile er la sta* a in una sta* ante Post2cri t. non resu apropos Cerca stringhe nella base dati >hatis. at. 2 aPps . . adduser Crea un nuovo utente o aggiorna le in)or*azioni rede)inite del nuovo utente. 4lossario 172 one una *acchina se* re in )unzione. atrm 1ccoda*ento. acroread 0isualizzatore P+.

b1ipP 5n co* ressore di )ile a ordina*ento di blocchi. cdp. 5n rogra**a interattivo in *odalit! testuale er controllare e ri rodurre C+ 'o* audio sotto 8inuA.a girare un lavoro dietro le quinte. C cat Concatena )ile e sta* a sull:e*issione standard J tdoutK. bitmap 6ditor di bit*a e utilit! di conversione er il 2iste*a F >indo>.aumi+ 'egola il *iAer audio. bg . esa*e o cancellazione di lavori dell:ulti*a esecuzione. cd Ca*bia +irectorG.cdpla. 4lossario 173 . B bash -ourne 1gain 2hell. HgIa-! 8inguaggio di analisi ed elaborazione di *odelli. batch 1ccoda*ento.

cdparanoia 5n:utilit! er la lettura di C+ audio che co* rende caratteristiche eAtra er la veri)ica dei dati. o ro rietario. csh 1 re una shell C. cdrecord 'egistra un C+<'. cho-n Ca*bia il ro rietario e il gru compress Co* ri*e )ile. cp Co ia )ile e directorG. 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. 4lossario 17# . o di un )ile. crontab 4estisce i )ile crontab. chmod =odi)ica i er*essi di accesso ai )ile.

dd converte e co ia un )ile Hdis? du* I. echo =ostra una linea di testo. + date 2ta* a o i* osta la data e l:ora di siste*a.cut 'i*uove sezioni da ciascuna linea di un )ile. diff /rova le di))erenze tra due )ile. du 0aluta l:uso dello s azio dei )ile. ediff Il diff del traduttere inglese 4lossario 17$ . . dhcpd +e*one del cliente +BCP. dmesg 2ta* a o controlla il bu))er ad anello del ?ernel. df 'i)erisce l:uso dei dischi del )ile sGste*.

orti re*ovibili. e+port 1ggiunge )unzioni all:a*biente della shell. e+it 5scita dalla shell corrente. in Post2cri t fdformat . / fa+Pps Converte un )acsi*ile /I.P. e^ect 2*onta ed es elle su emacs 1vvio dell:editor 6*acs e+ec Invoca sotto rocessi. fg G dis?..+='<co* atibile. 6/'N o . I=1P. fetchmail raccoglie la osta da server P. 4lossario 17& .or*atta )lo fdis! 4estore delle tabelle delle artizioni sotto 8inuA.egrep grep esteso.

aIgett.or*attatore di osta. formail H'iI. ftp 2ervizi di tras)eri*ento )ile Hnon sicuri a *eno che non venga utilizzato un account anoni*oVI. si s era. 5 galeon Navigatore internet gra)ico. Hmin.Porta un lavoro in ri*o iano. find /rova )ile. file 2tabilisce il ti o di )ile. 4lossario 177 . gdm 4no*e +is laG =anager. grep 2ta* e linee che corris ondono ad un *odello. Controlla le unit! di console. fortune 2ta* a un casuale e. interessante adagio. gimp Progra**a di *ani olazione delle i**agini.

ifconfig Con)igura l:inter)accia di rete o ne *ostra la con)igurazione. host Progra**a di utilit! er vedere +N2. head 6*ette la ri*a arte dei )ile.er*a il siste*a. help =ostra gli aiuti sui co*andi integrati della shell. F halt .grub 8a shell di grub g 5n visualizzatore Post2cri t e P+.. g1ip Co* ri*e o es ande un )ile. I id 2ta* a gli 5I+ e 4I+ attuali ed e))ettivi. httpd 2erver 1 ache dell:BG er/eAt /rans)er Protocol. 4lossario 17" .

. init Inizializzazione dei controlli dei rocessi. H !dm +es?to *anager Hgestore scrivaniaI er S+6. G ^ar 2tru*ento di archiviazione Yava.*odi)ica lo stato delle inter)acce di rete. ipchains 1**inistrazione del )ire>all IP.. ip =ostra.info 8egge i docu*enti In)o. ^obs 6lenca le o erazioni dietro le quinte. 4lossario 17% . iostat =ostra le statistiche I. !illHallI /er*ina i rocessi. iptables 1**inistrazione dei )iltri dei acchetti IP.

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

memusage =ostra l:utilizzo della *e*oria. Co ia )ile =2+. l.Invia richieste al servizio di sta* a 8P. lp( Progra**a er esa*inare la coda d:attesa della sta* a. 9 mail Invia e riceve osta.n+ Navigatore CCC in *odalit! testo. mdir =ostra una directorG =2+. 4lossario 1"1 . ls 6lenca il contenuto delle directorG.2. man 8egge le agine *an.2 verso.da 5niA. lprm 'i*uove richieste di sta* a. mcop. lpr 2ta* a non in linea.

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

s 2e* lice inter)accia er con)igurare i livelli di avvio. connessioni *ascherate e a artenenze a *ultitras*issioni. named 2erver dei no*i di do*inio Internet. nfsstat 2ta* a statistiche sui )ile sGste* in rete. nts. a Post2cri t.'ino*ina )ile. nmap 2tru*ento di es lorazione della rete e scanditore di sicurezza. netstat 2ta* a connessioni di rete. tabelle di instrada*ento. nice 1vvia un rogra**a con riorit! di esecuzione *odi)icata. pdfPps /raduttore 4hostscri t da P+. P pass-d Ca*bia ass>ord. ncftp Progra**a di navigazione er servizi )t Hnon sicuroVI. perl 4lossario 1"3 . statistiche d:inter)accia.

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

rmdir 'i*uove una directorG. rlogin 1utenticazione re*ota Htelnet. rsh 2hell re*ota 3 scp Co ia re*ota sicura.Co ia re*ota Hnon sicuroVI. reboot .er*a e riavvia il siste*a. rdes!top Cliente del 'e*ote +es?to Protocol. renice 1ltera la riorit! di un rocesso in )unzione. non sicuroVI. rpm 4estore di acchetti 'P=. rm 'i*uove un )ile. 4lossario 1"$ . screen 4estore dello scher*o con e*ulazione 0/1((.

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

4lossario 1"7 . tail 6*ette l:ulti*a arte di )ile. tcsh 1 re una /urbo C 2Bell.or*attazione e i* ostazione ti ogra)ica di testi. tar 5tilit! di archiviazione. te+ . time /e* orizza un se* lice co*ando o d! l:uso delle risorse. telnet Inter)accia utente al rotocollo /68N6/ Hnon sicuroVI. tal! Parla ad un utente. 0 tac Concatena e sta* a )ile al contrario.4enerazione di chiavi di autenticazione. =odi)ica e sta* a i* ostazioni delle linee di ter*inale. su 2>itch 5ser Hca*bia utenteI. stt.

umount 2*onta un )ile sGste*. touch a*bia le *arcature te* orali dei )ile. uni( 4lossario 1"" . t-m /ab Cindo> =anager er il siste*a F Cindo>. umas! I* osta la *aschera della creazione dei )ile degli utenti. trip-ire 5n controllore di integrit! dei )ile er i siste*i 5niA. uncompress +eco* ri*e )ile co* ressi. top =ostra i rinci ali rocessi della CP5. 6 ulimit Controlla le risorse.tin Progra**a di lettura ne>s. traceroute 2ta* a i acchetti di instrada*ento richiesti er collegare in rete un host.

-all Invia un *essaggio sul ter*inale di ognuno. userdel Cancella l:account di un utente e i )ile relativi. I =ostra chi 3 collegato e cosa sta )acendo. -c 2ta* a il nu*ero di bGte. imtutor Il corso di 0i*. update +e*one del ?ernel er scaricare *e*orie di transito Hbu))erI s orche di ritorno al disco. -hich 4lossario 1"% . arole e linee nei )ile. 1 i HmI 1vvia l:editor vi Hi= rovedI.'i*uove le linee du licate in un )ile ordinato. uptime =ostra il te* o di )unziona*ento ed il carico *edio del siste*a. mstat 'i)erisce le statistiche della *e*oria virtuale.

-rite Invia un *essaggio ad un altro utente.rologio analogico. -hoami =ostra l:I+ dell:attuale utente. +dm 4estore dello scher*o F con su +d i 0isualizzatore +0I. 4lossario 1%( .=ostra il ercorso intero dei co*andi Hdi shellI. selettore di host. orto er F+=CP. +cdroast Inter)accia gra)ica di cdroast.digitale er F. -hois 6))ettua una ricerca nella basedati >hois o dei no*i nic. +console Controlla i *essaggi della console di siste*a tra*ite F. -ho =ostra chi 3 collegato. : +auth F authoritG )ile utilitG. +cloc! .

iltro er la visione di testo co* resso. 1grep 'icerca eventuali )ile co* ressi in base ad una es ressione regloare. +lsfonts 0isualizzatore er F dell:elenco dei )ont del server. 4lossario 1%1 . +inetd Il de*one esteso dei servizi Internet.+fs 2erver F dei )ont. +term 6*ulatore di ter*inale er F. J 1cat Co* ri*e o es ande )ile. +mms 'i roduttore audio er F. 1more . +host Progra**a er F di controllo degli accessi al server. +load Presentazione er F della *edia di carico di siste*a.

1 chiamata da remoto 2ezione 1.2.2.2.2 brace e+pansion 2ezione 3.1 ancore di linea 2ezione #.1.2 combined e+pressions 2ezione 7. 2ezione #.1.bashrc 2ezione 3.#.1.1 brea! 2ezione %.2.1.2.3 crea1ione di ariabili 2ezione 3.2.1.3.1.2.2 .2.# arra.2.2.$ apici singoli 2ezione 3.# batch editor 2ezione $.1 classi di caratteri 2ezione #.2.1 boolean operators 2ezione 7.2 espansione aritmetica 2ezione 3.& child process 2ezione 1.1 alias Hrimo1ione degliI 2ezione 3. 2ezione 1(.#.2.$ cerca e sostituisci 2ezione $.7 apici doppi 2ezione 3.2.1.3 continue 2ezione %.3.3.2 C caratteri di irgolettatura 2ezione 3.3 case Histru1ioniI 2ezione 7.1 condi1ionali 2ezione 7.$ .1.3.$.2.1.2.2 costanti 2ezione 1(.3 argomenti 2ezione 7.2.3.1 a-! 2ezione &.2 comandi integrati 2ezione 1.bash<logout 2ezione 3.1 a-!program 2ezione &.2.1 configura1ione Hfile diI 2ezione 3.1 command substitution 2ezione 3.bash<profile 2ezione 3.1.2 Bourne shell 2ezione 1.& commenti 2ezione 2.$.1.2.2.1.# chiamata 2ezione 1.3 conditionals 2ezione 7.2 ancore delle parole 2ezione #.2.3 built'in commands 2ezione 1.2.2.1 7?SI') (uoting 2ezione 3.1.Indice 2 alias 2ezione 3.bash<login 2ezione 3.3.2 .1 .3.1 confronti numerici 2ezione 7.#.2.2 1%2 B bash 2ezione 1.2 compara1ione dei modelli 2ezione #.1.$.2.# Indice .2 controllo Hsegnali diI 2ezione 12.$.3 corre1ione degli script 2ezione 2.

% find and replace 2ezione $.1 file di ini1iali11a1ione 2ezione 3.1 descrittori dei file 2ezione ".3.1.2.2 editors 2ezione 2.1.2.$.2.3.3.2.$.etc.2.1.2 + debugging scripts 2ezione 2.# . 2ezione ".2.3.1.#.1.1 espressioni regolari estese 2ezione #.2 .2.1 fun1ioni 2ezione 11.2.pass-d 2ezione 1.2 esecu1ione 2ezione 2.etc.#. 2ezione 2.1 emacs 2ezione 2.1.1.# e+port 2ezione 3.3.1 espressioni regolari 2ezione #.1.#.1.3. 2ezione ".1 1%3 .3 espansione dei nomi dei file 2ezione 3.1 Indice espressioni primarie 2ezione 7. 2ezione 1(.1 espansione 2ezione 1. 2ezione ".1.1.1.$ e+it status 2ezione 7.1 di isione delle parole 2ezione 3.% double (uotes 2ezione 3.3 / file descriptors 2ezione ".2.1.2 e+ec 2ezione 1.1 .2.1.3 espansione delle ariabili 2ezione 3.1.2.3 e+ecution 2ezione 2.1.#.1.#.2.2 escape Hse(uen1eI 2ezione ".3.2.$.1 esac 2ezione 7.1.1.2.1.1.#.2 e+ecute permissions 2ezione 2.shells 2ezione 1.1.1 emissione standard 2ezione ".1 en 2ezione 3.1.2.$ espansione delle parentesi 2ezione 3.$ escape HcaratteriI 2ezione 3.2.1 errore standard 2ezione ". 2ezione 1.1 file name e+pansion 2ezione 3.3.2.3 e+tended regular e+pressions 2ezione #. 2ezione ".bashrc 2ezione 3.# for 2ezione %.profile 2ezione 3. echo 2ezione 1.#.2.1 else 2ezione 7.$ espressioni combinate 2ezione 7.1. 2ezione 2.$.3 declare 2ezione 1(.1.# flusso logico 2ezione 1.#.1.3 e+it 2ezione 7.1 for! 2ezione 1.csh 8a C 2Bell.3 .#.etc.#.3.2 .etc.% espansione dei parametri 2ezione 3. 2ezione 3.

1.2 ga-! HscriptI 2ezione &.2 L line anchors 2ezione #.1.3.& initiali1ation files 2ezione 3.3.1 menu 2ezione %.2.3 in ito 2ezione 3.2. 2ezione 1.1.# I if 2ezione 7.# login shell 2ezione 1. Indice 9 matrice 2ezione 1(.5 ga-! 2ezione &.2.3 interacti e editing 2ezione $.1.2.2.2 grep 2ezione #.1.#.3. 2ezione 1.3 gedit 2ezione 2.1 metacaratteri 2ezione #.2.3 in ocation 2ezione 1.2.1.2 ga-! Hformatta1ioneI 2ezione &.3.1 init 2ezione 1.2 !sh Sorn shell.& locate 2ezione 2.2.2.#.2.2.2.3.1.2.2 modifiche interatti e 2ezione $.& messaggi da utente 2ezione ".2. 2ezione 1.2.1 globbing 2ezione 2.2 F here HdocumentoI 2ezione ".1 lunghe11a di una ariabile 2ezione 1(.2.2.1 G H !ill 2ezione 12.1.1 interacti e shell 2ezione 1.2.1.2.1 ga-! HcampiI 2ezione &.$.2.3.3 metacaratteri 9nelle espressioni regolari: 2ezione #.1 input field separator 2ezione 3.2.1.1.2.1.2.2.1. 2ezione 3.2.1 locale 2ezione 3.1.3 1%# .3 immissione da utente 2ezione ".$ ga-! H ariabiliI 2ezione &.1 2ezione 1.2.2 immissione standard 2ezione ".1 logic flo2ezione 1.2 modifiche non interatti e 2ezione $.1 global ariables 2ezione 3.$.2.1. 2ezione &.2 interacti e scripts 2ezione ".2. 2ezione ".2 !illall 2ezione 12.2.1 if annidati 9istru1ioni di: 2ezione 7.1.2.$.2.1 ga-! HcomandiI 2ezione &.

& remo ing aliases 2ezione 3.$.2.$ parametri posi1ionali 2ezione 3.2 < (uoting characters 2ezione 3.1.2.2.3.2.1.1 printf 2ezione 1.2.2.1 readonl.#. 2ezione ".2.$.3 non'interacti e shell 2ezione 1.profile 2ezione 3.1.1 printen Indice 3 script interatti i 2ezione ".1 6GSIR 9modalit]: 2ezione 1.# rbash 2ezione 1.$.1.1.3.&.2.2.2.7 operatori booleani 2ezione 7.1.1.2.2.3 P parameter e+pansion 2ezione 3.3 noglob 2ezione 2. 2ezione $.2.3.1.3 . 2ezione 3.#.1.1. e+pressions 2ezione 7.2 non'interacti e editing 2ezione $.2.3.2.2. 2ezione 11.2.2.1 sed Hcomandi di modificaI 2ezione $.3 prompt 2ezione 3.2.&.2 sed Hop1ioniI 2ezione $. 2ezione 1(.2.3 & redire1ione 2ezione 1. 2ezione &.2.# regular e+pressions 2ezione #. operatori aritmetici 2ezione 3.3.2.1( read 2ezione ".3 non'login shell 2ezione 1.1 output record separator 2ezione &.2 2ezione 3.1.$. 2ezione %.1.2." processo figlio 2ezione 1.1.7.2 pattern matching 2ezione #.2.$ 67T_ 2ezione 2.2.2.2.1 remote in ocation 2ezione 1.3 regular e+pression operators 2ezione #.$ primar.2.1 .2.#.2.3.2.# op1ioni 2ezione 3.2.# operatori delle espressioni regolari 2ezione #.2.3 permessi di esecu1ione 2ezione 2.2 reser ed ariables 2ezione 3.& process substitution 2ezione 3.# return 2ezione 11. 2ezione &. 2ezione &.1.3 6GSIR 2ezione 1.1.nested if statements 2ezione 7.1 output field separator 2ezione &.2. 2ezione $.2 1%$ .3 positionalparams 2ezione 3.1 sed 2ezione $. 2ezione 11.#.$.3 parametri speciali 2ezione 3.1.2.2 numeric comparisons 2ezione 7.1.

2.2.1 ariabili globali 2ezione 3.1.3 sostitu1ione dei comandi 2ezione 3.3.2.2.2.1.1. 2ezione 3.2.1 sorgente 2ezione 2. 2ezione 1(.2.2 source 2ezione 2.1.2.3." sottostringa 2ezione 1(.1.&.3 shell non di autentica1ione 9o di login: 2ezione 1.$.$ standard error 2ezione ".1.1.1 standard output Indice 2ezione ".3 stt. 2ezione 3.3.2.1 separatore dei campi d&immissione 2ezione 3.2.2. 2ezione 1.2.1.2 subshell 2ezione 2.7 single (uotes 2ezione 3.1.2.3.2.2.#.3 trappole 2ezione 12.3 special parameters 2ezione 3.2.2.3.2 set 2ezione 3.1.#.2.# trasforma1ione di ariabili 2ezione 1(.1 shell interatti a 2ezione 1.2.2 unset 2ezione 3.2. 2ezione 3.3.1.2 6 unalias 2ezione 3.2.3.1.1.2 terminologia 2ezione 1.2.2.3.# until 2ezione %.3 sostitu1ione 2ezione 1(.2 0 tcsh 2ezione 1.2 shell non interatti a 2ezione 1.1.1. 2ezione ".2. 2ezione 1(.2. 2ezione 11.2.& separatore dei campi d&emissione 2ezione &.1.1.2 user messages 2ezione ".2.# shell di autentica1ione 9o di login: 2ezione 1.3 user input 2ezione ".& sostitu1ione dei processi 2ezione 3.1.1.3.1 true 2ezione %. 2ezione 1.2.2.$.1 stato d&uscita 2ezione 7.3 then 2ezione 7.1 1 ariabili 2ezione 3.3.1 stringa 2ezione 7.&.3 shift 2ezione %.3.3.2.1 select 2ezione %.3.1 substring 2ezione 1(.$. 2ezione 1(.2. 2ezione 12.#.2.3.1 submenu 2ezione %.1 1%& .2.2.1.#.sed HscriptI 2ezione $. 2ezione 11.3 sintassi 2ezione 1.3.2.3.2.3 separatore dei record in uscita 2ezione &.#.3.2.1 standard input 2ezione ".2 tilde Hespansione dellaI 2ezione 3.1.2 segnali 2ezione 12.3.$. 2ezione &.2.2.2.2.

3 -ord anchors 2ezione #.2 K J Indice 1%7 .2.2.1 -ord splitting 2ezione 3.3.1 -hile 2ezione %.$ ariable e+pansion 2ezione 3.2.ariabili riser ate 2ezione 3.$ erbose 2ezione 2.$ I -ait 2ezione 12.1 -hich 2ezione 2.2 -ildcards 2ezione #.3.#.1 irgolettatura 7?SI') 2ezione 3.2.# ariabili speciali 2ezione 3.2 -hereis 2ezione 2.3.2.2.#.% : +trace 2ezione 2. 2ezione 2.2.2 i HmI 2ezione 2.1.3.1.1.1.

Related Interests

'invito. willy!' Ciao. 2.82s 36. 4 users.sh + clear + echo 'Lo script inizia adesso.00s ? willy pts/3 Sat 2pm 43:13 36. 2crivere e correggere gli scri t 3" . 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.A. 0.3. load average: 0. Notate nuova*ente che i co**enti aggiunti non sono visibili nei risultati dello scri t.sh )atto girare in *odalit! correzione.62. + echo . otete )ar eseguire in *odalit! nor*ale quelle arti dello scri t di cui siete certi che non abbiano errori.nell:ese* io scri t1<co**entato. 6:49.orge. 0.58. 9uesto 3 lo scri t script1-commentato.2.05s -bash willy :0 Sat 2pm ? 0. Correzione su parte?i dello script 5tilizzando l:integrato di -ash set. e otete *ostrare le in)or*azioni er la correzione solo delle zone roble*atiche. a artire dalla 3. + echo 'Ciao. 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.13s 0.avviare la sottoshell con l:o zione <A.' Lo script inizia adesso. 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.

06s /usr/bin/screen + set +x Adesso sto impostando due variabili.sh Lo script inizia adesso.05s -bash willy :0 Sat 2pm ? 0. 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 -f willy:~/scripts> ls * ls: *: No such file or directory script1.33 USER TTY FROM LOGIN@ IDLE JCPU PCPU WHAT root tty2 Sat 2pm 5:47m 0.88s BitchX willyke willy pts/2 Sat 2pm 54:02 0. Ciao.88s 36.39.00s ? willy pts/3 Sat 2pm 54:02 36. willy:~/scripts> Potete attivare e disattivare la *odalit! di correzione quante volte volete con lo stesso scri t.sh Ca itolo 2.Il risultato sar! si*ile a questo7 willy:~/scripts> script1. 4 users. Questa è una stringa: nero E questo è un numero: Ora ti restituisco l'invito.sh script1. ri*a della 8a lineetta viene utilizzata er attivare una o zione di shell e un i@ er disattivarla. 0. 2crivere e correggere gli scri t 3% . 8a tabella successiva o))re una anora*ica di altre utili o zioni di -ash7 Tabella . 2ta* a le linee in entrata alla shell co*e esse vengono lette.79. 0. 2ta* a il traccia*ento dei co*andi loro esecuzione. 7:0.sh willy:~/scripts> set +v set +v willy:~/scripts> ls * script-commentati.13s 0. willy! Ora ti invio un elenco degli utenti connessi: + w 5:00pm up 18 days.24s 0.#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. load average: 0.

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

8:a*biente di -ash #3 . 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. display style: the readline config file: if [ -z "$INPUTRC" -a ! -f "$HOME/. vim. sarebbe *eglio *ettere delle con)igurazioni s eci)iche er -ash in tale )ile. then .2.inputrc" ]. In questi casi ~/. ro)ile. 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. Il sorgente di -ash contiene dei )ile profile di ese* io er uso generale o individuale. $i fi done # Settings for program initialization source /etc/java. +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. 9uesto 3 una orzione del bashrc allegato alla docu*entazione di -ash7 Ca itolo 3.1. co*e la shell -ourne. ?etc?bashrc Nei siste*i che o))rono *olte lici ti i di shell..05b/startup-files. less. Il sorgente contiene dei )ile bashrc d:ese* io.2. 9uesti e quello nell:ese* io recedente necessitano di *odi)iche er )arli )unzionare nel vostro a*bienteV 3.sh . Potreste anche trovare che nel vostro siste*a /etc/profile contiene solo l:a*biente di shell e le i* ostazioni d:avvio. bell. viene letto anche da altre shell.1.o a licazioni Yava nei loro navigatori di rete. dal *o*ento che .bashrc dell:utente otrebbe untare a /etc/bashrc er includerlo nel rocesso di inizializzazione della shell al *o*ento dell:autenticazione. Il )ile /etc/bashrc otrebbe essere richia*ato in /etc/profile o nei )ile di inizializzazione shell di un singolo utente.HOSTNAME=`/bin/hostname` HISTSIZE=1000 # Keyboard..) for i in /etc/profile. o ure otreste trovarne una co ia in /usr/share/doc/bash-2. 4uardate la 2ezione 3. .etc.d/*. *entre /etc/bashrc contiene le de)inizioni co* lessive del siste*a er le )unzioni di shell e gli alias.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. do if [ -r "$i" ].

1. 9uesto )ile contiene una )unzione. 3. 8:a*biente di -ash ## .. In questo )ile gli utenti ossono aggiungere delle con)igurazioni eAtra o ure ca*biare i valori rede)initi7 franky~> cat ." } 6scludendo gli alias generali.$. Nella 2ezione 3.bash_profile file # # # # Executed from the bash shell when you log in.2.2. # SunOS) # stty erase # .." kill -9 $pid echo "slaughtered.bashrc source ~/. ps!ill7 le )unzioni saranno studiate in dettaglio nel Ca itolo 11.bash_profile 9uesto 3 il )ile di con)igurazione re)erito er con)igurare i singoli a*bienti degli utenti.1. contiene degli utili alias che )anno )unzionare i co*andi anche quando li scrivete in *odo errato. 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... *) stty sane Ca itolo 3. 3. # # # ################################################################# source ~/.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).bash_profile ################################################################# # # # . ~/.bash_login case "$OS" in IRIX) stty sane dec stty erase .1.2 trattere*o degli alias.

1.2. verr! letto questo )ile.bashrc Ca itolo 3. er ese* io quando ci si 3 autenticati in a*biente gra)ico utilizzando le )inestre del ter*inale di F.profile In assenza di ~/.2. esac 9uesto utente con)igura il carattere bac?s ace er l:autenticazione in di))erenti siste*i o erativi.bash_profile. che oi sono accessibili anche dalle altre shell.1.bashrc # /home/franky/.bash_login. 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.. 3.bashrc e . ~/.bash_profile) # # # ####################################################################### # file protection umask 002 # all to me. l:utente non deve )ornire un no*e utente o una ass>ord7 non viene )atta nessuna autenticazione.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.#. read to group and others # miscellaneous w cal `date +"%m"` `date +"%Y"` In *ancanza di ~/. 1 arte ciE.bash_login dell:utente. 3.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 . ~/. il che signi)ica che non dovete inserire le stesse i* ostazioni in *olte lici )ile. viene letto ~/.3. -ash cerca ~/. vengono letti .profile. Nell:ese* io..bashrc . In questo ~/. /ale utente ottiene anche il calendario del *ese corrente7 ####################################################################### # # # Bash_login file # # # # commands to perform from the bash shell at login time # # (sourced from .2..2.1.bash_profile e di ~/.ggi 3 i@ )requente utilizzare una shell senza autenticazione. 5na volta a erta una tale )inestra. Z. 'icordatevi che altre shell otrebbero non co* rendere la sintassi di -ash. 9uando ciE accade.bashrc a cui si )a ri)eri*ento nei )ile letti al *o*ento dell:autenticazione. PuE tenere le stesse con)igurazioni. 8:a*biente di -ash #$ . 3.

3.$. Z.0. 4li alias sono trattati nella 2ezione 3.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.bashMlogout 9uesto )ile contiene istruzioni s eci)iche er la rocedura di chiusura della sessione HlogoutI.2. 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. /etc/bashrc fi # shell options set -o noclobber # my shell variables export PS1="\[###BOT_TEXT###33[1. then . franky ~> cat .1.. 'icordate che i )ile ca* ione otrebbero necessitare di *odi)iche er )unzionare nel vostro siste*a.# Source global definitions if [ -f /etc/bashrc ].44m\]\u \w\[###BOT_TEXT###33[0m\] " export PATH="$PATH:~/bin:~/scripts" # my aliases alias cdrecord='cdrecord -dev 0. 8:a*biente di -ash #& .bash_logout ####################################################################### # # # Bash_logout file # # # # commands to perform from the bash shell at logout time # # # ####################################################################### Ca itolo 3.$.

Notate che source resourcefile 3 lo stesso di . 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.1. resourcefile. 2ezione 2. 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. In tal caso rosso signi)ica ericolo. 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." o co*e queste7 Ca itolo 3.clear franky ~> 3. Inter retando lo scri t in questo *odo. 8:a*biente di -ash #7 . Potreste aggiungere delle linee co*e questa7 echo "Ora è in esecuzione . 9uesto ese* io di*ostra anche l:utilizzo di inviti di))erenti da arte di utenti di))erenti.3. non reoccu atevi eccessiva*ente.bash_profile.. Ca)biare i (ile di con(igurazione 9uando e))ettuano delle *odi)iche ad uno qualsiasi dei )ile recedenti. 9uando avete un invito verde. gli utenti devono riconnettersi al siste*a od usare source con il )ile alterato a))inché i ca*bia*enti ossano avere e))etto.3.2I.

2.hq.gtkrc-1.o:~ G_BROKEN_FILENAMES=1 GDK_USE_XFT=1 GDMSESSION=Default GNOME_DESKTOP_SESSION_ID=Default GTK_RC_FILES=/etc/gtk/gtkrc:/nethome/franky/. I co*andi en o printen ossono essere utilizzati er *ostrare le variabili a*bientali.bashrc:" export PS1="[valore qualsiasi]" echo "PS1 adesso è impostato a $PS1" 3. 0ipi di variabili Co*e visto negli ese* i recedenti.1.2. le variabili di shell sono in caratteri *aiuscoli convenzione.:~:/usr/local:/usr:/ CFLAGS=-O2 -fomit-frame-pointer COLORTERM=gnome-terminal CXXFLAGS=-O2 -fomit-frame-pointer DISPLAY=:0 DOMAIN=hq.1.1.garrels. -ash tiene un elenco di due ti i di variabili7 er 3.2-gnome2 GWMCOLOR=darkgreen GWMTERM=xterm HISTFILESIZE=5000 history_control=ignoredups HISTSIZE=2000 HOME=/nethome/franky HOSTNAME=octarine.echo "Ora si impsta PS1 in . 8:a*biente di -ash #" .garrels.2. 1ariabili 3.0 LANG=en_US LDFLAGS=-s LD_LIBRARY_PATH=/usr/lib/mozilla:/usr/lib/mozilla/plugins LESSCHARSET=latin1 LESS=-edfMQ LESSOPEN=|/usr/bin/lesspipe.be INPUTRC=/etc/inputrc IRCNAME=franky JAVA_HOME=/usr/java/j2sdk1. 2otto c:3 un risultato ti o7 franky ~> printenv CC=gcc CDPATH=.4. 1ariabili globali 8e variabili globali Ho variabili a*bientali O environment variable I sono dis onibili in tutte le shell.be e= TOR=vi FCEDIT=vi FIGNORE=.sh %s LEX=flex LOCAL_MACHINE=octarine Ca itolo 3. 9uesti rogra**i sono co* resi nel acchetto h#util .

1.37.aliases BASH=/bin/bash Ca itolo 3. Il risultato verr! ordinato secondo le correnti i* ostazioni locali e *ostrato in un )or*ato riutilizzabile. do o aver eli*inato le )unzioni che vengono *ostrate dal co*ando set7 franky ~> diff set.Shell/hq.01 :or=01.garrels.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/.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.sorted printenv.2.01:cd=40.sorted | grep "<" | awk '{ print $2 }' BASE=/nethome/franky/. Variabili locali 8e variabili locali sono dis onibili solo nella shell corrente. +i sotto c:3 un )ile di)) realizzato con)rontando i risultati di printen e set.33:so=01.34:ln=01.hq.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.36:pi=40.2. a arir! un elenco di tutte le variabili Hco* rese quelle a*bientaliI e le )unzioni.33.05. 5sando il co*ando integrato set senza alcuna o zione.LOGNAME=franky LS_COLORS=no=00:fi=00:di=01.33.be/octarine.Linux:/nethome/franky/bin:/usr/local/bin:/usr/local/sbi n:/usr/X11R6/bin:/PS1=\[###BOT_TEXT###33[1.35:bd=40.garrels.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.Xauthority XENVIRONMENT=/nethome/franky/.44m\]franky is in \w\[###BOT_TEXT###33[0m\] PS2=More input> PWD=/nethome/franky SESSION_MANAGER=local/octarine. 8:a*biente di -ash #% .

2.3. ossia*o suddividerle anche in categorie in base al ti o dei loro contenuti. 3. *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 $( .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 &.2. 8e variabili ossono contenere anche delle ci)re.2. 1ttribuire alle variabili locali un no*e in *inuscolo 3 una convenzione che qualche volta viene a licata. In base a ciE. Creazione delle variabili +i base le variabili sono in lettere *aiuscole e sono sensibili a ciE. 3.05b. 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(. siete liberi di usare i no*i che re)erite o di *ischiare *inuscole con *aiuscole.0(1)-release' COLUMNS=80 DIRSTACK=() DO_FORTUNE= EUID=504 GROUPS=() HERE=/home/franky HISTFILE=/nethome/franky/. Per ora lavorere*o con valori interi e stringa nelle nostre variabili.BASH_VERSINFO=([0]="2" BASH_VERSION='2. 1ariabili per contenuto 1 arte la distinzione delle variabili in locali e globali.1. /uttavia.

sportare variabili 5na variabile creata co*e quelle dell:ese* io recedente 3 dis onibile soltanto nella shell corrente. Singh" franky ~> bash franky ~> echo $full_name franky ~> exit Ca itolo 3. 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. 6: una buona usanza virgolettare le stringhe quando si assegnano dei valori alle variabili7 ciE ridurr! le ossibilit! di sbagliare. 8e variabili che vengono es ortate sono de)inite co*e variabili a*bientali. CiE 3 di*ostrato nell:ese* io7 franky ~> full_name="Franky M.VARNAME=" alore" 8:inseri*ento di s azi attorno al segno uguale causer! degli errori.3. 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. Per assare variabili ad una sottoshell. abbia*o bisogno di e portarle utilizzando il co*ando integrato e+port. . 8:a*biente di -ash $1 . 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. 6: una variabile locale7 i rocessi )igli della shell corrente non si cureranno di questa variabile. Singh" franky ~> echo $full_name Franky M.2.

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. 2e questo ara*etro 3 de)inito con un no*e di )ile e la variabile MAILPATH non 3 i* ostata. 8a variabile viene *odi)icata er contenere un altro no*e.1. Singh franky ~> 9uando all:inizio si rova a leggere il valore di full_name in una sottoshell. Poi viene avviata una nuova sottoshell in cui 3 visibile la variabile es ortata dalla genitrice.#.franky ~> export full_name franky ~> bash franky ~> echo $full_name Franky M.#. Il valore di questa variabile 3 usato anche er l:es ansione della tilde JZK. In alcuni casi -ash assegna un valore rede)inito alla variabile. 1ariabili riservate della shell Bourne -ash utilizza certe variabili di shell nello stesso *odo della shell -ourne. 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. *a nella genitrice il valore di questa variabile resta lo stesso.2. esso non 3 l! H echo *ostra una stringa vuotaI. 5n elenco di caratteri che se arano dei ca* i7 utilizzato quando la shell suddivide le arole co*e arte di un:es ansione. 8:a*biente di -ash $2 . Singh franky ~> export full_name="Charles the Great" franky ~> echo $full_name Charles the Great franky ~> exit franky ~> echo $full_name Franky M. -ash in)or*a l:utente dell:arrivo di osta nel )ile s eci)icato. 1ariabili riservate 3. 8a directorG ersonale HhomeI dell:utente corrente7 quella rede)inita er l:integrato cd. 3. 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.2.

: 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.2. 8:indice dell:ulti*o argo*ento di o zioni elaborato dall:integrato getopts.2. *a altre shell nor*al*ente non le trattano in *odo s eciale.OPTARG OPTIND PATH PS1 PS2 Il valore dell:ulti*o argo*ento di o zioni elaborato dall:integrato getopts. 8a corrente linea di co*ando. 8a stringa ri*aria dell:invito HpromptI. 2e questa variabile 3 de)inita quando -ash viene invocato er eseguire uno scri t di shell. 8a stringa secondaria dell:invito HpromptI. 8:indice dell:attuale osizione del cursore relativa all:inizio della corrente linea di co*ando. 5n elenco di directorG se arato dai due unti J7K in cui la shell cerca dei co*andi. Il valore rede)inito 3 [:Us<UvU\ :[. arola contenente BASH_ENV BASH_VERSION BASH_VERSINFO COLUMS COMP_CWORD COMP_LINE COMP_POINT COMP_WORDS COMPREPLY Ca itolo 3. 8:intero no*e del ercorso utilizzato er eseguire la corrente richiesta di -ash. 5tilizzata dall:integrato select er deter*inare la larghezza del ter*inale quando si sta* ano elenchi di selezione. Il nu*ero di versione della istanza corrente di -ash. 5n indice all:interno di ${COMP_WORDS} della l:attuale osizione del cursore. 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.#. Il valore rede)inito 3 [:T :[. Tabella 1#. 5na variabile *atriciale a sola lettura i cui ele*enti contengono le in)or*azioni di versione er questa istanza di -ash. 3. 1ariabili riservate di Bash 9ueste variabili sono de)inite od utilizzate da -ash. 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. 8:a*biente di -ash $3 . I* ostata auto*atica*ente in base alla ricezione di un segnale 4)'5)6C7.

5tilizzato er stabilire la categoria delle localizzazioni er tutte quelle categorie non selezionate s eci)icata*ente con una variabile che inizia con LC_. 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. 5na variabile *atriciale che contiene l:elenco dei gru a artiene l:attuale utente. degli sche*i utilizzati er decidere quali linee di co*ando debbano essere salvate nella lista della cronologia.ino a tre carattere che controllano l:es ansione della cronologia. 9uesta variabile scavalca il valore di LANG e di ogni altra variabile LC_ che s eci)ica una categoria di localizzazione. Controlla il co* orta*ento della shell quando riceve un carattere %&co*e unico ingresso. Il valore rede)inito 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. 8:a*biente di -ash . degli sche*i che de)iniscono l:insie*e dei no*i dei )ile da ignorare durante l:es ansione dei no*i. se arato dai due unti J7K. o l:indice nell:elenco della cronologia. suddiviso dai due unti J7K. Il reale I+ nu*erico dell:utente corrente. di solito $((.bash_history. 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. che revale sul rede)inito /etc/inputrc. i a cui . Il no*e del )ile di inizializzazione 'eadline. 5n elenco. Il nu*ero cronologico. del co*ando corrente. Il nu*ero *assi*o di co*andi da ricordare nella lista della cronologia Hil valore rede)inito 3 $((I. Il no*e del corrente host. 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. Il nu*ero *assi*o di linee contenute nel )ile di cronologia. Il no*e del )ile in cui viene salvata la cronologia dei co*andi. 5n elenco. 5na stringa che descrive la *acchina in cui sta girando -ash. 8:editor utilizzato co*e integrato fc. Il no*e di qualsiasi )unzione di shell attual*ente in esecuzione. la sostituzione ra ida e la tokenizzazione. +eter*ina se un co*ando viene aggiunto al )ile della cronologia.

gni volta che si )a ri)eri*ento a questo ara*etro. 2e i* ostata. 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. 8:I+ di rocesso del rocesso genitore della shell.=P1NL< 2L2/6=. 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. 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. -ash *ostra i *essaggi di errore generati dall:integrato getopts. 9uanto s esso Hin secondiI la shell dovrebbe controllare la osta nei )ile s eci)icati nelle variabili MAILPATH o MAIL. nel )or*ato standard 4N5 CP5<C. viene generato un nu*ero casuale co* reso tra ( e 327&7. 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. 5na stringa che descrive il siste*a o erativo in cui sta girando -ash. Il valore di questa variabile 3 utilizzato co*e invito del co*ando select. 2e questa variabile si trova nell:a*biente quando si avvia bash. . e sequenze di racccolta Hcollating e8uence I con es ansione dei no*i di )ile e corris ondenza di sche*i Hpattern matchingI. 1ssegnare un valore a questa variabile seleziona il generatore di nu*eri casuali.2IF. 8a recedente directorG di lavoro i* ostata dall:integrato cd. Il nu*ero di linea nello scri t o nella )unzione di shell attual*ente in esecuzione. 8a directorG corrente di lavoro co*e de)inita dal co*ando integrato cd. 8:a*biente di -ash $$ . 5na stringa che descrive nella sua interezza il ti o di siste*a in cui viene eseguito -ash. er tradurre LC_MESSAGES LC_NUMERIC LINENO LINES 9uesta variabile deter*ina la categoria della localizzazione utilizzata er il )or*ato dei nu*eri. la shell entra in *odalit! P. 5tilizzato dall:integrato select er stabilire la lunghezza della colonna er gli elenchi di selezione di sta* a. 2e i* ostata con il valore 1. MACHTYPE MAILCHECK OLDPWD OPTERR OSTYPE PIPESTATUS POSIXLY_CORRECT PPID PROMPT_COMMAND PS3 PS4 PWD RANDOM Ca itolo 3. 9uesta variabile deter*ina la localizzazione utilizzata stringhe tra do ie virgolette recedute da un segno Q\R. classi di equivalenze.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.

Tabella 1#1: 2ariabili peciali di ba h )arattere $* @efini1ione 6s ansione ai ara*etri osizionali. 9uesti ara*etri ossono essere solo re)erenziati7 un assegna*ento a loro non 3 consentito. Para)etri speciali 8a shell tratta in *odo s eciale diversi ara*etri. 2e in ostata con un valore *aggiore di zero. 8:a*biente di -ash $& . TIMEFORMAT TMOUT UID Controllate le agine *an. se arato dai due unti J7K. 3. 9uesta variabile au*enta con il nu*ero dei secondi da quando 3 stata avviata la shell. iniziando da uno. delle o zioni di shell abilitate. o quelle i* ostate dalla shell stessa Hco*e ad ese* io -iI. 9uando avviene l:es ansione con gli a ici do i. attraverso il co*ando integrato set. 5n elenco. TMOUT viene trattata co*e il timeout rede)inito er la )unzione read. 2i es ande all:I+ di rocesso della shell. in)o o doc di -ash er in)or*azioni estese.REPLY SECONDS SHELLOPTS SHLVL 8a variabile rede)inita er l:integrato read. 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. 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. 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.2. 9uando avviene l:es ansione con gli a ici do i. 1lcune variabili sono di sola lettura. 6s ansione ai ara*etri osizionali.$. 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. iniziando da uno. ciascun ara*etro si es ande in una arola se arata. Incre*entata di uno ogni volta che viene avviata una nuova istanza di -ash. 2i es ande all:I+ di rocesso del co*ando in sotto)ondo HasincronoI eseguito i@ Ca itolo 3. 8:attuale I+ utente nu*erico dell:utente corrente. 6s ansione al nu*ero di ara*etri osizionali in deci*ale.

quest:ulti*i intendono Q\_R. 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. 1$. I ara*etri osizionali sono le arole che seguono il no*e di uno scri t di shell. POSPAR1="$1" POSPAR2="$2" POSPAR3="$3" echo echo echo echo echo "$1 è il primo parametro posizionale.sh uno due tre quattro cinque uno è il primo parametro posizionale. 9uando si controlla la osta. due è il secondo parametro posizionale.7." "$2 è il secondo parametro posizionale. In quasi tutti i casi in cui i rogra**atori usano Q\^R. +i i@ sulla valutazione di questi ara*etri nel Ca itolo 7 e nella 2ezione %. due è il secondo parametro posizionale. $3. AB s. le variabili vengono aggiunte ad una *atrice interna.di recente. \$1. \$2. $0 2i es ande al no*e della shell o dello scri t di shell. Q\^R uE causare errori ed anche )alle nella sicurezza del vostro so)t>are. 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. è il terzo parametro posizionale." $_ Con l:esecuzione uno otrebbe dare un qualsiasi nu*ero di argo*enti7 franky ~> positional. $3. $2. $2. $3 e cosD via. 1$. franky ~> positional. $2." "$3 è il terzo parametro posizionale. questo ara*etro contiene il no*e del )ile di osta.sh uno due uno è il primo parametro posizionale. 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. Il numero totale di parametri posizionali è 5.sh # Questo script legge 3 parametri posizionali e li stampa. 1lcuni ese* i sugli altri ara*etri s eciali7 franky ~> grep dictionary /usr/share/dict/words dictionary Ca itolo 3. co*e viene di*ostrato con questo se* lice scri t7 #!/bin/bash # positional. 8unghe secondo necessit!. 8:a*biente di -ash $7 . Il numero totale di parametri posizionali è 2. $# contiene il nu*ero totale dei ara*etri. tre è il terzo parametro posizionale." "Il numero totale di parametri posizionali è $#. 6ssi sono collocati nelle variabili $1. \$3.

8:a*biente di -ash $" .%. +o o aver *esso un lavoro H jobI in sotto)ondo.log echo backup riuscito >> /home/franky/log/home_backup.tar.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. &iciclo degli script con le variabili 1 arte il rendere i@ leggibile lo scri t. #!/bin/bash # Questo script esegue una copia di salvataggio della mia home directory. Redirige gli errori perché ne vengono # generati alcuni se l'archivio è inesistente. 3. scp /var/tmp/home_franky.tar.bz2 bordeaux:/opt/backup/franky > /dev/null 2>&1 # Crea una marca temporale in un file di registrazione. 8:I+ del rocesso della sua shell 3 1(&&2. uno scri t *olto se* lice che esegue una co ia di salvataggio HbackupI della directorG ersonale di frank! su un server re*oto. Considerate l:ese* io seguente. ! contiene l:I+ del rocesso del lavoro in sotto)ondo. che deter*ina l:assegna*ento della variabile _. Quindi crea un nuovo file compresso. cd /home # Questo crea l'archivio tar cf /var/tmp/home_franky. ? contiene un codice d:uscita diverso da ( HzeroI.tar franky > /dev/null 2>&1 # Per prima cosa rimuove il vecchio file bzip2.bz2 2> /dev/null bzip2 /var/tmp/home_franky. 9uando si co**ette un errore.2. oi carol dovr! e))ettuare abbastanza nu*erose *odi)iche ri*a di oter usare lo Ca itolo 3. le variabili vi consentiranno anche di a licare un scri t in un altro a*biente o er un altro uso. 8a shell in )unzione 3 bash. rm /var/tmp/home_franky. date >> /home/franky/log/home_backup.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.tar # Copia il file in un altro host – abbiamo le chiavi ssh per fare questo lavoro senza # interventi. In secondo luogo su onete che frank! voglia dare il suo scri t a carol.

1.bz2 SERVER=bordeaux REMOTEDIR=/opt/backup/franky LOGFILE=/home/franky/log/home_backup.3. 3. ossono revenire che arole riservate vengano riconosciute co*e tali e sono in grado di disabilitare l:es ansione dei ara*etri. rendete variabili tutti i )ile.3.2. CosD. 3. Ridirige gli errori dal momento che # ne produce alcuni se l'archivio non esiste.tar BZIPFILE=/var/tmp/home_franky.log cd $BACKUPDIR # Questo crea l'archivio tar cf $TARFILE $BACKUPFILES > /dev/null 2>&1 # Per prima cosa rimuove il vecchio file bzip2. ecc. Caratteri di escape Ca itolo 3. 9uesto 3 un ese* io7 #!/bin/bash # Questo script fa una copia di salvataggio della mia directory personale.scri t er salvare altre directorG. date >> $LOGFILE echo salvataggio riuscito >> $LOGFILE @irector. Caratteri tra gli apici 3. # Cambiate i valori delle variabili per far funzionare lo script per voi: BACKUPDIR=/home BACKUPFILES=franky TARFILE=/var/tmp/home_franky.3. 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. no*i server. no*i utente. senza dover scorrere l:intero scri t er controllare dove 3 resente un ara*etro. directorG. Per directorG i@ volu*inose e una larghezza di banda in)eriore. oluminose e banda passante limitata 9uello so ra 3 solo un ese* io che ognuno uE co* rendere. usate rs. usando una iccola directorG e un host sulla stessa sottorete.tar. la di*ensione della directorG e della osizione del server re*oto. 8:a*biente di -ash $% . Per un )acile riciclaggio. esso uE richiedere una inso ortabile quantit! di te* o er eseguire le co ie di salvataggio con questo *eccanis*o. 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. avrete bisogno di *odi)icare un valore er una volta.nc er *antenere le directorG allineate ad entra*bi i ca i. scp $BZIPFILE $SERVER:$REMOTEDIR > /dev/null 2>&1 # Crea una marca temporale in un file di registro. Poi crea un nuovo file compresso. Perché? =olti tasti hanno dei signi)icati s eciali in alcuni contesti. In base alla vostra larghezza di banda.

8:a*biente di -ash &( . 5na barra inversa Hback la hI senza a ici. 2pici doppi 5sando gli a ici do i si conserva il valore letterale di tutti i caratteri. dagli a ici inversi. 6ssa i* edisce il valore letterale del carattere i**ediata*ente successivo. Il ri*o echo *ostra il valore della variabile. 2e un carattere di nuova linea a are subito do o la barra inversa. ``I e la barra inversa. 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. anche se receduto da una barra inversa. viene i* iegata in -ash co*e carattere di esca e. ad eccezione del segno del dollaro.3. dagli a ici do i. ad eccezione della nuovalinea Hne$lineI. 5na virgoletta do ia uE essere tra virgolette do ie )acendola recedere da una 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. le barre inverse vengono tolte dal )lusso in ingresso quando sono seguite da uno di questi caratteri. *a con il secondo il segno del dollaro viene reso con esca e. 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. gli a ici inversi Hvirgolette inverse o backtick O a ici singoli inversi. U.3.I caratteri di esca e si usano er ri*uovere il signi)icato s eciale di un singolo carattere. Con le virgolette do ie. 8a barra inversa conserva il suo signi)icato solo quando 3 seguita dal dollaro. franky ~> echo “$data” 2((2122& franky ~> echo "`data`" Sun Apr 20 11:22:06 CEST 2003 Ca itolo 3. 5n a ice singolo non uE trovarsi tra a ici singoli.3. Il segno del dollaro e gli a ici inversi *antengono il loro s eciale signi)icato con gli a ici HvirgoletteI do i. da barra inversa o da nuovalinea. 3. Continuia*o con l:ese* io recedente7 franky ~> echo '$data' $data 3. 2pici singoli 4li a ici singoli H::I vengono utilizzati er conservare il valore letterale di ogni carattere racchiuso tra di loro.#.

8:a*biente di -ash &1 . tali )ra**enti o arole vengono es ansi o risolti.3&L& o zionale. seguita da un P&4T4C9)PT o zionale. 3.3. In generale +o o che il co*ando 3 stato suddiviso in )ra**enti H tokenI Hv.$. nell:ordine in cui vengono es ansi.3. 1irgolettatura 2 3I8C Parole nella )or*a [\:2/'IN4:[ vengono trattate in *odo s eciale.#. Ci sono otto ti i di es ansione eseguita. +o o tutte le es ansioni. 2ezione 1. 8e sequenze di esca e tra*ite barra inversa si ossono trovare nella docu*entazione di -ash. 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. con es ansione da sinistra a destra.1I.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. il segno dollaro viene ignorato. D. 4li sche*i HpatternI da sotto orre all:es ansione delle gra))e rendono la )or*a di un P9%:. viene eseguita la ri*ozione degli a ici. la sostituzione 3 tra a ici do i.#.1. Ca itolo 3. 2e la stringa viene tradotta e ri* iazzata. . %spansione della shell D.2. 2e la localizzazione corrente 3 QCR o QP. 3. 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.1.franky ~> echo "I'd say: ###BOT_TEXT###quot;Go for it!###BOT_TEXT###quot;" I'd say: "Go for it!" franky ~> echo "###BOT_TEXT###quot; More input>" franky ~> echo "\" \ 3. che trattere*o nelle rossi*e sezioni.%.2.2.2IFR. seguito da una serie di stringhe se arate da virgole tra una co ia di gra))e. 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.

consiste in un nu*ero non receduto da Q]R oR<R. il re)isso della tilde viene sostituito dall:ele*ento corris ondente reso dalla catasta H tackI delle directorG. 6se* io7 franky ~> export PATH="$PATH:~/testdir" ~/testdir sar! es ansa a $HOME/testdir. I risultati di ogni stringa es ansa non vengono riordinati. se i* ostato. la arola viene lasciata i**utata. la Ca itolo 3.3.gni assegnazione di variabile 3 veri)icata er re)issi tilde senza a ici che seguono i**ediata*ente un [7[ o [b[. senza la tilde.#. la tilde viene sostituita dal valore della variabile di shell HOME. Per evitare con)litti con l:es ansione dei ara*etri. 2e il no*e di autenticazione non 3 valido o l:es ansione della tilde )allisce. . 2e quest:ulti*o 3RZ<R. 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. conservando l:ordine da sinistra a destra7 franky ~> echo p{a. 2e i caratteri che seguono la tilde nel re)isso tilde consistono in un nu*ero N. essa 3 sostituita con la directorG ersonale dell:utente che sta utilizzando la shell. il valore della variabile di shell PWD sostituisce il re)isso tilde. cosicché se $HOME 3 /var/home/franky. -ash non a lica alcuna inter retazione sintattica al contesto dell:es ansione o del testo tra gra))e. i caratteri nel re)isso della tilde successivi alla tilde stessa vengono trattati co*e un ossibile no*e er l:autenticazione HloginI. In questo caso viene eseguita anche l:es ansione della tilde. 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 no*e di autenticazione 3 una stringa vuota H null tringI. la stringa Q\aQ non viene considerata co*e soggetta ad es ansione delle gra))e. 2e HOME non 3 i* ostata. . se non c:3 una barra senza a iciI vengono considerati un prefi o della tilde Htilde#prefixI. 2e il re)isso tilde 3 QZ]R. 3. MAILPATH e CDPATH.8e es ansioni delle gra))e ossono essere annidate. 2e nessuno dei caratteri nel re)isso della tilde sta tra degli a ici.e. si intende Q]R. eventual*ente re)issato da un Q]R o un Q<R.i.o. e la shell attribuir! il valore es anso. 2e il re)isso tilde. uno uE usare no*i di )ile con la tilde nelle assegnazioni a PATH. 1ltri*enti il re)isso tilde viene ri* iazzato dalla directorG ersonale associata al no*e di autenticazione s eci)icato. il valore della variabile di shell OLDPWD. +i conseguenza. 8:a*biente di -ash &2 . 9ualsiasi es ansione delle gra))e )or*ata in *odo errato viene lasciata senza *odi)iche. tutti i caratteri )ino alla ri*a barra senza a ici Ho tutti i caratteri. viene sostituito.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.spansione della tilde 2e una arola inizia con un carattere tilde non virgolettato HQZRI.

directorG /var/home/franky/testdir verr! aggiunta al contenuto della variabile PATH. 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. 9uando vengono utilizzate le gra))e.[ co*e no*e della variabile. 8e gra))e sono richieste quando[P1'1=6/'.c[. anche nel caso i@ se* lice. Il no*e o il si*bolo dei ara*etri da es andere ossono essere racchiusi tra gra))e. una sostituzione di co*andi o un:es ansione di ara*etri. dal *o*ento che ca ita tutte le volte. 3. che otrebbe essere inter retata co*e arte del no*e.#.[ stesso.#. Il valore di [aP1'1=6/'.c[ viene sostituito. 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. 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*. 8:a*biente di -ash &3 . che sono o zionali *a servono er roteggere la variabile dall:essere es ansa dai caratteri i**ediata*ente seguenti. 0i sar! sicura*ente )a*iliare l:es ansione diretta dei ara*etri. tra gli altri i ara*etri osizionali. CiE 3 noto co*e e pan ione indiretta Hindirect expan ionI. -ash utilizza il valore della variabile )or*ato dal resto di [P1'1=6/'.[ 3 seguito da un carattere che non deve essere inter retato co*e arte del suo no*e. ossono non essere assegnati in questo *odo. /ale variabile viene oi es ansa e quel valore viene usato nella restante sostituzione. i ara*etri s eciali. 2e il ri*o carattere di [P1'1=6/'. Ca itolo 3.[ 3 un unto escla*ativo. iuttosto che il valore del [P1'1=6/'. 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. 8a )or*a base dell:es ansione dei co*andi 3 [\aP1'1=6/'.[ 3 un ara*etro osizionale con i@ di una ci)ra o ure quando [P1'1=6/'.

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 &&

create uno degli sche*i in GLOBIGNORE con [. a *eno che non sia i* ostata l:o zione di shell dotglob. il carattere della barra deve essere se* re )atto corris ondere es licita*ente. 9uando uno sche*a viene utilizzato er la generazione di un no*e di )ile. 4li argo*enti nulli es liciti H[[[[ o [::[I vengono *antenuti.spansione del no)e dei (ile +o o la sco* osizione delle arole.2 non 3 de)inito o il suo valore 3 esatta*ente [es azioTetabTenuovalineaT[ Hquello rede)initoI. insie*e ad ogni adiacente carattere di s azio bianco di IFS. 8a variabile di shell GLOBIGNORE uE essere utilizzata er restringere l:insie*e dei no*i di )ile che corris ondono allo sche*a. 8:a*biente di -ash &7 . non si esegue la sco* osizione. non avviene alcuna sco* osizione delle arole.[ all:inizio del no*e del )ile o che segue i**ediata*ente una barra inversa deve essere )atto coincidere es licita*ente. ne deriva un argo*ento nullo e viene *antenuto. /uttavia. [?[ e [J[.3. anche quando GLOBIGNORE 3 de)inito. la arola viene ri*ossa.. 8:o zione dotglob 3 disabilitata quando GLOBIGNORE non 3 de)inita. vengono ignorati se* re. 3. In altri casi. 2e l:o zione nullglob 3 de)inita e non esistono corris ondenze.: 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. %spansione e scomposi1ione delle parole 2e l:es ansione non avviene.[ non 3 trattato in *odo s eciale. 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 GLOBIGNORE 3 de)inito. 9ualsiasi carattere nell:IFS che non sia uno s azio bianco di IFS. deli*ita un ca* o. la arola viene ri*ossa.[. 2ezione 2.[ coincideranno.#. 2e 3 i* ostata l:o zione di shell nocaseglob e non ci sono corris ondenze. l:i* ostazione di GLOBIGNORE ha l:e))etto di abilitare l:o zione di shell dotglob. allora qualsiasi sequenza di caratteri IFS serve er deli*itare le arole. e . 2e non si trovano no*i di )ile co*bacianti. 5na sequenza di caratteri di s azio bianco IFS viene considerata anche co*e un deli*itatore. 2e il valore di IFS 3 nullo. 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. il carattere [. 2e co* are uno di questi caratteri. I )ile dei no*i .. la arola viene lasciata senza *odi)iche. e l:o zione della shell nullglob 3 disabilitata. cosicché tutti gli altri no*i di )ile inizianti er [. . a *eno che non sia stata i* ostata l:o zione <) Hv. Per ottenere il vecchio co* orta*ento di ignorare i no*i di )ile inizianti con [. il carattere [.^[.es ansioni in arole su questi caratteri. 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. 9uando un no*e di )ile coincide. allora la arola 3 considerata co*e uno 4C7%. -ash analizza ogni arola alla ricerca dei caratteri [^[.2I. 2e I. ciascun no*e di )ile coincidente che corris onde anche ad uno degli sche*i in GLOBIGNORE 3 ri*osso dalla lista delle coincidenze. Ca itolo 3.. 2e IFS ha un valore diverso da quello base. 2e un ara*etro senza valore viene es anso all:interno di a ici do i.

Ca itolo 3././. viene controllata er vedere se ha un alias.' alias PAGER='less -r' alias Txterm='export TERM=xterm' alias XARGS='xargs -r' alias cdrecord='cdrecord -dev 0.3.' alias .. e -ash non cercher! di es andere ricorsiva*ente il testo di ri* iazzo.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. CiE signi)ica che uno uE creare un alias ls di ls -F.='cd .1.. allora la successiva arola del co*ando che segue l:alias verr! anche controllata er l:es ansione degli alias. franky: ~> alias alias .0 -speed=8' alias e='vi' alias egrep='grep -E' alias ewformat='fdformat -n /dev/fd0u1743.0. er ese* io... *a una arola che 3 identica ad un alias da es andere non viene es ansa una seconda volta.='cd .='cd .. quella arola viene sostituita dal testo dell:alias. 5n altro uso degli alias 3 er correggere degli errori di scrittura. co* resi i *etacaratteri della shell. 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.. 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`. 2e cosD 3. 8a ri*a arola di un testo di ri* iazzo viene controllata er la resenza di alias. .$. 2e l:ulti*o carattere di un valore di alias 3 uno s azio o un carattere tab../..ornite alias senza o zioni er *ostrare un elenco di alias noto alla shell corrente. Il no*e degli alias e il testo di ri* iazzo uE contenere qualsiasi valido dato in ingresso di shell. 8a shell conserva un elenco degli alias che ossono essere de)initi ed eli*inati con i co*andi integrati alias e unalias.. eccetto che il no*e dell:alias non uE contenere [b[... 8a ri*a arola di ogni se* lice co*ando.' alias . 8:a*biente di -ash &" . 2lias 3. se riva di a ici..$.

3. 4li alias vengono es ansi quando viene letto un co*ando.3G Avail 1018M 105M 3. 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. /ale co* orta*ento 3 anche un roble*a quando vengono eseguite delle )unzioni. non quando la )unzione viene eseguita. +i i@ sulle )unzioni nel Ca itolo 11. Ca itolo 3. =entre gli alias sono i@ se* lici da co* rendere. *ettete se* re le de)inizioni degli alias in una riga se arata. 8:a*biente di -ash &% .9G 5. Le fun1ioni sono piJ eloci 4li alias vengono resi in considerazione do o le )unzioni e cosD la risoluzione 3 i@ lenta. 8a shell -ourne HshI non riconosce gli alias. I rocessi )igli non ereditano gli alias. esso viene riconosciuto solo all:interno della shell corrente. +unque.3G 121M 13G 13G 243M 3. franky ~> alias dh='df -h' franky ~> dh Filesystem /dev/hda7 /dev/hda1 /dev/hda2 /dev/hda3 none /dev/hda6 /dev/hda5 Size 1. Per essere sicuri.7G 5.2.2G Used 272M 9.4M 8. Per un uso er*anente.7G 7. 4li alias vengono es ansi quando viene letta la de)inizione di una )unzione. erché la de)inizione di una )unzione 3 essa stessa un co*ando co* osto. inserite l: alias in uno dei vostri )ile di inizializzazione della shell7 se inserite l:alias unica*ente nella riga di co*ando.2G 4. e non utilizzate alias in co*andi co* osti.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. I co*andi che seguono la de)inizione di alias in quella linea non sono in)luenzati dal nuovo alias. a *eno che non venga i* ostata l:o zione expand_aliases *ediante l:integrato di shell shopt. gli alias de)initi in una )unzione non sono dis onibili se non do o l:esecuzione di quella )unzione. +i conseguenza.$. Creazione e ri)ozione degli alias 4li alias si creano usando l:integrato di shell alias.4li alias non vengono es ansi quando la shell non 3 interattiva. le )unzioni di shell sono re)erite in luogo degli alias er quasi ogni sco o. non quando esso viene eseguito.3G 0 3.

2IF7 willy:~/scripts> bash --posix script.2. Possono essere anche incluse nei )ile di con)igurazione delle risorse di shell. sia durante l:o erativit! della shell stessa.%. er abilitare un:o zione. ] er disabilitarla7 willy:~/test> set -o noclobber willy:~/test> touch test willy:~/test> date > test iuttosto Ca itolo 3. 3. 5na quantit! di o zioni ha una scorciatoia da un carattere7 er ese* io. 5sate il trattino O Hda hI.1.3.%. l:o zione xtrace corris onde a set -x. In questa sezione dare*o uno sguardo i@ a ro)ondito alle o zioni di -ash. 6lteriori opzioni di Bash 3. Il seguente co*ando esegue uno scri t in *odalit! co* atibile P. . 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.sh Per *odi)icare te* oranea*ente il corrente a*biente. 8:a*biente di -ash 7( .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. .%. otre**o usare set. sezione 2hell -uilt<in Co**ands<T/he 2et -uilt<in er una descrizione di ogni o zione.pzioni di visualizzazione 1bbia*o gi! trattato di una co ia di o zioni che sono utili er correggere i vostri scri t. o er l:utilizzo in uno scri t.

'. 9uesti )ile contengono o zioni di shell. 2icco*e arecchi caratteri hanno do i o tri li signi)icati in base all:a*biente. 3o))ario 8:a*biente -ash uE essere con)igurato global*ente ed in base al singolo utente. che reviene l:es ansione di caratteri s eciali7 willy:~/testdir> set -o noglob willy:~/testdir> touch * willy:~/testdir> ls -l * -rw-rw-r-. +i seguito un ulti*o ese* io che *ostra l:o zione noglob. er ese* io.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. er ese* io -u. -ash i* iega vari *etodi di es ansione dei dati inseriti nella riga di co*ando er decidere quali co*andi eseguire. che reviene la sovrascrittura dei )ile esistenti da arte di o erazioni di ridirezione. 8o stesso vale er le o zioni a singolo carattere. 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. 1d eccezione dei ara*etri riservati della shell -ourne. de)inizioni di )unzioni e diversi altri blocchi di costruzione er crearci un a*biente con)ortevole. di -ash e quelli s eciali. i no*i delle variabili ossono essere scelti i@ o *eno libera*ente. con uscita di una shell non interattiva quando si incontrano tali errori. i* ostazioni er variabili. Ca itolo 3.1 willy willy 0 Feb 27 13:37 * 3. che tratteranno le variabili non de)inite co*e errore quando de)inite. 2i usano vari )ile di con)igurazione er de)inire in *odo articolareggiato il co* orta*ento della shell. 8:a*biente di -ash 71 . 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. -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.

. Per ri*a cosa eseguire*o alcuni esercizi generali sulla de)inizione e la variabili. o ure in *odalit! video invertito. VAR1. [13[ e [-uon co* leanno[. =ostrate i valori di tutte tre le variabili. 'i*uovete VAR3. VAR2 e VAR3N inizializzatele er tenere ris ettiva*ente i valori [tredici[. re)eribil*ente in un colore vivace co*e il rosso o rosa.sercizi Per questo esercizio dovrete leggere le agine *an di useradd. Potete vedere le restanti due variabili in una nuova )inestra di ter*inale? &.*. che vengono co iati nella directorG ersonale di ogni utente a ena aggiunto. i* ostate l:invito con qualcosa co*e [PericoloVV root sta )acendo cose in U>[. $.3. 2 eri*entate le vostre *odi)iche aggiungendo un nuovo utente ed autenticandovi co*e quello. erché stia*o er usare la directorG /etc/skel er conservare i )ile rede)initi della con)igurazione della shell. 2. Non scordatevi di a licare chmod ai vostri scri tV Ca itolo 3. 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. 8o scri t dovrebbe calcolare la su er)icie di un rettangolo che ha queste *isure. 7. 3. +ovrebbe essere corredato di co**enti e generare dei risultati eleganti. 2crivete uno scri t in cui assegnate due valori interi a due variabili. %. 9ueste sono variabili locali o globali? #. resentazione delle 1. Per l:account root. Create 3 variabili. ". 8:a*biente di -ash 72 . =odi)icate /etc/profile in *odo che tutti gli utenti vengano salutati al *o*ento della autenticazione H rovate questoI.

8a *aggior arte dei caratteri. '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 #.c aN. 8:oggetto che recede 3 o zionale e sar! )atto corris ondere al*eno una volta. 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.spressioni regolari #. 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.=c < Corris onde ad ogni carattere. *a non i@ di = volte. 8:oggetto che recede sar! )atto corris ondere al*eno N volte. 8:oggetto che recede sar! )atto corris ondere da N a i@ volte.1. 8:oggetto che recede sar! )atto corris ondere da una a i@ volte.1.1. ? ^ ] aNc aN. 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 #. 8:oggetto che recede sar! )atto corris ondere esatta*ente N volte. #. co* rese tutte le lettere e le ci)re. . 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 .1. 8:oggetto che recede sar! )atto corris ondere da zero a i@ volte.Capitolo #. 8e es ressioni regolari . Il blocchi )onda*entali er realizzarle sono delle es ressioni regolari che coincidono con un singolo carattere.2.

o ure in qualsiasi altro genere di dati in uscita voi abbiate richiesto con le o zioni. +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. 'a resenta anche i caratteri non co* resi nell:intervallo della lista. 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. [UH[. 2e il bGte )inale di un )ile in ingresso non 3 un nuovalinea. #. g \ Ub UUe UT Corris onde alla stringa vuota all:inizio di una linea. 0eri)icate nella docu*entazione del vostro siste*a se i co*andi che usano es ressioni regolari su ortano le es ressioni estese. +al *o*ento che un nuovalinea 3 ure un se aratore in un elenco di *odelli. Corris onde alla stringa vuota alla )ine di una riga.2. [UX[. Ca itolo #. .intervallo in un elenco.1. il quale invece ha la recedenza sull:alternanza. [H[. e [I[ erdono il loro signi)icato s eciale7 usate invece le versioni con barra inversa [U?[. 8a ri etizione ha la recedenza sul concatena*ento. non c:3 *odo di con)rontare dei caratteri di nuovalinea in 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. gre ne )ornisce uno in *odo tacito. [Ua[. Corris onde alla stringa vuota all:estre*it! di una arola. Corris onde alla stringa vuota alla )ine della arola.2. [][. 2ebbene gre si as etti di eseguire la co* arazione su un testo. e [UI[.spressioni regolari ele)entari contro estese Nelle es ressioni regolari ele*entari i *etacaratteri [?[. Corris onde alla stringa vuota all:inizio della arola. co ia Hdi consuetoI la linea nello standard out ut. [X[.se)pi di utilizzo di grep #. . [U][. +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.3. 5na sottoes ressione intera uE essere racchiusa tra arentesi er scavalcare queste regole di recedenza. #. 8e es ressioni regolari 7# .1. [a[. Corris onde alla stringa vuota )ornita che non 3 all:edge della arola.

bash. Ca itolo #.bash* | grep -v history /home/cathy/.directorG. in *aiuscolo o in *inuscolo. il quale su orta le es ressioni regolari estese.ate attenzione che la ricerca 3 er la tringa [ s[ e non er il comando ps. in *odo da tralasciare i con)ronti con ~/. *a gli acccount con la shell nologin non vengono *ostrati. utilizzando le es ressioni regolari. Poi *ostra i nu*eri di linea contenenti questa stringa di ricerca. 5rep e le espressioni regolari Se non siete su Linu+ Noi usia*o in questi ese* i 4N5 gre . escludendo le coincidenze con la stringa hi tor!. . 8:ulti*o co*ando *ostra le linee da tutti i )ile nella sua directorG ersonale che iniziano con ~/.gnu. 9uindi conta il nu*ero di account che hanno /bin/false co*e shell. #. veri)icate con l:o zione <0 che versione state utilizzando.44m\]$USER is in \w\[###BOT_TEXT###33[0m\] " Con il ri*o co*ando l:utente cath! *ostra dal )ile /etc/passwd le linee contenenti la stringa root.bashrc:PS1="\[###BOT_TEXT###33[1. . Con il terzo co*ando controlla quali utenti non stanno bash.2.org. 4N5 gre uE essere scaricato da htt 7. 2e state lavorando su siste*i ro rietari.2.bash_history che otrebbe contenere la *edesi*a stringa.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 ~/.. 8e es ressioni regolari 7$ .ra vedia*o che cos:altro ossia*o )are con gre . 4N5 gre 3 di base nei siste*i 8inuA..

saranno *ostrate tutte le linee dalla tabella del )ile sGste*. allora co* arer! qualsiasi carattere N. Per ottenere l:inter retazione tradizionale delle es ressioni regolari. #. UT corris onde alla )ine di una arola. 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. utilizzando la sequenza di con)ronto e l:insie*e dei caratteri del singolo siste*a. cathy ~> grep [yf] /etc/group sys:x:3:root. Per ese* io. 1ll:interno di un:es ressione tra arentesi.bashrc | grep '###BOT_TEXT###lt;PATH' export PATH="/bin:/usr/lib/mh:/lib:/usr/bin:/usr/local/bin:/usr/ucb:/usr/dbin:$PATH" In *aniera si*ile.#.2. una e pre ione di intervallo 3 )or*ata da due caratteri se arati da un trattino. in *odo da non *ostrare MANPATH e d altri ossibili ercorsi7 cathy ~> grep export ~/. Classi di caratteri 5na e pre ione tra parente i 3 un elenco di caratteri racchiusi tra [J[ e [K[. In)ine.1.postfix ftp:x:50: Ca itolo #.[g[. selezionate ri*a le linee [eA ort[ e oi cercate quelle che iniziano con la stringa [P1/B[. otete usare l:a*biente C i* ostando la variabile a*bientale LC_ALL con il valore [C[.N resente in esso. nello s eci)ico a*biente C.2. 6ssa )a corris ondere ogni singolo carattere co* reso tra i due caratteri non esclusi. 6ssa con)ronta ogni singolo carattere di quella lista7 se il ri*o carattere dell:elenco 3 l:accento circon)lesso.bashrc. 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. 8e es ressioni regolari 7& . [Ja<dK[ 3 equivalente a [JabcdK[.2. 2e volete trovare una stringa che sia una arola se arata Hracchiusa tra s aziI.adm tty:x:5: mail:x:12:mail. 3 *eglio utilizzare la -w. 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 ~/. 0edete il *an di grep o le agine in)o er *aggiori in)or*azioni su tali es ressioni rede)inite. Per ese* io. l:es ressione regolare [J(123#$&7"%K[ con)ronta ogni singola ci)ra.2.bin. =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[.2. certe classi deno*inate di caratteri sono rede)inite all:interno delle es ressioni tra arentesi.

usate degli a ici singoli.[ er la corris ondenza di un solo carattere. usate l:asterisco.h###BOT_TEXT###gt;' /usr/share/dict/words catch clash cloth coach couch cough crash crush 2e volete *ostrare le linee contenenti il carattere letterale unto. 9uesto ese* io seleziona tutte le arole che iniziano con [c[ e ter*inano con [h[ nel dizionario di siste*a7 cathy ~> grep '###BOT_TEXT###lt;c.. 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 '###BOT_TEXT###lt;c. 9etacaratteri @wildcardA 5sate il [. cosa che non restituisce alcuna linea.2.d/*.sh . Co)parazione dei )odelli utilizzando le (unzionalit" di Bash . 8e es ressioni regolari 77 . do #. ci sono *olte co* arazioni di *odelli che otete eseguire diretta*ente nella shell senza dover ricorrere ad un rogra**a esterno. usate l:o zione -F con grep.3. 5sando gli a ici viene rodotto un risultato7 cathy ~> grep * /etc/profile cathy ~> grep '*' /etc/profile for i in /etc/profile.1. Per co* arare *olte lici caratteri. Inter!alli dei caratteri 1 arte grep e le es ressioni regolari.. Nell:ese* io seguente CathG ri*a rova a trovare il carattere asterisco in /etc/profile senza usare gli a ici.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 [)[.*h###BOT_TEXT###gt;' /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.3.3. Ca itolo #. #.2.

vengono riconosciuti diversi o eratori estesi di co* arazione dei *odelli. [blan?[. [s ace[. Ca itolo #. Classi di caratteri 8e classi di caratteri si ossono s eci)icare all:interno delle arentesi quadre utilizzando la sintassi J7C81227K. se le co ie di caratteri sono se arati da un trattino. [lo>er[. [cntrl[. [ unct[. [u er[.[b[. 8e es ressioni regolari 7" . 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. #.Co*e gi! sa ete. 8eggete di i@ nelle agine in)o di -ash. [>ord[ o [Adigit[. sezione -asic shell )eatures<T2hell 6A ansions<T. 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!. [ rint[. [A[. [ascii[. 2e il ri*o carattere tra arentesi 3 [V[ o [g[.0/ 997376 Apr 18 15:39 Schedule.3.2IF ed ha uno dei valori [alnu*[. [digit[. se i* ostata. [G[. 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. )orzatene questo co* orta*ento i* ostando LC_COLLATE o LC_ALL a [C[. 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. includetelo co*e ri*o o ulti*o carattere dell:insie*e. verr! co* arato qualsiasi carattere non incluso. o [z[. '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.ilena*e 6A ansion<TPattern =atching. [gra h[. iniziando da [a[.2.sdc 9uando 3 attiva l:o zione di shell extglob Hutilizzando l:integrato shoptI. 8:ordina*ento di ende dall:a*biente corrente e dal valore della variabile LC_COLLATE. [al ha[.org1. Per con)rontare il trattino H[<[I. dove C8122 3 de)inita nello standard P. [c[. 2e volete essere sicuri di avere l:inter retazione tradizionale degli intervalli.

sercizi 9uesti esercizi vi aiuteranno a adroneggiare le es ressioni regolari. Per ora otete s eci)icare il no*e utente nello scri t. elencate le unit! disco locali. 8e es ressioni regolari 7% . =ostrate i )ile di con)igurazione in /etc contenenti nu*eri nei loro no*i. che 3 )onda*entale in qualsiasi a*biente 5NIF. $. . il database Postgre298 e cosD via. 8a versione 4N5 di grep giunge con dovizia di docu*entazione. utilizzando grep. 3o))ario 8e es ressioni regolari sono degli stru*enti otenti er selezionare delle linee articolari dai )ile o dai dati in uscita. 11. 9ueste sottodirectorG quanti )ile README contengono? Non contate nulla che abbia la )or*a di ['61+=6. Potete trovare un:alternativa a -c -1 utilizzando grep? 5sando la tabella del )ile sGste* H er ese* io. ". 2. il nu*ero di linee che soddis)ano la stringa di ricerca e contate quante volte ricorre la stringa. #.#. che siete calda*ente consigliati di leggereV -ash ha delle )unzionalit! integrate er co* arare *odelli e uE riconoscere classi e intervalli di caratteri. =ostrate un elenco delle sottodirectorG /usr/share/doc contenenti in)or*azioni sulla shell. #. Ca itolo #. 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. &. 1.unaMstringa[. Per ese* io.ate un elenco dei )ile della vostra directorG ersonale che sono stati *odi)icati *eno di 1( ore )a. 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.$. 12. le es ressioni regolari sono utilizzate nel )oglio elettronico 6Acel che viene )ornito con la suite =icroso)t Cindo>s . . 2ta* ate tutte le linee dallo stesso )ile che non contengono la stringa recedente. In questo ca itolo abbia*o reso con)idenza con il co*ando grep. =ostrate un elenco di tutti gli utenti nel vostro siste*a che si sono autenticati con la shell -ash co*e rede)inita. =ettere questi co*andi in uno scri t di shell che generi dei risultati co* rensibili. 1(. %. =olti co*andi 5NIF usa es ressioni regolari7 im. =ostrate le in)or*azioni di localhost dal )ile /etc/hosts. 7. 'ealizzate uno scri t che veri)ichi se un utente esiste in /etc/passwd. etc/fstabI. 3. non dovete lavorare con argo*enti e condizioni in questa )ase.))ice. +alla directorG /etc/group/ *ostrate tutte le linee che iniziano con la stringa [dae*on[. perl.#. *a tralasciando le directorG.

sed 3 di grande aiuto.2. /ale caratteristica consente di utilizzare dei co*andi di *odi)ica negli scri t. 9uando si resenta la necessit! di sostituire del testo in un grande nu*ero di )ile. 3 la sua ca acit! di )iltrare testi che riceve da )onti di incanala*ento. CiE che distingue sed da altri editor. 8:editor non *odi)ica gli originali dati in ingresso. Il risultato viene inviato allo standard out ut. 2ezione #.1. Non vi serve interagire con l:editor *entre sta )unzionando7 questo 3 il *otivo er cui sed talvolta viene de)inito un batch editor. 8a sintassi del co*ando sed non ha s eci)iche di un )ile in uscita. se* li)icando enor*e*ente i co* iti ri etitivi di revisione. I co*andi di *odi)ica sono si*ili a quelli usati nell:editor i7 Ca itolo $. *a i risultati si ossono salvare in un )ile utilizzando la redirezione dei dati in uscita.Capitolo $.1. )ate ri)eri*ento alle agine in)o e *an di sed. 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. $.1. Per in)or*azioni dettagliate. 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. Introduzione $. co*e i e ed.2.1. $. 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. 8:editor di )lussi 4N5 sed "( .

2. otete assegnare delle o zioni a sed. &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. Ca*bia HchangeI il testo nella linea corrente con quello nuovo. 2ta* a HprintI il testo. Inserisce Hin ertI il testo al di so ra della linea corrente. Nella tabella successiva c:3 una anora*ica7 Tabella =#. in questo caso Ca itolo $. 9odi(ica interattiva $. 8egge HreadI un )ile. 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. Tutti questi erori mi fanno impazzire. Cancella HdeleteI il testo. 0oglia*o sed er trovare le linee che contengono il nostro *odello di ricerca. Così tanti erori. *a non otreste eseguire un [trova e sostituisci[ utilizzando tale co*ando.2. 8:editor di )lussi 4N5 sed "1 . Molti erori. 2crive H$riteI in un )ile. E' un testo con erori. Questa è una linea che non contiene errori. 1ggiunge i co*andi contenuti nel )ile 2C'IP/<. 2ta* a le in)or*azioni sulla versione ed esce. 'icerca H earchI e sostituisce un testo.Tabella =#1 ) comandi di ed per la modifica )omando aU cU d iU r s > Fisultato 1ggiunge HappendI del testo sotto la linea corrente. 3ta)pa delle linee contenenti un )odello 9uesto 3 qualcosa che otreste )are con grep. 1 arte la *odi)ica dei co*andi. =odo silenzioso. CiE 3 solo er iniziare.I86 all:insie*e dei co*andi da )ar )unzionare *entre si stanno elaborando i dati in entrata. $. 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. Questa è l'ultima linea.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 "#

sh #!/bin/bash # Questo è un semplice script che potete usare per convertire testi in HTML. 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 $.3. 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.sh test conversione test.sed 1i\ <html>\ <head><title>html generato da sed</title></head>\ <body bgcolor="#ffffff">\ <pre> $a\ </pre>\ </body>\ </html> sandy ~> cat txt2html." SCRIPT="/home/sandy/scripts/script... in modo che avvenga solo una volta # l'aggiunta." sandy ~> $1 contiene il ri*o argo*ento di un dato co*ando. 8:editor di )lussi 4N5 sed "$ .. sandy ~> cat script. sandy ~> txt2html. poi sostituiamo i nuovelinea.$PID.sed" NAME="$1" TEMPFILE="/var/tmp/sed. echo "conversione $1. 3crittura dei (ile dei dati in uscita 8a scrittura dei dati in uscita HoutputI si esegue utilizzando l:o eratore di redirezione di uscita >. togliamo tutti i caratteri di nuovalinea. $. # Primo. le linee )iniscano con una barra inversa. 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.tmp" sed "s/\n/^M/" $1 | sed -f $SCRIPT | sed "s/^M/\n/" > $TEMPFILE mv $TEMPFILE $NAME echo "finito.2. tutte.• quando si aggiunge o sostituisce un testo.. tranne l:ulti*a.

3. )atelo recedere da una linea co*e [<<9uesto 3 un collega*ento si*bolico<<[. =ettete il risultato in un )ile te* oraneo. Create uno scri t che *ostri le linee contenenti degli s azi bianchi da un )ile. Cancellate le ri*e 3 linee di ogni )ile te* oraneo. CiE uE risultare di grande aiuto se tendete a di*enticare barre inverse e si*ili. 0iene utilizzato s esso er eseguire delle o erazioni cerca<e<sostituisci su linee contenenti un *odello.$. Create un )ile contenente i co*andi di sed er eseguire i due co* iti recedenti. Create un )ile contenente co*andi di sed che veri)ichino collega*enti si*bolici e )ile nor*ali. CiE lo rende adatto ad un uso non interattivo. 2. &.#. Ca itolo $. 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. 2e un )ile 3 un collega*ento si*bolico.. aggiungete una stringa nella stessa linea con un co**ento co*e [e<<< questo 3 un )ile nor*ale[. 8:editor sed usa co*andi si*il< i ed accetta es ressioni regolari. con su orto della evidenziazione della sintassi.sandy ~> 9uesto non 3 co*e dovrebbe essere )atto in realt!7 tale ese* io di*ostra sola*ente delle ca acit! di sed. 7. $.usr. 4uardate la 2ezione &.3 er una soluzione i@ decente di questo roble*a. 8o stru*ento sed uE leggere co*andi da linea di co*ando o da uno scri t. 2ta* ate nell:uscita standard soltanto le linee contenenti il *odello [an[.bin che hanno la lettera [a[ co*e secondo carattere. sono in grado di riconoscere la sintassi di sed.ate un elenco dei )ile in . 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[. sed facile 4li editor avanzati. 2ta* ate un elenco delle linee nella vostra directorG scripts ter*inanti con [.sh[. $.viene usato co*e dato in ingresso. . 'icordatevi che otreste dover togliere l:alias a ls. $. 9uesto scri t dovrebbe utilizzare uno scri t sed e *ostrare delle in)or*azioni sensate all:utente. utilizzando i costrutti 3%')6 e %6D di a-!. 5n lungo elenco della directorG radice. Controllate i risultati. . =ettete il risultato in un )ile te* oraneo.sercizi 9uesti esercizi sono diretti a di*ostrare ulterior*ente cosa sed uE )are. 1. . 8:editor di )lussi 4N5 sed "& . 2e il )ile 3 un nor*ale )ile. #.

+al *o*ento che il rogra**a a-! 3 s esso solo un lin? a ga-!. Cosa signi)ica vera*ente? Ca itolo &. un altro di))uso editor di )lussi. 8a )unzione basilare di a-! 3 di cercare nei )ile linee od altre unit! di testo contenenti uno o i@ *odelli. Per tale *otivo i rogra**i a-! sono s esso iacevoli da leggere e scrivere. Il linguaggio di rogra**azione 4N5 a>? "7 . Cos74 gaBC? 4a>? 3 la versione 4N5 del rogra**a 5NIF co*une*ente dis onibile a-!. 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.Capitolo %.1. %. vengono eseguite delle s eciali azioni su quella linea. 9uando una linea corris onde ad uno dei *odelli.1. 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. sono stati scritti libri interi sulle varie versioni di a-!. 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. 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>?[. di solito 3 i@ di))icile descrivere chiara*ente i dati che il vostro rogra**a elaborer!. 9uando si lavora con linguaggi rocedurali. noi )are*o ri)eri*ento ad esso co*e a-!.1. Introduzione a gaBC %.

2I 9uesta variabile 3 rede)inita er essere di uno o i@ s azi o tabulazioni. $3. 8a variabile $0 HzeroI contiene il valore dell:intera linea. terzo )ino all:ulti*o ca* o di una linea in ingresso.2. 2ezione &. 3ta)pa di ca)pi selezionati Il co*ando print in a-! e*ette dei dati selezionati dal )ile in ingresso. I loro no*i erano 1ho.gni regola recisa un solo *odello da cercare ed una o erazione da eseguire nel *o*ento in cui si riscontra il *odello. 2e il rogra**a 3 breve.1. Il progra))a print %. 8e variabili $1.3. Presero il ri*o carattere di ciascuno dei loro no*i e li *isero assie*e. …. $N contengono i valori del ri*o. 9uando a-! legge una linea di un )ile. 3 i@ se* lice lanciarlo da linea di co*ando. s eci)icate un programma a-! che dice ad a-! cosa )are.1. CosD il no*e del linguaggio avrebbe otuto essere stato tuttal i@ [>a?[. condizioni ed altri costrutti di rogra**azione. Il linguaggio di rogra**azione 4N5 a>? "" . $2.2. Il rogra**a consiste in una serie di regole Hrule I7 uE anche contenere de)inizioni di )unzioni.2. I comandi di ga#$ 9uando )ate girare a-!. 9uesto otrebbe a arire cosD7 a>? -f FILEPROGRAMMA fileiningresso %. dove vedia*o sei colonne in uscita del co*ando df7 Ca itolo &./e* o )a negli anni :7( tre rogra**atori decisero di creare questo linguaggio. . )unzionalit! avanzate che er ora ignorere*o. Sernighan e Ceinberger. secondo. cicli. ". CiE viene illustrato nella i**agine successiva. Ci sono diversi *odi er avviare a-!. 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.

il no*e del )ile. quest:ulti*i a arirebbero Ca itolo &.2.-igura >#1/ Campi in a$k Nei dati in uscita di ls -l. di solito uno s azio. Il linguaggio di rogra**azione 4N5 a>? "% . che contiene la di*ensione dei )ile. )onfigura1ione locale Notate che la con)igurazione dei dati in uscita del co*ando ls 'l otrebbe essere di))erente nel vostro siste*a. ". In tal caso il carattere se aratore di uscita rede)inito.sh kelly@octarine ~/test> 9uesto co*ando ha sta* ato la quinta colonna di un lungo elenco di )ile.sed 120temp_file 126test 120twolines 441txt2html. verr! inserito tra ciascun ca* o in uscita. utilizzando solo il se aratore dei dati in uscita. ci sono % colonne. 8a resentazione di ora e data di ende dalle vostre i* ostazioni d:a*biente. Formattare i campi 2enza )or*attare. 9uesti dati in uscita non sono *olto leggibili a *eno che utilizziate il *odo u))iciale di ri)eri*ento alle colonne.2. che 3 quello di se arare con una virgola quelle che volete sta* are. e l:ulti*a colonna. 8:istruzione print usa questi )ile nel *odo seguente7 kelly@octarine ~/test> ls -l | awk '{ print $5 $9 }' 160orig 121script.

Potete estrarre qualsiasi nu*ero di colonne ed anche invertirne l:ordine. 0iene e*essa una lunga lista che *ostra la quantit! totale dei blocchi nella directorG quando l:argo*ento 3 una directorG. 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.sh kelly@octarine ~/test> . 8:utilizzo della barra inversa consente anche la co ia e l:incollaggio delle linee so rastanti in una )inestra di ter*inale. il vostro *onitor non lo 3. segni del dollaro ed altri *etacaratteri dovrebbero essere resi con l:esca e di una barra inversa. 1ggiungia*o ure l:o zione -d er la *edesi*a ragione.sservate l:uso della barra inversa. 0. Il linguaggio di rogra**azione 4N5 a>? %( .2.3. %. 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.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.3. e certa*ente non lo 3 neanche la carta sta* ata.iuttosto scarni. Inserendo una co ia di tabulazioni e una stringa er indicare che ti o di dati sono questi. 8a barra inversa in questo ese* io segna la continuazione di una linea. 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. nel caso l:asterisco si es anda ad una directorG. 9uesta linea ci 3 inutile.2. 8:o zione -h con ls viene usata er )ornire dei )or*ati di*ensionali u*ana*ente leggibili er i )ile i@ grandi. 2ezione 3. Il co)ando print e le espressioni regolari Ca itolo &. quindi aggiungia*o un asterisco. =entre i vostri dati in ingresso nella linea di co*ando ossono essere di lunghezza virtual*ente illi*itata.

il secondo 3 sotto esca e erché )a arte di una stringa da ricercare Hla )ine del no*e del )ileI. 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% /.conf xinetd.conf$/ { print $9 }' amd. Il linguaggio di rogra**azione 4N5 a>? %1 .conf antivir. ".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.5na es ressione regolare si uE usare co*e *odello includendola tra barre.conf xinetd.etc dei )ile che ter*inano er [.conf xcdroast.con)[ ed iniziano o con [a[ o con [A[. oiché hanno un signi)icato s eciale er il rogra**a in a-!.vol1 : 8% kelly is in ~> oi 4li a ici devono essere sotto esca e. signora? kelly is in /etc> Ca itolo &.conf antivir.conf$/ { print $9 } END { print \ "Posso fare qualcosa ancora per lei.conf xcdroast.conf xcdroast. .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 '/###BOT_TEXT###lt;[a|x].conf xinetd. 6ssa viene controllata ris etto al testo intero di ogni record. signora?" }' amd. %odelli speciali Per )ar recedere l:e*issione da co**enti.*\. +i sotto un altro ese* io in cui cerchia*o nella directorG .*\. utilizzando le es ressioni regolari estese7 kelly is in /etc> ls -l | awk '/###BOT_TEXT###lt;(a|x).2.*\.conf$/ { print $9 }' File trovati: amd.conf antivir.conf Posso fare qualcosa ancora per lei. utilizzate l:istruzione B%GI?N kelly is in /etc> ls -l | \ awk 'BEGIN { print "File trovati:\n" } /###BOT_TEXT###lt;[a|x].

2. ecc. seguiti da un altro nu*ero e segno di ercentuale. altre a sola lettura.2. 8a sua sintassi 3 riconosciuta dalla *aggioranza degli editor che eseguono l:evidenziazione della sintassi er altri linguaggi. Il se aratore di ca* i viene ra resentato nella variabile integrata FS.awk BEGIN { print "*** ALLARME ALLARME ALLARME ***" } /###BOT_TEXT###lt;[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. Notate che questa 3 un o: diversa dalla variabile IFS usata dalle shell aderenti a P. 2ezione &.. 5no scri t a-! contiene istruzioni in a-! che de)iniscono *odelli ed azioni. Il valore della variabile del se aratore di ca* i uE essere ca*biata nel rogra**a in a-! con Ca itolo &. % iden1ia1ione della sintassi 1>? 3 un linguaggio di rogra**azione.. Il separatore di ca)pi i))essi Il eparatore di campi.2IF.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. 2i aggiunge un *essaggio )inale. Co*e illustrazione. kelly is in ~> cat diskrep. co*e C. realizzere*o un ra orto che *ostri le nostre artizioni i@ iene. 5li script in gaBC Non a ena i co*andi tendono ad essere un o: i@ lunghi. -ash. Le variabili di gaBC =entre a-! sta elaborando il )ile i**esso. 0.3. che uE essere sia un singolo carattere sia un:es ressione regolare. %. 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. otreste desiderare di *etterli in uno scri t.1. B/=8. usa diverse variabili.2. controlla il *odo in cui a-! s ezzettata in ca* i un record i**esso. in *odo da riutilizzarli. %.$. 1lcune sono *odi)icabili.3. oi )or*atta tutte le linee che contengono un otto o un nove all:inizio di una arola.%. Il linguaggio di rogra**azione 4N5 a>? %2 .

2. Nell:ese* io sottostante. 1nt>er . otrebbe a arire co*e questo7 kelly is in ~> cat printnames. Il separatore dei ca)pi in e)issione Nor*al*ente i ca* i sono se arati da s azi nell:e*issione..1. dove gli argo*enti vengono se arati da virgole7 Ca itolo &. Cong.awk BEGIN { FS=":" } { print $1 "\t" $5 } kelly is in ~> awk -f printnames. Cong. Il se aratore dei ca* i in ingresso rede)inito 3 uno o i@ s azi bianchi o tabulazioni. 2e necessario. cosicché ro rio il ri*o record viene letto con il corretto se aratore.awk /etc/passwd --output omitted-- 2cegliete con attenzione il ca* o di i**issione er evitare roble*i. 2 esso il *o*ento giusto er )are ciE 3 all:inizio dell:esecuzione ri*a che qualsiasi i**issione sia stata elaborata. 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. usate un a-! o sed eAtra er uni)or*are i )or*ati di i**issione dei dati. 2(((F[ Il vostro a-! )ornir! un:e*issione errata er questa linea. I separatori di e)issione %. Per )are questo. %. Il linguaggio di rogra**azione 4N5 a>? %3 . &# hoo 2t. 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. usate il *odello s eciale B%GI?. eddy Eddy White willy William Black cathy Catherine the Great sandy Sandy Li Wong kelly is in ~> In uno scri t a-!. 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. CiE diventa chiaro quando usate la sintassi corretta er il co*ando print.3. Ph+.3..l:o eratore di assegnazione b. &# hoo 2t. 1nt>er .2.

print tratter! le voci in uscita co*e un solo argo*ento. l:e*issione del rogra**a avviene tutta insie*e su una linea singola. Il separatore dei record in uscita 8:e*issione di un a intera istruzione print 3 chia*ata record in u cita. o*ettendo cosD l:uso del eparatore di emi ione rede)inito.3.o ure in ciascun record di e*issione7 kelly@octarine ~/test> cat processed. Il linguaggio di rogra**azione 4N5 a>? %# . assegnate nuovi valori a OFS ed a ORS7 kelly@octarine ~/test> awk 'BEGIN { OFS=". OFS. %. Il valore rede)inito di questa variabile 3 [Un[.$2}' test record1.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.2. ORS="\n--> fatto\n" } { print "Record numero " NR ":\t" $1. . %. Il nu)ero di record 8:integrato NR contiene il nu*ero dei record che vengono elaborati." .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. un carattere di nuovalinea. $2}' test record1 data1 record2 data2 kelly@octarine ~/test> 2e non *ettete le virgole.data2 --> kelly@octarine ~/test> 2e il valore di ORS non contiene un 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. 8o otete utilizzare alla )ine er contare il nu*ero totale dei record.awk BEGIN { OFS="-" . 9ualsiasi stringa di caratteri uE essere utilizzata co*e se aratore di ca* i in e*issione i* ostando questa variabile integrata.2.$2 } END { print "Numero di record elaborati: " NR } Ca itolo &. ORS="\n-->\n" } \ { print $1. ORS. 0iene incre*entato do o la lettura di una nuova linea di i**issione.data1 --> record2.3.

%.2 diviene *olto i@ se* lice quando usia*o uno scri t a-!7 kelly@octarine ~/html> cat make-html-from-text. il valore della variabile 3 qualsiasi valore sia stato assegnato er ulti*o.awk test Record numero 1: record1-data1 --> fatto Record numero 2: record2-data2 --> fatto Numero di record elaborati: 2 --> fatto kelly@octarine ~/test> %.awk { totale=totale + $5 } { print "Inviare conto per " $5 " dollari a " $4 } END { print "---------------------------------\nTotale entrate: " total } kelly@octarine ~> awk -f totale. Il contenuto dei )ile da i**ettere uE anche essere assegnato alle variabili. otete de)inirne di ro rie. Il linguaggio di rogra**azione 4N5 a>? %$ . I valori ossono essere assegnati diretta*ente utilizzando l:o eratore b.#.kelly@octarine ~/test> awk -f processed. 9uando a-! incontra un ri)eri*ento ad una variabile che non esiste Hche non 3 redeter*inataI. 6lteriori ese)pi 8:ese* io della 2ezione $. 1ariabili de(inite dall7utente 1 arte le variabili integrate.3. Per tutti i ri)eri*enti successivi.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.3.$. 8e variabili ossono essere un valore nu*erico o stringa.awk BEGIN { print "<html>\n<head><title>HTML generato da awk</title></head>\n<body bgcolor=###BOT_TEXT###quot;#ffffff###BOT_TEXT###quot;>\{ 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. viene creata la variabile ed inizializzata co*e stringa vuota. 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.html Ca itolo &.

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.3. CiE si )a )ornendo una stringa.%. anche er i reali autori dei rogra**i che usano tali linguaggi. 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. 8a sintassi 3 la stessa dell:istruzione printf del linguaggio C7 v. statistiche ed altre o erazioni sul )lusso dei dati i**essi. 1ltre cose che dovreste conoscere di a-!7 • Il linguaggio resta ben conosciuto su 5NIF e si*ili. se sta* are un segno e quante ci)re sta* are do o la virgola deci*aleI. 3o))ario Il rogra**a di utilit! ga-! inter reta un linguaggio di rogra**azione dagli sco i s eciali. 8a dichiarazione al volo di variabili 3 diretta e consente se* lici calcoli di so**e. 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. la vostra guida introduttiva del C. 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. 8e agine in)o di ga-! contengono s iegazioni esaurienti. se sta* are un es onente. In altri ter*ini. utilizzate printf.accia*o di nuovo ri)eri*ento alla directorG contenente gli initscri t nel vostro siste*a. • 2ia Perl che a-! condividono la re utazione di essere inco* rensibili. 6: la versione libera del generale co*ando a-! di 5NIF. che controlla co*e e dove sta* are gli altri argo*enti. PerciE docu*entate il vostro codiceV Ca itolo &. 0ariabili e co*andi si ossono inserire negli scri t a-! er l:elaborazione di sotto)ondo Hbackground proce ingI.d/* %.%sempi di a-! nel ostro sistema . Perl 3 i@ di))icile da a rendere. Il linguaggio di rogra**azione 4N5 a>? %& . gestendo delle se* lici *ansioni di ri)or*attazione dei dati con a ena una *anciata di linee di codice. /uttavia a-! ha una curva di a rendi*ento i@ accentuata Hsigni)ica che i* arate *olte cosa in un te* o iuttosto ristrettoI. %.#. chia*ata tringa di formato. *a er l:esecuzione di co* iti si*ili ora si utilizza i@ )requente*ente Perl.

Ca itolo &. scrivere uno scri t -64IN e 6N+ er co* letare la tabella o ure )atelo in B/=8. dc=esempio. mail -s Uso spazio su disco <voi@vostro_comp> < risultatoI. 1. Per ri*a cosa eseguite i co*andi da linea di co*ando. 2e tutto si di*ostra )unzionante. 8o scri t dovrebbe creare un:e*issione sensata Hsensate er essere letta dal ca oI. Il linguaggio di rogra**azione 4N5 a>? %7 . 9uindi inseriteli in uno scri t. create lo scri t er la artizione /7 questa 3 resente in ogni siste*a 5NIFI.sercizi 9uesti sono alcuni ese* i ratici in cui a-! uE essere utile. er ese* io. usate tale in)or*azione. 'ealizzate uno scri t -ash. 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. 2e il de*one quota 3 in )unzione. se sa ete qualcosa di F=8. altri*enti usate find. 2. 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 </entry> </row> In aggiunta.%. 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. 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.$. )ate in *odo che lo scri t vi invii un *essaggio elettronico con i suoi risultati Hutilizzate. dc=com cn: Nome Cognome sn: Cognome numerotelefonico: Numero telefonico Create un )ile contenente una co ia di record di rova e controllate. . utilizzando a-! e i co*andi standard di 5NIF.

2e l:argo*ento FILE di una sola delle ri*itive 3 nella )or*a /dev/fd/N.then. Istruzioni condizionali %" . se nessuna delle condizioni testate 3 vera.1. Introduzione a i( '.else  i costrutti if. Istruzioni condizionali In questo ca itolo discutere*o dell:uso delle condizioni negli scri t -ash. se il suo stato di ritorno 3 zero. 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. allora viene veri)icato il descrittore di )ile [N[. stdout e stderr e i loro ris ettivi descrittori di )ile ossono essere utilizzati er controlli. 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.then.elif. 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. Il costrutto if vi er*ette di s eci)icare tali condizioni. viene eseguito anche l:elenco dei )GQ7?@I')G?S%GK%?TI.else  l:utilizzo e la rova dei ara*etri osizionali  le istruzioni if annidate  le es ressioni booleane  l:uso delle istruzioni case '. 2 esso si usano le es ressioni unarie er esa*inare lo stato di un )ile. )GQ7?@I'T%ST i* lica s esso test di con)ronti nu*erici o stringa.1. *a uE essere anche qualsiasi co*ando che restituisce uno stato zero quando ha successo e qualche altro stato quando )allisce.Capitolo '. 1nche stdin. Ca itolo 7.1. 8o stato di rientro Hreturn tatu I 3 lo stato di uscita dell:ulti*o co*ando eseguito o zero.

0ero se FILE esiste ed 3 eseguibile. 0ero se FILE esiste ed 3 un )ile regolare. 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.+ 3 a erto e si ri)erisce ad un ter*inale. 0ero se FILE esiste ed 3 leggibile. o se FILE1 esiste e FILE2 no. Istruzioni condizionali . 0ero se . ure o ure se FILE2 esiste e 0ero se FILE1 e FILE2 si ri)eriscono alla stessa unit! e nu*eri di inode.I.1. named pipe H.1. 0ero se FILE esiste ed il suo bit stic?G 3 i* ostato.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. 0ero se FILE1 3 i@ vecchio di FILE2. o FILE1 no. 0ero se FILE esiste ed 3 scrivibile. 0ero se FILE esiste ed 3 un incanala*ento no*inato. 9ueste ri*itive sono *esse tra arentesi quadre er indicare la veri)ica di un:es ressione condizionale. . 0ero se FILE esiste ed 3 una directorG.I86 esiste ed 3 uno s eciale )ile a blocchi. 0ero se il descrittore di )ile . 0ero se 3 abilitata l:o zione di shell [. 0ero se FILE esiste ed ha una di*ensione *aggiore di zero.NN1=6[ 0ero se la lunghezza di [2/'IN41[ 3 zero. 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 FILE esiste ed il suo bit 24I+ 3 attivo. %% Ca itolo 7.1.I. 0ero se FILE esiste. 0ero se FILE esiste ed 3 uno s eciale )ile a caratteri. 0ero se FILE esiste ed 3 un collega*ento si*bolico.'. 0ero se FILE esiste ed il suo bit 25I+ H2et 5ser I+I 3 i* ostato.P/I..

+i seguito. [ARG1 OP ARG2] 8e es ressioni si ossono co*binare utilizzando i seguenti o eratori. elencati in ordine decrescente di recedenza7 Tabella ?#.1.2. 6: i* ortante ricordare che then e fi sono considerati co*e istruzioni se arate nella shell. CiE uE essere usato er scavalcare la nor*ale recedenza degli o eratori. un aio di se* lici ese* i.[-n STRINGA] o [STRINGA] [STRINGA1 == STRINGA2] [STRINGA1 != STRINGA2] [STRINGA1 < STRINGA2] [STRINGA1 < STRINGA2] ure 0ero se la lunghezza di [2/'IN41[ 3 diversa da zero. *inore o uguale a. 0ero se o %R6F1 o %R6FP 3 vero. ris ettiva*ente. [1'41[ e [1'42[ sono degli interi. *aggiore di. [1'41[ 3 uguale a. essi sono se arati da un unto e virgola. 0ero se %R6F1 ed %R6FP sono entra*bi veri.P[ 3 uno tra -eq. rogra**a eseguibile. +:altra arte. 8:integrata J Ho testI valuta le es ressioni condizionali usando un insie*e di regole basate sul nu*ero di argo*enti. -ne. 0ero se [2/'IN411[ viene do o di [2/'IN412[ in ordine al)abetico secondo i ara*etri locali. diverso da. la arentesi quadra a erta deve essere chiusa do o l:elencazione delle condizioni. ad eccezione del fi di chiusura. 0ero se [2/'IN411[ viene ri*a di [2/'IN412[ in ordine al)abetico secondo i ara*etri locali. 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. -gt o -ge. '. quando vengono inseriti nella linea di co*ando.2IF. =aggiori in)or*azioni su questa *ateria si ossono trovare nella docu*entazione di -ash. 9uesti o eratori binari arit*etici restituiscono vero se. Pro rio co*e if viene chiuso con fi.1. Istruzioni condizionali 1(( . 0ero se le stringhe non sono uguali. *inore di. 0ero se le stringhe sono uguali./ 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. -lt. scri t di shell eseguibile o istruzione di shell. -le. 2i uE usare [b[ al osto di [bb[ er stretta co* atibilit! con P. Ca itolo 7. ovvero *aggiore o uguale a [1'4[. [. In uno scri t le diverse arti dell:istruzione if nor*al*ente sono ben distinte.

" fi echo echo ".1.sh #!/bin/bash echo "Questo script verifica l'esistenza del file messages. . echo "I tuoi file sono protetti da sovrascritture" .fatto.. Verifica.2. Istruzioni condizionali 1(1 ..fatto.1.. '.#.1. Ca itolo 7.2.1." anny ~> .sh Questo script verifica l'esistenza del file messages.. 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.1." echo "Verifica.3. otreste ottenere dei risultati di))erenti dando lo stesso co*ando in uno scri t. '." if [ -f /var/log/messages ] then echo "/var/log/messages esiste.. echo .1. se utilizzate controlli delle condizioni che di endono dall:a*biente. 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. 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. Controllo dei (ile Il ri*o ese* io veri)ica l:esistenza di un )ile7 anny ~> cat msgcheck." fi L&ambiente 8:ese* io so rastante )unzioner! quando inserito nella linea di co*ando7 anny ~> if [ -o noclobber ] . fi I tuoi file sono protetti da sovrascritture anny ~> /uttavia. 3e)plici applicazioni di i( '. /var/log/messages esiste. then echo ./msgcheck....'.

Se non c'è. fi per oggi hai lavorato sodo a sufficienza.1. then echo "non è un account locale" . fi non è un account locale anny > '. 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 ] .fi Ca itolo 7. Istruzioni condizionali 1(2 ." Ancora immissione> echo . 2e il nu*ero di setti*ana 3 ari. echo "per oggi hai lavorato sodo a sufficienza.2.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". anny > 9uesto scri t viene eseguito da cron ogni do*enica.txt` anny > echo $num 201 anny > if [ "$num" -gt "150" ] Ancora immissione> then echo . 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." | mail -s "Bidoni spazzatura fuori" your@your_domain. In caso contrario non fa nulla.2. then echo "Domenica sera: metti fuori i bidoni della spazzatura. questa è una settimana pari e perciò # invia un messaggio. if [ $NUMSETTIMANA -eq "0" ]. Con(ronti nu)erici 4li ese* i sottostanti usano i con)ronti nu*erici7 anny > num=`wc -l lavoro.

5n ese* io7 freddy scripts> genere="maschile" freddy scripts> if [[ "$genere" == "f*" ]] Ca itolo 7.1.1.2.2.2.1. Signora. . 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. fi Con -ash. Con(ronti di stringhe 5n ese* io di con)ronto tra stringhe er rovare l:I+ utente7 if [ "$(whoami)" != 'root' ]. 6so di i( piD avanzato '.'. Costrutti i(?then?else '.".N6KK. e un:altra se danno )also.3. Istruzioni condizionali 1(3 .1." exit 1. exit 1) ?essuna uscita5 2e invocate e+it in una sottoshell. fi Piacere di conoscerla.N6II[ e [JJ62P'622I.se)pio banale 9uesto 3 il costrutto da i* iegare er intra rendere una strada d:azione se i co*andi if danno vero. 5sate a e c al osto di HeI se non volete che -ash si divida in una sottoshell. 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. questa non asser! le variabili a quella genitrice. co*e questo7 test "$(whoami)" != 'root' && (echo state usando account senza privilegi.2. otete abbreviare questo ti o di costrutto. anny > Seri programmatori 8a *aggior arte dei rogra**atori re)erisce usare il co*ando integrato test. 0edete le agine in)o di -ash er *aggiori in)or*azione sulle co* arazioni dei *odelli con i costrutti [HH62P'622I. che equivale all:uso delle arentesi quadre er i con)ronti. [XX[ s eci)ica cosa )are se la rova d! )also. '. then echo "Non hai il permessso di avviare $0 in quanto utente non root.

$0 si ri)erisce al no*e dello scri t." 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 @. Istruzioni condizionali 1(# . 5sando [[. 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.Ancora immissione> then echo "Piacere di conoscerla. == e != inter retano le stringhe a destra co*e *odelli di glob di shell er con)rontarli ris etto al valore a sinistra. se 01'b[var con spazi[.2.2. er ese* io7 [[ "valore" == val* ]]/ Co*e l:elenco )GQ7?@I')G?S%GK%?TI che segue l:istruzione then. @@ i* edisce la divisione in arole dei valori di variabile.2. 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. Signora. Per il nostro sco o utilizzia*o i ara*etri osizionali $1.1. $# )a ri)eri*ento al nu*ero degli argo*enti a linea di co*ando. er cui le stringhe letterali con *etacaratteri non cercano di es andersi nei no*i dei )ile. Inoltre [[ reviene l:es ansione dei no*i di ercorso. 5n altro ese* io che a* lia quello della 2ezione 7. $2. $N. Controllo degli argo)enti a linea di co)ando Invece di i* ostare una variabile e oi eseguire uno scri t. i.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. '. 9uello seguente 3 un se* lice ese* io7 Ca itolo 7. CosD. co*e un server 8+1P.1. s esso 3 i@ elegante *ettere i valori delle variabili nella linea di co*ando.

3." fi anny ~> bash -x peso. '. then echo "Uso: $0 peso_in_kili altezza_in_centimetri" Ca itolo 7.-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. if [ ! $# == 2 ]. peso="$1" altezza="$2" pesoideale=$[$altezza .110] if [ $peso -le $pesoideale ] .2.sh 55 169 + peso=55 + altezza=169 + pesoideale=59 + '[' 55 -le 59 ']' + echo 'dovreste mangiare un poco di grassi in più.1.' Dovreste mangiare un poco di grassi in più. Istruzioni condizionali 1($ .sh #!/bin/bash # Questo script stampa un messaggio sul vostro peso se glielo date in chili e l'altezza # in centimetri. 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." else echo "Dovreste mangiare un poco di frutta in più. then echo "Dovreste mangiare un poco di grassi in più.

then echo "Dovreste mangiare un poco di grassi in più." fi . \ in partizione". 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"." else echo "Dovreste mangiare un poco di frutta in più. NOMEFILE="$1" echo "Proprietà di $NOMEFILE:" if [ -f $NOMEFILE ]." fi anny ~> peso.$ er un *odo i@ elegante di sta* are *essaggi sull:utilizzo.sh 70 150 Dovreste mangiare un poco di frutta in più. In tal caso il co*ando if va corretto o utilizzando i do i a ici attorno al no*e del )ile.1. CosD. In alternativa. quando non si )orniscono argo*enti. ?omi di file con spa1i 8:ese* io so rastante )allir! se il valore di uE essere esa*inato co*e a arole *ulti le. Istruzioni condizionali 1(& . dovete )arlo una volta sola. il secondo co*e $2 e cosD via. Il nu*ero totale di argo*enti viene conservato in $#.". '. 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.sh 70 150 33 Uso: $0 peso_in_kili altezza_in_centimetri Il ri*o argo*ento viene identi)icato co*e $1."}')" else echo "File inesistente. Ca itolo 7.$1".sservate che il )ile 3 stato ri)erito ad una variabile7 in questo caso 3 il ri*o argo*ento dello scri t. 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. anny ~> peso.exit fi peso="$1" altezza="$2" pesoideale=$[$altezza – 110] if [ $peso -le $pesoideale ] .2. o usando @@ il luogo di @.$6. quando volete *odi)icare un no*e di un )ile in uno scri t. 6sa*inate la 2ezione 7.#.2.

I costrutti i(?then?else '.sh #!/bin/bash # Questo script esegue una prova semplicissima per controllare lo spazio su disco. Istruzioni condizionali 1(7 .2. 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 '.daily> cat testdischi.2.2.2. va in esecuzione la lista 7LTFI')GQ7?@I')G?S%GK%?TI ed il co*ando 3 co* leto. Istruzioni i( annidate Ca itolo 7.se)pio 9uesto 3 un ese* io che otete inserire nel vostro crontab er un:esecuzione quotidiana7 anny /etc/cron. . '. se il suo stato di uscita 3 zero. 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. spazio=`df -h | awk '{print $5}' | grep % | grep -v Use | sort -n | tail -1 | cut -d "%" -f1 -` valoreallarme="80" if [ "$spazio" -ge "$valoreallarme" ]. 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. viene eseguita la lista dei )GQ7?@I')G?S%GK%?TI. se lo stato di ritorno 3 zero.1. viene eseguita invece ogni lista elif e.2.2.'.2. 2e )GQ7?@I'6FGS7 restituisce uno stato diverso da zero.3.

." elif [ $[$anno % 4] -eq 0 ].#.ra gli altri editor. then echo "Questo è un anno bisestile. 2ezione 3. Febbraio ha 29 giorni. 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. Istruzioni condizionali 1(" .#. then echo "Questo è un anno bisestile. CiE equivale alla istruzione let." else echo "Questo non è un anno bisestile." fi anny ~/testdir> date Tue Jan 14 20:37:55 CET 2003 anny ~/testdir> provabisestile. Febbraio ha 28 giorni. -igura ?#. . Potete usare tanti livelli di if annidati quanti siete in grado di gestire logica*ente. then if [ $[$anno % 100] -ne 0 ].1ll:interno dell:istruzione if otete usare un:altra istruzione if. Febbraio ha 29 giorni. Ca itolo 7.&I. Febbraio ha 28 giorni.2. 9uesto 3 un ese* io veri)ica gli anni bisestili7 anny ~/testdir> cat provabisestili.sh Questo non è un anno bisestile.perazioni booleane 8o scri t so ra uE essere abbreviato utilizzando gli o eratori booleani [1N+[ HffI e [. anno=`date +%Y` if [ $[$anno % 400] -eq "0" ].'[ HXXI. '.sh #!/bin/bash # Questo script verificherà se siamo o meno in un anno bisestile./ % empio dell"u o degli operatori booleani Noi utilizzia*o le arentesi do ie er rovare un:es ressione arit*etica Hv. 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." fi else echo "Questo non è un anno bisestile.

se un:istruzione non )unziona con successo o ure se ca ita qualche altro errore. then echo "Pweepwishpeeterdepweet!" exit 2 else echo "Leggerai questo segno?!" exit 3 fi fi 9uesto scri t 3 richia*ato nel rossi*o.2. in *odo che ossono essere intra rese azioni diverse in base al )alli*ento o al successo del rocesso [)iglio[.3. then echo "Hmmmmmm pesce. 5n argo*ento zero signi)ica che lo scri t ha )unzionato con successo. Lui sarà felice solo # quando gli sarà dato pesce. 2e non viene dato alcun argo*ento al co*ando e+it. then if [ "$animale" == "pinguino" ]. Tux vuole pesce!" exit 1 elif [ "$animale" == "delfino" ].sh #!/bin/bash # Questo script agisce in base allo stato di uscita dato da pinguino.sh7 anny ~/testdir> cat pinguino. 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.1. 9uesto argo*ento 3 il codice in nu*ero intero del lo stato di uscita. che restituisce il suo codice di uscita al genitore cibo.'. then echo "A Tux non piace quello. +i seguito c:3 un ese* io con lo scri t pinguino. Abbiamo aggiunto anche un delfino e (presumibilmente) # un cammello.sh export menu="$1" export animale="$2" cibo="/nethome/anny/testdir/pinguino.. 6so dell7istruzione eEit e i( 1bbia*o gi! incontrato breve*ente l:istruzione e+it nella 2ezione 7.sh" $cibo $menu $animal case $? in 1) Ca itolo 7. che d:altra arte es orta le sue variabili menu e animale7 anny ~/testdir> cat cibo. Tux felice!" elif [ "$animale" == "delfino" ]. Istruzioni condizionali 1(% . che viene restituito al [genitore[ e conservato nella variabile $?.sh #!/bin/bash # Questo script ti lascia presentare diversi menu a Tux. 9ualsiasi altro valore uE essere usato dai rogra**atori er restituire *essaggi di))erenti al rocesso [genitore[. la shell genitrice utilizza il valore corrente della variabile $?. 8:istruzione e+it accetta un argo*ento o zionale.$.sh legger*ente adattato. then echo "Pweetpeettreetppeterdepweet!" else echo "*prrrrrrrt*" fi else if [ "$animale" == "pinguino" ]..2. if [ "$menu" == "pesce" ].

. C'è una partizione piena per $spazio %. 3) echo "Guardia: Compra il cibo che lo Zoo fornisce agli animali. Nell:ese* io di*ostria*o l:uso dei case er inviare un *essaggio di avverti*ento i@ selettivo con lo scri t disktest.sh mela pinguino A Tux non piace quello.. Co*e otete vedere." . i codici di stato d:uscita ossono essere scelti libera*ente. altrimenti diventano violenti..gni case 3 un:es ressione che corris onde ad un *odello. *) echo "Guardia: Non scordare la guida!" . Ciascun case e i suoi relativi co*andi vengono de)initi clau ola Hclau eI.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. Tux vuole pesce! Guardia: Meglio che tu dia loro un pesce.. tu ***....3. Istruzioni condizionali 11( .." . [7-8]*) Messaggio="Inizia a pensare di cancellare qualcosa. come pensi che sopravvivano??" . . 6so delle istruzioni case '. Per le condizioni i@ co* lesse.echo "Guardia: Meglio che tu dia loro un pesce. esac anny ~/testdir> . 2) echo "Guardia: E' a causa della gente come te che lasciano la terra tutto il tempo. esse tendono a con)ondere.gni clausola va ter*inata con [NN[. +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. *a non a ena avete a che )are con una co ia di ossibili diverse azioni da intra rendere. altrimenti diventano violenti. 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. Condizioni se)pli(icate 8e istruzioni if annidate otrebbero essere belle./cibo.1.. '.3. I co*andi in LIST7')GQ7?@I er la ri*a coincidenza vengono eseguiti. CASEN: LIST7')GQ7?@I$$ esac ." ." ..... 9[1-8]) Ca itolo 7.sh7 anny ~/testdir> cat disktest. utilizzate la sintassi di case7 case ESPRESSIONE in CASE1: LIST7')GQ7?@I$$ )7S%P: LIST7')GQ7?@I$$ .. /utte le istruzioni case ter*inano con l:istruzione esac.

C'è una partizione piena per 87 %.. 99) Messaggio="Qui mi sommergono! C'è una partizione a $spazio %!" .12.. Una partizione è piena al $spazio %. status) status anacron .0.5/8." . 14 Jan 2003 22:10:47 +0100 Received: (from anny@localhost) by octarine (8." .12.h0ELAltn020413@octarine> To: anny@octarine Subject: disk report Tue Jan 14 22:10:47 CET 2003 Inizia a pensare di cancellare qualcosa.1]) by octarine (8..ggetto7[ e [+a7[. [. stop) stop . un de*one che attiva co*andi eriodica*ente con una )requenza s eci)icata in giorni.0.se)pio di initscript 4li initscri t Ho cript di inizializzazioneI s esso )anno uso delle istruzioni case er avviare. esac echo $Messaggio | mail -s "rapporto dischi `date`" anny anny ~/testdir> You have new mail. 14 Jan 2003 22:10:47 +0100 Date: Tue..3.12. *) Messaggio="Mi sembra di funzionare con una quantità inesistente di spazio su disco. )er*are ed interrogare servizi di siste*a.5/Submit) id h0ELAltn020413 for anny.. 14 Jan 2003 22:10:47 +0100 From: Anny <anny@octarine> Message-Id: <200301142110. 5n ese* io teorico si uE trovare nella rossi*a sezione.5) with ESMTP id h0ELAlBG020414 for <anny@octarine>. ..5/8. Istruzioni condizionali 111 ..2. 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[. 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.. '. 9uesto 3 un estratto dello scri t che avvia 1nacron. 4li scri t di avvio usano i casi start e stop er )ar artire o )er*are i rocessi del siste*a.. Tue. case "$1" in start) start . Tue.Messaggio="Meglio sbrigarsi con quel nuovo disco. restart) Ca itolo 7. =olti altri ese* i dell:uso delle istruzioni case si ossono trovare nella directorG di scri t init del vostro siste*a.12..

CiE vi consente di eseguire con)ronti arit*etici e testuali. =odi)icate lo scri t provabisestile. 3.. lo scri t dovrebbe sta* are un Ca itolo 7.else che sta* i le in)or*azioni sul *ese corrente. 2crivete uno scri t chia*ato qualedemone. .sercizi 9ui ci sono alcune idee er )arvi iniziare ad usare if negli scri t7 1. 0. #. e di veri)icare codici d:uscita. '. +e)inizioni i@ co* lesse delle condizioni vengono di solito inserite in una istruzione case.fi s esso recede dei co*andi in uno scri t di shell er revenire la generazione di e*issioni. 0eri)icate che venga )ornito esatta*ente un solo argo*ento. *) echo $"Uso: $0 {start|stop|restart|condrestart|status}" exit 1 esac I co* iti da eseguire in ciascun caso.stop start . 5sate un costrutto if. co*e )er*are ed attivare il de*one. in *odo lo scri t uE essere avviato sullo s)ondo H backgroundI o attraverso il rogra**a di utilit! cron.elif.then. then stop start fi . 2.2.sh che controlli se i de*oni httpd e init stanno girando nel vostro siste*a.ate lo stesso. '. 5n se* lice test if. 8e azioni si ossono deter*inare *ediante l:uso dell:istruzione if. $. . il Ca itolo 11 er *aggiori s iegazioni. sono de)initi nelle )unzioni. 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.$. che traggono arzial*ente origine dal )ile /etc/rc.. 2e sta )unzionando httpd. =odi)icate /etc/profile in *odo da ottenere un *essaggio s eciale di saluto quando vi connettete al siste*a co*e root. 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. usando un:istruzione case e un utilizzo alternativo del co*ando date.sh della 2ezione 7. Istruzioni condizionali 112 .d/functions. condrestart) if test "x`pidof anacron`" != x. l:anno. i**issioni e )ile necessari agli scri t.then.# in *odo che richieda un unico argo*ento.#.d/init.

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

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

. then echo -e "\a\a\aPweetpeettreetppeterdepweet!\a\a\a\n" else echo -e "*prrrrrrrt*\n" fi else if [ "$animale" == "pinguino" ]. Tux felice!\n" elif [ "$animale" == "delfino" ]. then echo -e "Hmmmmmm pesce. Co*e ese* io di aggiunta di co**enti. 'edigere scri t interattivi 11$ .\n" Ca itolo ". *igliorere*o un o: i rogra**i cibo. *.1.sh if [ "$#" != "2" ].27 michel ~/test> cat pinguino. abbiamo aggiunto in più una coppia # di animali.sh #!/bin/bash # Lo script vi lascia presentare menu differenti a Tux.sh e inguino. 8o stato di ritorno 3 se* re zero. se arati da s azi e ter*inati con un carattere di nuovalinea. 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. Per renderlo più divertente.\n" cibo="/nethome/anny/testdir/pinguino... 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.2. Lui sarà felice solo quando # gli sarà dato un pesce. Tux vuole pesce!\n" exit 1 elif [ "$animale" == "delfino" ]. 6so del co)ando integrato echo Il co*ando integrato echo e*ette i suoi argo*enti. then echo -e "A Tux non piace quello.2. if [ "$menu" == "pesce" ].1.sh della 2ezione 7. then if [ "$animale" == "pinguino" ].ese* i nelle rossi*e sezioni. • -n7 so ri*e i nuovalinea in *ezzo al testo.sh" $cibo $menu $animale risultato="$?" echo -e "Pasto eseguito. echo accetta una co ia di o zioni7 • -e7 inter reta i caratteri di esca e con la barra inversa..sh #!/bin/bash # Lo script agisce in base allo stato di uscita dato da pinguino.

###BOT_TEXT###quot;\n" ###BOT_TEXT###quot;Compra il cibo che fornisce lo Zoo all'entrata.... 3) echo -e "Guardia: echo -e "Guardia: . 8a tabella seguente o))re una anora*ica delle sequenze riconosciute dal co*ando echo7 Tabella 8-1.###BOT_TEXT###quot;\n" ..sh cibo-in-menu nome-animale ###BOT_TEXT###quot;Sarebbe meglio dare loro un pesce.. esac fi echo "Uscendo." echo -e "\a\a\aGrazie per la visita allo Zoo... 'edigere scri t interattivi . Tu ***"" Guardia: "Vuoi avvelenarli sul serio?" Uscendo. Grazie per la visita allo Zoo. 2) echo -e "Guardia: ... 11& Ca itolo "... altrimenti diventano ###BOT_TEXT###quot;Nessuna meraviglia se abbandonano il nostro pianeta.or* )eed Nuovalinea 'itorno carrello o C' HCarriage 9eturnI. Guardia: "Compra il cibo che fornisce lo Zoo all'entrata.sh mela Uso dello script cibo: ...3.2.. speriamo di vedervi presto di nuovo! michel ~/test> cibo. /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. . Tu ***###BOT_TEXT###quot;\n" ###BOT_TEXT###quot;Vuoi avvelenarli sul serio?###BOT_TEXT###quot;\n" ###BOT_TEXT###quot;Non scordare la guida!###BOT_TEXT###quot;\n" 2i uE trovare di i@ sui caratteri esca e nella 2ezione 3. 2 azio indietro o back pace/ 2o ri*e i nuovalinea in *ezzo al testo 6sca e.sh mela cammello Nutrire con una mela un cammello. speriamo di vedervi presto di nuovo!\n" michel ~/test> cibo. Sequenze di escape utilizzate dal comando echo Se(uen1a \a \b \c \e \ \n \r \t \! \ ###BOT_TEXT###""" Significato 1llar*e Hca* anelloI. *) echo -e "Guardia: .case "$risultato" in 1) echo -e "Guardia: violenti./cibo. Sai leggere il segnale?! Non dare da mangiare al cammello! Pasto eseguito.

la linea da leggere viene assegnata alla variabile REPLY. 8a ri*a arola della linea viene assegnata al ri*o no*e. 1ltri argo*enti NAME vengono ignorati. 2ezione 3. Il ri*o carattere di +68I= viene usato er ter*inare la linea i**essa. la seconda arola al secondo no*e e cosD via. ai no*i restanti si assegnano dei valori vuoti./ &pzioni dell"integrato read Gp1ione -a ANAME Significato 2i assegnano le arole a indici sequenziali della variabile *atriciale ANAME. *. NOMEN. a *eno che non sia stato incontrato un carattere di )ine<)ile H6.###BOT_TEXT###quot;"" \#$$ Il carattere a otto bit il cui valore 3 il valore ottale NNN Hda una a tre ci)re ottaliI. readline viene usato er ottenere la linea 117 -d DELIM -e Ca itolo ". le agine in)o di -ash. 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. 'edigere scri t interattivi . 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. Cattura dell7i))issione dell7utente *. I caratteri nel valore della variabile IFS vengono utilizzati er dividere la linea i**essa in arole o )ra**enti HtokenI7 v.#. 8:integrato di -ash read su orta le seguenti o zioni7 Tabella A#. v. NOME1.. 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.2. 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 ci sono *eno arole da leggere nel )lusso d:ingresso ris etto ai no*i. al osto di nuovalinea. Il codice di ritorno del co*ando read 3 zero. iniziante er (. 6so del co)ando integrato read Il co*ando integrato read 3 la contro artita dei co*andi echo e printf. /utti gli ele*enti vengono ri*ossi da ANAME ri*a dell:assegnazione. 8a sintassi del co*ando read 3 la seguente7 read [opzioni] NOME1 NOME2 . /enete in *ente che otrebbero esserci delle di))erenze tra le diverse versioni di -ash.1.2.. 2e non vengono )orniti no*i.. con le arole restanti e i loro relativi se aratori assegnati all:ulti*o no*e.

seguito da [INVIO]: 2000 2000 è un anno bisestile. *. then echo "$anno è un anno bisestile." fi michel ~/test> provabisestile. una co ia barra inversa<nuovalinea otrebbe non essere utilizzata co*e rosecuzione di linea. "$USER".sh #!/bin/bash # Questo script verificherà se avete dato un anno bisestile o meno. 8a barra inversa viene considerata a artenente alla linea. -p PROMPT -r -s -t TIMEOUT -u FD 9uesto 3 un chiaro ese* io che *igliora lo scri t provabisestile. 8:invito HpromptI viene *ostrato solo se l:i**issione roviene da un ter*inale. seguito da [INVIO]:" read anno if (( ("$anno" % 400) == "0" )) || (( ("$anno" % 4 == "0") && ("$anno" % 100 != "0") )). i caratteri non vengono ri ortati con echo.sh #!/bin/bash # Questo è un programma che conserva aggiornata la vostra rubrica degli indirizzi. &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.2. 2e viene data questa o zione. =ostra PROMPT senza nuovalinea in *ezzo ri*a di tentare di leggere qualsiasi i**issione." else echo "Tquesto non è un anno bisestile. echo "Batti l'anno che desideri controllare (4 cifre).-n NCHARS read ritorna do o la lettura dei caratteri NCHARS iuttosto di attendere l:intera linea di i**issione." echo -n "Inserisci il tuo nome e premi [INVIO]: " read nome echo -n "Inserisci il tuo genere (maschio/femmina) e premi [ENTER]: " Ca itolo ". amici="/var/tmp/michel/amici" echo "Ciao. +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. michel ~/test> cat amici. 8egge i**issioni dal descrittore di )ile FD. /ale o zione non ha e))etti se read non sta leggendo i**issioni da ter*inale o da un incanala*ento HpipeI.2. In articolare.sh Batti l'anno che desideri controllare (4 cifre). la barra inversa non si co* orta co*e carattere di esca e. 2e l:i**issione roviene da un ter*inale. 'edigere scri t interattivi 11" .sh del recedente ca itolo7 michel ~/test> cat leaptest. Questo script ti registrerà nel database degli amici di Michel. =odalit! silenziosa.

michel. *a vi dir! se* re che siete stati aggiunti alla lista. 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. 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. chiusura in corso.read -n 1 genere echo grep -i "$nome" "$amici" if [ $? == 0 ]. then echo "Sei già registrato." exit 1 fi fi michel ~/test> cp amici." exit 1 elif [ "$genere" == "m" ].sh /var/tmp. +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. 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. Questo script ti registrerà nel database degli amici di Michel. Questo script ti registrerà nel database degli amici di Michel. Ca itolo ". anny. 'edigere scri t interattivi 11% . . then echo "Sei stato aggiunto alla lista degli amici di Michel. Potete risolvere questo roble*a utilizzando delle s eciali *odalit! di accesso al )ile dello scri t Hv.sh Ciao. cd /var/tmp michel ~/test> touch amici. Tante grazie!" else echo "Sei stato aggiunto alla lista degli amici di Michel. 8o scri t conserva solo le in)or*azioni che interessano a =ichel." exit 1 else echo -n "Quanti anni hai? " read anni if [ $anni -lt 25 ].ra altre ersone ossono eseguire lo scri t7 [anny@octarine tmp]$ amici. michel ~/test> cat amici Notate che qui non 3 stato o*esso alcun risultato. SKI@ e SGI@ nella guida [Introduzione a 8inuA[I. chmod a+w amici michel ~/test> amici. a *eno che non ci siate gi!.sh Ciao.

• 2e l:e*issione standard del co*ando corrente viene incanalata verso l:i**issione standard del co*ando successivo. che in realt! 3 un collega*ento si*bolico a /proc/<ID_processo>./proc/self/fd/0 root root 17 Oct 2 07:46 /dev/stdout -> . ris ettiva*ente con i nu*eri di descrittori di )ile (. o ure indirizzare le e*issioni verso un )ile. 8a redirezione uE ure ca itare in uno scri t. 'edigere scri t interattivi 12( . &edirezione e descrittori dei (ile *. vengono ercorse le seguenti )asi. • 8a redirezione del co*ando corrente viene elaborata da sinistra a destra. tdout e tderr./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. In generale Co*e sa ete dall:utilizzo ele*entare della shell. 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. 9uesti valori nu*erici sono conosciuti co*e descrittori di )ile Hfile de criptor I.2. 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. 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.2.1 lrwx-----. in *odo che quest:ulti*o uE ricevere i**issioni da arte di un )ile.. 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. allora /proc/<ID_processo_corrente>/fd/1 viene aggiornato er essere destinato ad un altro incanala*ento anoni*o.*.1 -l /dev/std* root root 17 Oct 2 07:46 /dev/stderr -> . 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-----.3. 8a redirezione uE essere usata anche er a rire e chiudere )ile del a*biente di esecuzione della shell corrente./proc/self/fd/2 root root 17 Oct 2 07:46 /dev/stdin -> . • 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.1. In seguito l:utente uE rivedere il )ile di e*issione o uE usarlo co*e i**issione er un altro scri t.1 lrwx-----. Ca itolo ". 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. I descrittori di )ile *eglio conosciuti sono tdin.. 1 e 2.. 9uando si esegue un dato co*ando. er ese* io.3.

cron pipe:[124441] /proc/21974/fd *.2. 1ltresD. cosD che non otrete iniziare a )are una qualunque *eritevole correzione degli errori. # (/tmp/crontab. 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. non ca*bia i@ nulla erché il rocesso shell )iglio user! gli stessi descrittori di )ile di quello genitore.cron total 0 lr-x-----.2. &edirezione degli errori +agli ese* i recedenti 3 chiaro che otete )ornire )ili in ingresso e uscita ad uno scri t Hv.$Id: chap8. 9uando avviate uno scri t dalla linea di co*ando. se siete )ortunati.1 michel michel 64 Jan l-wx-----.1 michel michel 64 Jan l-wx-----.1 michel michel 64 Jan 24 l-wx-----.1 michel michel 64 Jan lr-x-----. 9uesto viene ra resentato nell:ese* io sottostante. • 2olo ora viene eseguito il co*ando corrente.v 1. gli errori vi )aranno )allire il vostro scri t e non verranno intercettati o inviati da nessuna arte.edit the master and reinstall. *a alcuni tendono a di*enticarsi di redirigere gli errori O e*issione che otrebbe essere di esa da questi. 9uando si redirigono gli errori.• 8a chiusura [NTf<[ del descrittore di )ile ha l:e))etto di cancellare il collega*ento si*bolico /proc/self/fd/N. er ese* io quando avviate uno scri t utilizzando il rogra**a di utilit! cron.1 michel michel 64 Jan 24 l-wx-----. gli errori vi saranno inviati a *ezzo osta ed eventuali cause di )alli*ento otrebbero essere svelate. Per ese* io. 'edigere scri t interattivi 121 .xml. i descrittori di )ile standard sono incanala*enti o altri )ile Hte* oraneiI.at total 0 lr-x-----. 9uando non 3 dis onibile un tale genitore.21968 installed on Fri Jan 24 11:30:41 2003) # (Cron version -. restate attenzione che l:ordine di recedenza 3 signi)icativo.3.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.2.1 michel michel 64 Jan 24 lr-x-----. a *eno che non venga utilizzata una qualche )or*a di redirezione.at /var/spool/at/spool/a0000c010959eb /proc/21949/fd 6 uno con cron7 michel ~> crontab -l # DO NOT EDIT THIS FILE .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.1 michel michel 64 Jan 24 11:32 11:32 11:32 11:32 0 1 2 3 -> -> -> -> pipe:[124440] /var/tmp/fdtest.# er *aggiori in)or*azioniI.at at> <EOT> job 10 at 2003-01-24 11:07 michel ~> cat /var/tmp/fdtest. questo co*ando )ornito in /var/spool ls -l * 2> /var/tmp/inaccessibile-in-spool Ca itolo ". 2e non siete cosD )ortunati. 2ezione ".

dovrete trovare il *odo di risolvere il roble*a. 8:a ertura del )ile /dev/fd/N equivale a du licare il descrittore dei )ile 6. oi la sua i**issione standard che 3 l:e*issione del co*ando filter e.2.piepagina.#. *.2. 2i ossono trovare centinaia di ese* i nei )ile di avvio del vostro siste*a. 1. 6sso s esso viene co*binato anche con la redirezione verso /dev/null. vedrete che questi equivalgono ris ettiva*ente a /dev/fd/0& /dev/fd/1 e /dev/fd/2. Il co*ando cat er ri*a cosa legge il )ile testata.gz | cat testata. 8:uso rinci ale dei )ile /dev/fd 3 er la shell. CiE si uE )are. Per co*odit!. non i* orta quali e*issioni o errori dia. usando un trattino H<I er indicare che un rogra**a dovrebbe leggere da un incanala*ento HpipeI. il )ile piepagina. er ulti*o. Il co*ando ls -l * > /var/tmp/listaspool 2>&1 diriger! sia i**issione che errori standard verso il )ile listaspool.rediriger! l:e*issione standard del co*ando ls verso il )ile inaccessibile-in-spool in /var/tmp.txt . -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. 'edigere scri t interattivi 122 .#. 2e il vostro siste*a *ette a dis osizione /dev/stdin. 5n ese* io7 michel ~> filter corpo.txt. Questo testo viene stampato alla fine di ciascun lavoro di stampa.txt. Il co*ando ls -l * 2 >& 1 > /var/tmp/listaspool dirige solo l:e*issione standard verso il )ile di destinazione. Testo da filtrare. 6so di ?dev?(d 8a directorG c contiene voci chia*ate 0. 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 ". /dev/stdout. 2e /dev/fd non 3 dis onibile in un siste*a. 2 e cosD via. erché l:errore standard viene co iato nell:e*issione standard ri*a che questa sia rediretta.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. s esso gli errori vengono rediretti verso /dev/null se 3 certo che non servano. I))issioni ed e)issioni di (ile *. 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.1. il costrutto usato nel recedente co* lesso di ese* i.txt. er ese* io. er ese* io quando volete solo eseguire un co*ando.

#.2.all:e*issione standard 3 un:idea sbagliata che si 3 insinuata in *olti rogra**i.gz | cat testata. +o o che un descrittore di )ile 3 stato assegnato ad un )ile. v.#. *. 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. co*e 3 di*ostrato nell:ese* io seguente7 michel ~> exec 4> risultati. 8:uso di /dev/fd consente uni)or*it! e reviene la con)usione7 michel ~> filter corpo. 2iete )orte*ente consigliati di non usarlo. &ead e eEec *.2. Ci otrebbero essere anche roble*i quando si s eci)ica il trattino co*e ri*o argo*ento. @escrittore di file W 8:uso di questo descrittore dei )ile otrebbe causare dei roble*i. Questo testo viene stampato alla fine di ciascun lavoro di stampa.2. tutti i dati in uscita vengono er di i@ incanalati attraverso lp er inviarli alla sta* ante rede)inita. &ead negli script 123 Ca itolo ". dal *o*ento che otrebbe essere inter retato co*e una o zione del co*ando recedente. *.1. esso uE essere utilizzato con gli o eratori di redirezione della shell. ca itolo 1&. 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.2. uE essere i* iegato er assegnare un descrittore di )ile ad un )ile. Per ese* io.#.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. 'edigere scri t interattivi .txt /dev/fd/0 piepagina. otete usare il nu*ero del descrittore del )ile. Testo da filtrare.2.txt /dev/fd0 piepagina.txt michel ~> filter corpo.gz | cat testata. 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. [1dvanced -ash< 2cri ting 4uide[. Invece di usare il no*e del )ile.2.txt.2.txt.txt >& 4 michel ~> cat risultati.txt | lp In questo chiaro ese* io.

# cancella fd 7 exec 0<&7 7<&echo -n "Inserire un commento o [INVIO] per nessun commento: " read commento.. Inserire un commento o [INVIO] per nessun commento: in DNS centrale michel ~/testdir> cat /var/tmp/sysconfig..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" echo "Salvataggio informazioni degli host..out rm "$CONFIG" 2>/dev/null echo "L'emissione sarà salvata in $CONFIG. li mette insieme in un file # di salvataggio e consente di aggiungere commenti a ciascun file. Inserire un commento o [INVIO] per nessun commento: password suggerita: blue lagoon Salvataggio informazioni degli host.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.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 "...sh #!/bin/bash # Questo script crea un indice dei file config importanti.out." # 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. 'edigere scri t interattivi 12# ... Salvataggio informazioni su account di root." # Per primo prepara un file hosts privo di commenti TEMP="/var/tmp/hosts. echo $commento >> "$CONFIG" rm "$TEMP" michel ~/testdir> notesistema.. CONFIG=/var/tmp/sysconfig.sh L'emissione sarà salvata in /var/tmp/sysconfig." 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).

sh #!/bin/bash # Questo script stampa l'emissione standard senza modifiche. INPUTDIR="$1" # fd 6 punta la destinazione fd 1 (uscita console) nella shell corrente exec 6>&1 # fd 1 punta l'incanalamento. echo "Questi sono i programmi di navigazione internet di questo sistema:" Ca itolo ".kingarthur. mentre l'errore standard # viene rediretto per l'elaborazione con awk.0.requente*ente il vostro scri t otrebbe chia*are un altro rogra**a o scri t che richieda ingresso di dati. 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.127. esegue ls ls "$INPUTDIR"/* 2>&1 >&6 6>&. CiE si )a usando la sintassi e+ec fdH8' Nell:ese* io so rastante.168. | awk 'BEGIN { FS=":" } { print "NON HAI ACCESSO A" $2 }' 6>&# fd 6 chiuso per la shell corrente exec 6>&- *. viene chiuso ogni volta che all:utente serve avere accesso alla vera eri)erica di i**issione standard.\ # Chiude fd 6 per awk.2. fd 2 punta la destinazione fd 1 (incanalamento o pipe).0. /utte le linee lette )ino a quel unto vengono oi usate co*e i**issione standard er un co*ando.1 tintagel. il descrittore dei )ile 7.com tintagel in DNS centrale *.3. # fd 1 punta la destinazione fd 6 (uscita console). +ocu)enti here .42. che 3 stato assegnato all:i**issione standard. ma non per ls. 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. 3 buona rassi chiudere un descrittore dei )ile quando non ve ne sia i@ bisogno. 9uello che segue 3 un se* lice ese* io di redirezione del solo errore standard verso un incanala*ento HpipeI7 michel ~> cat listdirs.#.1 localhost.localdomain localhost 192.sh #!/bin/bash # Questo script fornisce agli utenti un modo semplice per scegliere tra i navigatori.2. Chiusura dei descrittori dei (ile +al *o*ento che i rocessi )igli ereditano i descrittori di )ile a erti. 'edigere scri t interattivi 12$ . fd 6 chiusa.#. solita*ente la tastiera.#.

Success! tuxracer 100 % done 1/1 Installed: tuxracer 0. usando yum.# 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. attendi per favore.i386] Is this ok [y/N]: EnterDownloading Packages Running test transaction: Test transaction complete.61-26.core Server: Fedora Linux 2 . 2ebbene si arli di un docu*ento here. si su one che si tratti di un costrutto all:interno dello stesso scri t.i386 Transaction(s) Complete Ca itolo ". generic Server: Fedora Linux 2 . 9uesto 3 un ese* io che installa auto*atica*ente un acchetto. 'edigere scri t interattivi 12& .NK[." $browser & michel ~> inizionavigazione.61-26..updates Finding updated packages Downloading needed headers Resolving dependencies Dependencies resolved I will do the following: [install: tuxracer 0.sh Questi sono i programmi di navigazione internet di questo sistema: mozilla links lynx konqueror opera netscape Quale preferisci? opera Avvio opera." exit 1 fi yum install $1 << CONFIRM y CONFIRM 6 questo 3 co*e )unziona lo scri t... if [ $# -lt 1 ].i386 – freshrpms Server: JPackage 1.i386 . then echo "Uso: $0 pacchetti./install.i386 .5. lo scri t ris onde [G[ auto*atica*ente7 [root@picon bin]# . anche se nor*al*ente dovreste con)er*are7 #!/bin/bash # Questo script installa i pacchetti automaticamente.5 for Fedora Core 2 Server: JPackage 1.sh tuxracer Gathering header information file(s) from server(s) Server: Fedora Linux 2 .. 9uando a are l:invito con la stringa [Is this o? JG.

calcolate quanta birra un utente *aggiore di 1" anni ha bevuto statistica*ente H1(( litri. 1bbia*o ribadito l:i* ortanza del )ornire *essaggi esaurienti agli utenti dei nostri scri t.sercizi 9uesti esercizi sono a licazioni ratiche di costrutti trattati in questo ca itolo. 1.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. compress e 1ip. I* le*entate le seguenti )unzionalit!7  Controllate il nu*ero di argo*enti. '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. 3 *eglio dare tro e in)or*azioni iuttosto che insu))icienti. 2e 3 uguale o *aggiore di 1& sta* ate un *essaggio che dice che questo utente ha il er*esso di bere alcolici. Co*e se* re. b1ipP.annoI e sta* ate questa in)or*azione er l:utente. 2crivete un scri t che chieda l:et! dell:utente. i docu*enti here sono un ti o di costrutto di shell che consente la creazione di elenchi. /ale costrutto si uE usare anche er eseguire senza interventi co* iti di sotto)ondo. 5tilizzate un docu*ento here che resenti all:utente una co ia di scelte er la co* ressione del )ile. CiE nor*al*ente si )a utilizzando la co*binazione echo.  +eter*inate se la directorG backups ha abbastanza s azio libero er tenere la co ia d:e*ergenza. 2e 3 resente un qualche argo*ento. 8o scri t dovrebbe )unzionare senza argo*enti. 2. 8e scelte otrebbero essere g1ip. *antenendo le scelte degli utenti. 9uando si scrivono degli scri t. indi rovate quella orzione di codice iuttosto di scrivere tutto in una sola volta. e di co*e questi ossano essere co*binati con la ricezione di dati in ingresso dall:utente. altri*enti interattivi.*. 3. 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. Ca itolo ".read. 2crivete ciascun asso.#. otreste rovarli utilizzando una directorG test che non contenga tro i dati. uscite do o aver sta* ato un *essaggio di istruzioni. . 'ealizzate uno scri t che renda un )ile co*e argo*ento. quando altri usano i vostri scri t. Co*e eAtra. *. 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. 'edigere scri t interattivi 127 .

grou e . $.shado>7 creare la directorG ersonale dell:utente HhomeI Hcon i er*essi correttiVI7 aggiungere l:utente ai gru i secondari desiderati. 4uardate info tar o Introduzione a 8inuA. ca itolo % [Pre arazione dei vostri dati[. data di scadenza di questo account.etc. 2ta* are un *essaggio contenente tale I+. 2ta* are un *essaggio contenente l:I+ del gru o.etc.  creare un gru o rivato er questo utente veri)icando il )ile /etc/group. Ca itolo ". gru i eAtra a cui otrebbe a artenere il nuovo utente. 'iscrivete lo scri t della 2ezione 7.etc. In)or*ate l:utente che lo scri t sta )acendo questo. Chiedete all:utente se desidera una co ia di salvataggio co* leta o incre*entale.  Condividere le in)or*azioni con l:utente o eratore7 un co**ento che descriva questo utente.# in *odo che esso legga l:i**issione dall:utente iuttosto che la renda dal ri*o argo*ento. ass>d. una scelta da un elenco di shell Hcontrollate l:accettabilit!.1.  2ta* ate un *essaggio che in)or*i l:utente circa la di*ensione della co ia di salvataggio co* ressa. . altri*enti uscite sta* ando un *essaggioI. 'ealizzate uno scri t deno*inato semplice-useradd. 'edigere scri t interattivi 12" .  I* ostare la ass>ord di questo utente co*e conosciuta stringa rede)inita. 8o scri t dovrebbe7  1ccettare solo un unico argo*ento o istruzioni. In caso di co ia di salvataggio incre*entale )ate solo questa se quella co* leta non 3 i@ vecchia di una setti*ana.2. 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.  Con le in)or*azioni ottenute. 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. aggiungere una linea a . ure uscire do o la sta* a di un *essaggio di  Controllare /etc/passwd e decidere sul ri*o I+ utente libero. er in)or*azioni di sotto)ondo #.sh che aggiunga un utente locale al siste*a.  Co* ri*ete la co ia di salvataggio utilizzando un qualsiasi stru*ento di co* ressione.

2e non sono stati eseguiti dei co*andi erché LISTA non si es ande ad alcuna voce. Co)piti ripetitivi 1l ter*ine di questo ca itolo sarete in grado di  usare i cicli for. e decidere quale ciclo sia adatto nella circostanza.1. scri t. 8o stato di ritorno 3 lo stato d:uscita dell:ulti*o co*ando eseguito. 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. sebbene i sia usato *olto )requente*ente. Il ciclo ter*ina quando NOME ha assunto ciascun valore di LISTA e non sono ri*aste voci in LISTA. 2ezione 3..2.2I. lo stato di ritorno 3 zero. .se)pi .2.1. stringhe o nu*eri.Capitolo . )GQ7?@I er andare in esecuzione uE anche essere un qualsiasi co*ando del siste*a o erativo.  realizzare scri t che accettino un nu*ero variabile di argo*enti.1. . il suo valore viene i* ostato con la seconda voce in lista e cosD via.. NOME uE essere qualsiasi no*e di variabile.2.1. LISTA uE essere un qualunque elenco di arole. . viene ri* iazzato con in $@ e for esegue )GQ7?@I una volta er ciascun ara*etro osizionale che 3 stato i* ostatoHv.  usare gli integrati di -ash brea! e continue. 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 %.1.. Il ciclo (or . 8a ri*a volta che viene eseguito il ciclo. rogra**a o istruzione di shell.1. Co* iti ri etitivi 12% . 9uesto ciclo consente di s eci)icare un elenco di valori.1. NOME viene i* ostato con la ri*a voce di LISTA. Co)e (unziona? Il ciclo for 3 il ri*o dei tre costrutti di ciclo della shell. -hile e until.  realizzare scri t che usino l:istruzione select.2. 8a seconda volta.. che ossono essere gi! scritte o ure rodotte da qualsiasi co*ando.$ e 2ezione 7.

do NUOVONOME=$(ls "$i" | sed -e 's/html/php/') cat beginfile > "$NUOVONOME" cat "$i" | sed -e '1.1. Strani caratteri . done [carol@octarine ~/articles] ls *.xml file3.bak . co*e questa7 for i in $PATHNAME/*.sbin che sono solo dei )ile di testo uro ed eventual*ente gli scri t7 for i in `ls /sbin`. Co* iti ri etitivi 13( . do file /sbin/$i | grep ASCII. sarebbe i@ corretto utilizzare il co*ando basename. 8a conversione viene eseguita estraendo le ri*e 2$ linee e le ulti*e 21. done .xml file2.xml file2.21d'| tac >> "$NUOVONOME" cat endfile >> "$NUOVONOME" done +al *o*ento che qui non )accia*o un conteggio delle linee.inirete nei guai se la lista si es ande ai no*i dei )ile contenenti s azi ed altri caratteri irregolari. secondo un certo sche*a. in )ile PBP. che rovescia le linee in un )ile..bak file2.xml file3.xml* file1.xml > lista [carol@octarine ~/articles] for i in `cat lista`. do cp "$i" "$i".bak 9uesto invece elenca i )ile in . 8eggete le agine *an er *aggiori in)or*azioni.sh #!/bin/bash # specifico script di conversione per i miei file da html a php LISTA="$(ls *.xml file1. iniziare a lavorare sui vostri sorgenti 3 sicuro7 [carol@octarine ~/articles] ls *.xml [carol@octarine ~/articles] ls *.xml. +o o aver dato il co*ando.2.2.html)" for i in "$LISTA".25d' | tac | sed -e '1.bak file3.xml. 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.xml. 5n costrutto i@ ideale er ottenere la lista sarebbe quello di utilizzare la )unzione di globbing della shell. Il comando basename Invece di usare sed er sostituire il su))isso ht*l con h .xml file1. do comandi done Ca itolo %. 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. sostituendo queste con due *arcatori HtagI PBP che )orniscono le linee di intestazione e di i3 agina7 [carol@octarine ~/html] cat html2php.xml.salvataggio di ogni )ile . Il roble*a si risolve usando tac.

2.1.1. Il ciclo Bhile .2. )GQ7?@I')G?S%GK%?TI uE essere qualsiasi rogra**a..gni ora viene creata una nuova directorG contenente le i**agini di quell:ora.2. 8o scri t gira dietro le quinte. .gni giorno viene creata una nuova directorG contenente 2# sottodirectorG.2.. . Co* iti ri etitivi 131 . 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*.2. # (usa scp e le chiavi SSH per una directory remota) # Viene creata una nuova ogni ora. 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. i="0" while [ $i -lt 4 ] do xterm & i=$[$i+1] done .2.2. ....gni cinque *inuti viene scattata una )oto. il ciclo esce7 n uno scri t viene eseguito il co*ando successivo all:istruzione done. 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. #!/bin/bash # Questo script copia file dalla mia directory home a quella del webserver. Non a ena )GQ7?@G')G?TFGLLG )allisce. 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.2. 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. ure .se)pi . Ca itolo %. . scri t o costrutto di shell.2.

2igni)ica questo7 continua l:esecuzione )inché non venia*o interrotti con la )orza Hcon !ill o )trl*)I.2. do echo "In che materia vuoi consigli?" cat << materie politica startrek kernelnewbies sport bofh-excuses magia amore Ca itolo %.2. 0eri)iche regolari si ossono ottenere con il rogra**a di utilit! cron. do DESTDIR=$WEBDIR/"$DATA"/"$ORA" mkdir "$DESTDIR" mv $PICSDIR/*. do DATA=`date +%Y%m%d` ORA=`date +%H` mkdir $WEBDIR/"$DATA" while [ $ORA -ne "00" ].jpg "$DESTDIR"/ sleep 3600 ORA=`date +%H` done done .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. Ksate il sistema 8:ese* io recedente 3 a sco o di*ostrativo. Co* iti ri etitivi 132 . do touch pic-`date +%s`. #!/bin/bash # Questo genera un file ogni 5 minuti while true.PICSDIR=/home/carol/pics WEBDIR=/var/www/carol/webcam while true.sservate l:uso dell:istruzione true.sservate l:uso del co*ando date er generare tutti i ti i di no*i di )ile e directorG. 9uesto iccolo scri t uE essere utilizzato er e))ettuare una si*ulazione7 esso genera )ile.. Non scordate di redirigere l:e*issione e gli errori quando utilizzate scri t che vengono eseguiti dal vostro crontabV .jpg sleep 300 done . 4uardate le agine *an er *aggiori in)or*azioni.

Co* iti ri etitivi 133 .2." break else SOMMA=$[$SOMMA + $PUNTEGGIO] NUM=$[$NUM + 1] MEDIA=$[$SOMMA / $NUM] fi done echo "Uscita. then echo "Sii serio.2. prova di nuovo: " elif [ "$PUNTEGGIO" == "q" ]. Calcolo di una )edia 9uesto scri t calcola la *edia di un:i**issione di utente. viene sta* ato un *essaggio. if (("$PUNTEGGIO" < "0")) || (("$PUNTEGGIO" > "100")). Coraggio.#. che viene testata ri*a dell:elaborazione7 se l:i**issione non rientra nell:intervallo. PUNTEGGIO="0" MEDIA="0" SOMMA="0" NUM="0" while true. ..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. then echo "Classifica media: $MEDIA%." . do echo -n "Inserisci il tuo punteggio [0-100%] ('q' per finire): ". read PUNTEGGIO. 2e si re*e ( il ciclo si interro* e7 #!/bin/bash # Calcola la media di una serie di numeri. 6 di nuovo il test true ri ete i co*andi della lista )GQ7?@I')G?S%GK%?TI ancora e ancora. Ca itolo %.sservate co*e le variabili nelle ulti*e linee sono lasciate senza a ici er oter e))ettuare i calcoli arit*etici.

Co*e abbia*o gi! s iegato in nuovalinea ogni volta che a are. do DATA=`date +%Y%m%d` ORA=`date +%H` mkdir $WEBDIR/"$DATA" while [ $ORA -ne "00" ]. while true.. done done Ca itolo %. # Se le immagini occupano troppo spazio. e )GQ7?@I' )G?S%GK%?TI uE essere qualsiasi co*ando 5NIF.. do rm -rf "$i".. ad eccezione che il ciclo viene eseguito )intanto HuntilI che )GQ7?@G'T%ST viene eseguito con successo. [N[ otrebbe essere ri* iazzato con una o i@ .3..ino a quando questo co*ando )allisce. Cos74? Il ciclo until 3 *olto si*ile al quello -hile. di nuovo. 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. le più vecchie vengono rimosse. # Una nuova directory viene creata ogni ora.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. )GQ7?@G'T%ST uE. recedenza. 2e non 3 dis onibile abbastanza s azio su disco. che veri)ichi la dis onibilit! di s azio su disco. do DISCOPIENO=$(df -h $WEBDIR | grep -v File | awk '{print $5 }' | cut -d "%" -f1 -) until [ $DISCOPIENO -ge "90" ]. Co* iti ri etitivi 13# . il ciclo continua.2I. essere qualsiasi co*ando che uE uscire con uno stato di successo o )alli*ento.3. ri*uovete le i**agini dai *esi recedenti7 #!/bin/bash # Questo script copia file dalla mia directory home in quella del webserver. o ure zero se nessuno 3 stato eseguito.2.2. . .1.sh *igliorato Hv. scri t o costrutto di shell.2.se)pio 5no scri t riordinaimmagini. 2ezione %. Il ciclo until .3. do DESTDIR=$WEBDIR/"$DATA"/"$ORA" mkdir "$DESTDIR" mv $PICDIR/*.

Non a ena tutte le linee di i**issione sono state lette. Co* iti ri etitivi 13$ .ino a che ci sono linee di i**issione nel ciclo. e i cicli .#. mv "$file".#. &edirezione dell7i))issione Invece di controllare un ciclo testando il risultato di un co*ando o in base all:i**issione dell:utente. la redirezione dovrebbe avvenire do o l:istruzione done. In tali casi.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. . verso cui # vengono spostati i vecchi file. . La redirezione dell7I?. il ciclo esce. 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. otete s eci)icare un )ile da cui leggere l:i**issione che controlla il ciclo.. read 3 il co*ando di controllo.1. NUMARCHIVIO=`date +%Y%m%d` DESTDIR="$PWD/archivio-$NUMARCHIVIO" mkdir "$DESTDIR" # uso degli apici per intercettare i nomi di file che contengono spazi.. +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. # Potrebbe essere qualcosa per cron (se leggermente adattato) da eseguirsi # settimanalmente o mensilmente.sh #!/bin/bash # Questo script crea una sottodirectory nella directory corrente.gz "$DESTDIR" echo "$file archived" done I )ile vengono co* ressi riva di s ostarli nella directorG di archiviazione..#.2. Ca itolo %. # uso di read -d per un utilizzo maggiormente aprova di errore: find "$PWD" -type f -a -mtime +5 | while read -d $'###BOT_TEXT###00' file do gzip "$file".. l:esecuzione dei co*andi del ciclo continua. . &edirezione dell7e)issione Nell:ese* io sottostante. in *odo da corris ondere alla )or*a comando H file 9uesto genere di redirezione )unziona anche con altri ti i di cicli. s esso.

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

*) echo "Quella non è una scelta valida: prova un numero da 0 a 10. . 2e non va )atta alcuna conversione.. 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. 0) echo "OK. do if [[ "$nome" != *[[:upper:]]* ]]. 4uardate le agine info er *aggiori notizie. la variabile di controllo releva il valore dell:ele*ento successivo della lista. . un co*ando continue riavvia l:esecuzione del ciclo. 9uando viene usato in un costrutto -hile o until. then continue fi ORIG="$nome" NUOVO=`echo $nome | tr 'A-Z' 'a-z'` Ca itolo %.2. ri rende invece l:esecuzione con )GQ7?@G'T%ST all:inizio del ciclo. -hile o select. 9uando viene usato in un ciclo for. 10) $FORTUNE educazione .$. non lo scri t.. 9uesti co*andi non *angiano tro e risorse del siste*a e. ris ar*iando risorse di siste*a.. roble*i si*ili ossono essere risolti usando sed e a-!..$. L7integrato continue 8:istruzione continue ri rende l:iterazione di un ciclo enclosing for..3.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". Co* iti ri etitivi 137 .se)pi Nell:ese* io seguente i no*i dei )ile vengono convertiti in lettere *inuscole. arrivederci!" break ." . [carol@octarine ~/test] cat inminuscolo. CiE si uE di*ostrare aggiungendo un co*ando echo al ter*ine dello scri t... che otrebbero anche non essere necessari quando si inseriscono dei test nei osti giusti di uno scri t. /uttavia 3 utile conoscere questo ti o di costruzione quando si eseguono dei co* iti esanti. . esac done 'icordatevi che brea! interro* e il ciclo. *olto )acil*ente.

mv "$ORIG" "$NUOVO" echo "Il nuovo nome di $ORIG è $NUOVO" done 9uesto scri t ha al*eno un di)etto7 sovrascrive i )ile esistenti. *a 3 sicura solo in caso di una sovrascrittura accidentale. .1. 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. 8:o zione noclobber er -ash 3 utile solo quando avviene una redirezione.1. 6so di select Il costrutto select er*ette una generazione se* lice di *enu.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 . LISTA 3 sta* ata Ca itolo %. 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..%./ test test~ Il tr 3 arte del acchetto textutil 7 uE eseguire tutti i ti i di tras)or*azioni di caratteri. 8:o zione -b al co*ando m )ornisce *aggiore sicurezza. co*e se )osse stato s eci)icato in $@./ . Co* iti ri etitivi 13" ..1. In generale .%. 2e non 3 resente in LISTA/ vengono sta* ati i ara*etri osizionali. 8:es ansione viene sta* ata nell:errore standard H tandard errorI7 ciascuna voce 3 receduta da un nu*ero.%.. generando un elenco di voci. Creazione di )enu con l7integrato select ..

. 2e questa linea consiste in un nu*ero che corris onde ad una delle voci. 2e la linea 3 vuota. Co* iti ri etitivi 13% . +al *o*ento che la *aggioranza degli utenti non ha un indizio su quale chiave sia usata er la sequenza 6. 9uesto interro* e il ciclo.sh Questo script può rendere privato qualunque file di questa directory. 9ualsiasi altro valore della linea letta i* oster! PAROLA a))inché sia una stringa nulla.se)pi 9uesto 3 un ese* io *olto se* lice.sh #!/bin/bash echo "Questo script può rendere privato qualunque file di questa directory.H6nd .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. 2e viene letto un carattere %&. non 3 *olto alla ortata degli utenti7 [carol@octarine testdir] cat private. le voci e l:invito PS3 vengono nuova*ente *ostrati.ileI. . il ciclo si interro* e.%.solo una volta..1. 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!. co*e otete vedere. il valore di PAROLA viene i* ostato con il no*e di quella voce. ora è accessibile solo a te. 8a linea letta viene salvata nella variabile REPLY. *a.) . do echo "Hai scelto $NOMEFILE ($REPLY).2./private. 3 i@ alla loro ortata avere un co*ando brea! co*e una delle voci." break Ca itolo %." echo "Inserisci il numero del file che desiderate proteggere:" select NOMEFILE in *." touch "$ABBANDONO" select NOMEFILE in *." echo "Inserisci il numero del file che intendi proteggere:" PS3="La tua scelta: " ABBANDONO="TERMINA QUESTO PROGRAMMA – Ora miu sento sicuro. Con la sta* a di tutte le voci. viene sta* ato l:invito PS3 e viene letta una sola linea dall:i**issione standard. ." chmod go-rwx "$NOMEFILE" done [carol@octarine testdir] . do case $NOMEFILE in "$ABBANDONO") echo "Uscita.. Inserisci il numero del file che desiderate proteggere: 1) archivio-20030129 2) bash 3) privato.

e N 3 #.. 8o stato di ritorno 3 zero a *eno che N sia *aggiore di \P o *inore di zero7altri*enti 3 non<zero. Il nu*ero degli argo*enti viene ridotto ogni volta che shift viene eseguito e )inal*ente diventa zero. esac done rm "$ABBANDONO" . Co* iti ri etitivi 1#( .. un nu*ero. usa istruzioni shift er elaborare ogni )ile nella lista generata Ca itolo %. 3otto)enu 9ualunque istruzione all:interno di un costrutto select uE essere un altro ciclo select.%.2. 9uesto co*ando rende un solo argo*ento.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. $10 diventa $7 e gli originali $1. In tali casi. v.2. 9uesta condizione 3 vera er tutto il te* o che il nu*ero degli argo*enti 3 *aggiore di zero.1. +i base la variabile P23 non viene *odi)icata quando si inserisce un ciclo select annidato. i ara*etri osizionali non vengono *odi)icati Hil nu*ero totale di argo*enti. al che il ciclo -hile ter*ina. .. Che cosa (a? Il co*ando shift 3 uno degli integrati della shell -ourne che giungono con -ash. 2ezione 7.. $2 e $3 vengono scartati..2I e il co*ando non ha e))etto. $5 diviene $2 e cosD via.'.sh. I ara*etri osizionali da N]1 a \P vengono rino*inati con i no*i di variabile da $1 a $# . 2u onete di avere un co*ando che accetta 1( argo*enti. 8:ese* io sottostante. gli argo*enti vengono nor*al*ente elaborati in un ciclo -hile con una condizione di veri)ica ari a HH\PII.1.'. er ese* io quando gli utenti ossono dare quanti argo*enti desiderino. 8a variabile $1 e l:istruzione shift )anno elaborare ogni ele*ento. I ara*etri osizionali vengono s ostati a sinistra da questo nu*ero. *) echo "Hai scelto $NOMFILE ($REPLY)" chmod go-rwx "$NOMEFILE" .2. L7integrato shi(t .. 2e N 3 zero o *aggiore di \P. 2e volete un invito diverso nel sotto*enu. assicuratevi di i* ostarlo al *o*ento giusto. 2e N non 3 resente. . si su one che sia 1. 6. abilitando sotto*enu dentro *enu. . pulizia..'. allora $4 diviene $1.N+1.

3o))ario In questo ca itolo abbia*o trattato di co*e ossano essere incor orati dei co*andi ri etitivi in Ca itolo %. 2oltanto do o verr! chia*ato il co*ando da eseguire7 nell:ese* io so rastante questo dovrebbe essere rm. verr! utilizzata una nuova linea di co*ando. Co* iti ri etitivi 1#1 . Nel rossi*o ese* io abbia*o *odi)icato lo scri t della 2ezione ". 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.. +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. )ino a che questa sar! iena o )inché non ci saranno i@ argo*enti. 2e ci sono i@ argo*enti. CosD )acendo.# in *odo che accetti i@ acchetti da installare alla volta7 #!/bin/bash if [ $# -lt 1 ]. 9uesto ha il vantaggio che la linea di co*ando viene rie* ita )ino a raggiungere il li*ite del siste*a. l:uso di +args velocizza arecchio i vostri scri t e le restazioni della vostra *acchina.. do if [[ $(ls "$1") == "" ]]. do yum install "$1" << CONFIRM y CONFIRM shift done .2. dirN" if [ "$#" == "0" ]. fi shift done 'e+ec s." else find "$1" -type f -a -atime +365 -exec rm -i {} \.da find7 #!/bin/bash # Questo script può cancellare file usati per l'ultima volta oltre 365 giorni fa.#. niente da fare. then echo "Directory vuota. then echo "$USO" exit 1 fi while (( "$#" )). then echo "Uso: $0 pacchetto/i" exit 1 fi while (($#)).. USO="Uso: $0 dir1 dir2 dir3 .*.

etc in *odo che un a**inistratore di siste*a rinci iante ossa *odi)icare )ile senza ti*ori. .sh della 2ezione 7. -hile o until. sta* ate un *essaggio sull:uso. Il ciclo for esegue un co* ito er un deter*inato nu*ero di volte. utilizzate until o -hile er recisare quando il ciclo dovrebbe ter*inare. Co* iti ri etitivi . 2crivete uno scri t che renda esatta*ente un argo*ento. 1. un de*one dei no*i.$. co*e 1 ache.sercizi 'icordate7 quando realizzate scri t. Non )ate lavori inutiliV &. 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 %.. Il costrutto select si usa er sta* are *enu negli scri t interattivi. Create uno scri t che )ar! una co ia HricorsivaI dei )ile in . il de*one N/P. un de*one della gestione dell:ali*entazione e cosD viaN  er ogni scelta l:utente ossa )are. 2e non sa ete quante volte un co*ando dovrebbe essere eseguito.. co*e il no*e del >eb server. sta* ate un altro *essaggio. I cicli si ossono interro* ere o ri etere utilizzando le istruzioni brea! e continue. .$. un no*e di directorG.#. o ure una co*binazione di questi co*andi. 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. 8a *aggior arte dei co*uni cicli vengono realizzati utilizzando le istruzioni for. veri)icate se un )ile esiste o *eno. $. 2e l:argo*ento non 3 una directorG.costrutti di ciclo. Pensate ad una *igliore soluzione ris etto a mo e -b er lo scri t della 2ezione %.$ Jesercizio n. sta* i alcune in)or*azioni sensibili.1 *a ensate ad un *odo er ter*inare do o che l:utente ha eseguito 3 cicli. 2e il nu*ero degli argo*enti 3 *aggiore o *inore di uno.3 er revenire la sovrascrittura dei )ile esistenti. Potete s iegare erché 3 cosD i* ortante *ettere le variabili tra a ici do della 2ezione %. Per ese* io. 2crivete uno scri t si*ile a quello in 2ezione %. 'iscrivete lo scri t qualedemone. 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.2? i nell:ese* io #. 3.$K in *odo che7  sta* i un elenco dei server da controllare. il server 22B. +ella directorG indicata sta* ate i ri*i cinque )ile i@ grandi e i cinque )ile che sono stati *odi)icati i@ di recente. lavorate a assi e rovate ogni asso ri*a di incor orarlo nel vostro scri t.. 2.

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

ossia*o li*itare l:assegna*ento di valori alle variabili. ciE dovr! essere )atto una sola volta. -ash co* rende *olti ti i diversi di variabili o ara*etri.Capitolo 1-.inora non ci sia*o interessato *olto a quale genere di variabile abbia*o assegnato. una cosiddetta matrice Ho arra!I di variabili HVAR0. 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. 2ssegna)ento di valori in generale Co*e abbia*o visto. +i i@ sulle variabili 1## . otete anche s eci)icare una variabile che sia una costante. 6so dell7integrato declare 5tilizzando un:istruzione declare.1.2. VAR1.1. 1-. i VARNI. er ese* io quando si gestiscono nu*eri tele)onici e di altro ti o.1. 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. cosicché. esistono solo ri)eri*enti al no*e di variabile della costante. cosicché le nostre variabili otrebbero contenere qualsiasi valore assegnato loro. 0ipi di variabili 1-. 5na variabile uE essere anche una serie di variabili di qualsiasi ti o. quando viene dichiarato il valore della costante. VAR2. . CiE viene )atto s esso all:inizio di uno scri t. 8a sintassi er declare 3 la seguente7 declare OPZIONI VARIABILEN alore Ca itolo 1(. 1-. quando 3 necessario *odi)icare la costante. +i piD sulle variabili In questo ca itolo trattere*o l:uso avanzato delle variabili e degli argo*enti. +o o di ciE. 1 arte gli interi e le variabili.1.

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.&I. [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. 9uando si usa < le o zioni aggiuntive vengono ignorate. se nulla 3 stato s eci)icato. +! ad ogni variabile l:attributo trace. 9uesto 3 erché. 9uando si utilizza in una )unzione.3. di base. =ostra gli attributi e valori di ogni variabile. -r -t -x 8:uso di ] al osto di O disabilita invece l:attributo. essa uE contenere solo quel ti o di dati. ed esse ne ure ossono essere eli*inate. 8:integrato readonl. 1-. 1 queste variabili do o non ossono essere attribuiti valori con susseguenti istruzioni di assegna*ento. 8a variabile viene trattata co*e un intero7 la valutazione arit*etica si esegue quando viene assegnato un valore alla variabile Hv. 2ezione 3. 4uardate le agine in)o di -ash er in)or*azioni sullo stato di ritorno. declare crea variabili locali. *a nessuna er dichiarare valori stringa. 2olo utilizzo di no*i di )unzione. *arca ogni Ca itolo 1(.1.#. 'estrizioni ossibili sono intero. costante o *atrice. =arca ciascuna variabile er l:es ortazione verso co*andi successivi tra*ite l:a*biente. +i i@ sulle variabili 1#$ . Costanti In -ash le costanti si creano rendendo a sola lettura una variabile.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. 'ende a sola lettura le variabili. 8:ese* io seguente *ostra co*e l:assegna*ento di un ti o ad una variabile in)luenzi il valore.

2.s eci)icata variabile co*e i**odi)icabile. +i i@ sulle variabili 1#& . o ure sia stata )ornita -f er un no*e di variabile al osto di un no*e di )unzione. una delle variabili o )unzioni non esista. 8e variabili *atriciali ossono essere create anche utilizzando assegna*enti co* osti in questo )or*ato7 Ca itolo 1(. 8a dichiarazione indiretta si e))ettua utilizzando la seguente sintassi er dichiarare una variabile7 MATRICE[NUMINDICE]N alore 6(. ogni variabile si ri)erisce ad una )unzione di shell7 v. 8a sintassi 37 readonl. 2e non 3 stato dato nessun argo*ento. 2e 3 stata data l:o zione -f. viene *ostrato un elenco di tutte le variabili a sola lettura. [bob in ~] readonly TUX=penguinpower [bob in ~] TUX=Mickeysoft bash: TUX: readonly variable 1-.1. 5sando l:o zione -p.gni variabile uE essere utilizzata co*e *atrice. 1ariabili )atriciali 1-. 4li attributi si a licano a tutte le variabili della *atrice7non otete avere delle *atrici *iste. Ca itolo 11.2.)6D)C% viene trattato co*e una es ressione arit*etica che deve essere calcolata co*e nu*ero ositivo. . o 3 stata )ornita -p.. Non esiste un li*ite *assi*o alle di*ensioni di una *atrice. tutte le variabili si ri)eriscono ad una *atrice di variabili. l:e*issione uE essere rei* iegata co*e i**issione. 8e *atrici artono da zero7 il ri*o ele*ento 3 indicizzato con il nu*ero (. *a il nu*ero di indice sar! ignorato. 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. e ne ure un qualche requisito che le variabili *e*bri siano indicizzate o assegnate in *odo contiguo. 4li attributi della *atrice si ossono s eci)icare utilizzando gli integrati declare e readonl. 8o stato di ritorno 3 zero. Creazione delle )atrici 5na *atrice Jarra!K 3 una variabile che contiene *olte lici valori. OPZIONE VARIABILI I valori di queste variabili do o non si ossono i@ ca*biare con un successivo assegna*ento. 2e 3 stata s eci)icata -a. a *eno che sia stata s eci)icata un:o zione non valida.

2. CiE 3 necessario. [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. +ere(erenzia)ento delle variabili di una )atrice Per )are ri)eri*ento al contenuto di una voce di una *atrice. l:indicizzazione inizia da zero. co*e otete constatare nell:ese* io seguente. 9uesto )or*ato 3 accettato anche da declare. 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.2. 1-. 2e 3 )ornito. che consente la lettura e l:assegna*ento di valori alle variabili *e*bri di una *atrice. 2e il nu*ero di indice 3 _ o ^.2.3.MATRICEN9 alore1 aloreP X alore?: . 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. usate le arentesi gra))e. 1-. er scavalcare l:inter retazione degli o eratori di es ansione da arte della shell. tutti i *e*bri di una *atrice sono re)erenziati. 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(. quello re)erenziato con nu*ero di indice zero. 2e non vengono )orniti nu*eri d:indice. Il nu*ero d:indice 3 )acoltativo.gni valore 3 oi nella )or*a di @numeroindiceCD tringa. +i i@ sulle variabili 1#7 .

Ca itolo 1(. 5n:altra ragione er cui sono di))icili da trovare dei buoni ese* i 3 che non tutte le shell su le *atrici. nel linguaggio di rogra**azione C con cui 3 scritta la *aggioranza dei co*andi 5NIF. )inal*ente ho trovato questo ese* io o erando resso un )ornitore HproviderI Internet. 8a ragione di questa *onotonia 3 che le *atrici sono strutture iuttosto co* lesse. che 3 elaborato quando si co* ilano gli integrati. I no*i degli host che necessitano di essere con)igurati sono elencati nella *atrice farm_hosts. er ese* io. sebbene in un livello i@ basso. Notate l:utilizzo dei co*andi della suite 2ecure 2hell nel cri tare le connessioni verso gli host re*oti. /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. 6 questo sarebbe uno degli ese* i i@ interessante. ortano +o o lunghi giorni di ricerche. cosicché esse in)rangono la co* atibilit!. Poi tutti questi host vengono )orniti tra*ite il )ile di con)igurazione di 1 ache.. then echo "Uso: $0 </path/to/httpd.#. then echo "Bisogna essere root per avviare $0" exit 1.[bob in ~] echo ${MATRICE[*]} <--no output--> 1-.2. +i i@ sulle variabili 1#" . di -ash.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. 9uei lettori che )ossero interessati otrebbero controllare la directorG built-ins nell:albero dei sorgenti di -ash dare un occhio a fc.. .se)pi di )atrici 6se* i ratici dell:uso delle *atrici sono di))icili da trovare. do o di che si riavvia il de*one. fi if [ -z $1 ]. 6sso distribuisce i )ile di con)igurazione del >eb server 1 ache negli host di una >eb )ar*7 #!/bin/bash if [ $(whoami) != 'root' ]. 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.def. 5n buon ese* io 3 il co*ando integrato histor. 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.

# Nome di questa macchina. 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. # # Invia una e-mail alla persona giusta. week=${week#0} # Remove possible leading zero. co*e questo che utilizza un docu*ento here7 email=`get-tester-address.53).) # count=0 while [ "x${wholist[count]}" != "x" ] do count=$(( $count + 1 )) done # # Now we calculate whose turn it is.com>' 'Larry Wall <wall@example. # week=`date '+%W'` # The week of the year (0. # (Loop until we find an empty string.com>' 'Linus Torvalds <linus@example.sh` hostname=`hostname` # Trova a chi mandare una e-mail. 6ugene e collega. er questo contributo. 6 questo 3 stato il suo *odo di risolverlo7 #!/bin/bash # This is get-tester-address. let "index = $week % $count" email=${wholist[index]} echo $email # week modulo count = the lucky person # Get the lucky person's e-mail address. (Feel free to add or # remove candidates. # Output the person's e-mail address.) # wholist=( 'Bob Smith <bob@example. # (Support for arrays was only added recently. # mail $email -s '[Demo Testing]' <<EOF The lucky tester this week is: $email Reminder: the list of demos is here: http://web. +i i@ sulle variabili 1#% . we test whether bash supports arrays.' && exit 2) # # Our list of candidates.com>' 'Jane L..com:8080/DemoSites Ca itolo 1(. Williams <jane@example.4razie.com>' ) # # Count the number of possible testers. CosD ho un:attivit! di cron che rie* ie una *atrice con tutti i ossibili candidati.example.com>' 'Eric S.) # whotest[0]='test' || (echo 'Failure: arrays not supported in this version of bash. /ale scri t viene oi usato in altri scri t. 8a ersona )ortunata viene noti)icata tra*ite osta elettronica[. Raymond <esr@example.sh # # First. usa date +%W er trovare la setti*ana dell:anno ed esegue un:o erazione di *odulo er trovare l:indice corretto. +an 'ichter ha contribuito all:ese* io seguente.

3.1. 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. 3ostituzione AMVAR:-PAROLAO 2e VAR non 3 de)inita o 3 nulla. Lunghezza di una variabile 5sando la sintassi ${#VAR} si calcoler! il nu*ero dei caratteri in una variabile. +i i@ sulle variabili 1$( . 1-.3.) EOF 1-. altri*enti viene sostituita dal suo valore.2. la sostituisce l:es ansione di PAROLA.3.(Questa e-mail è stata generata da $0 su ${hostname}.3. 0ras(or)azioni di variabili 1-. questo valore viene sostituito con il nu*ero dei ara*etri osizionali o il nu*ero di ele*enti di una *atrice in generale. . 2e VAR 3 [*[ o [@[. er ese* io in questo7 Ca itolo 1(.3.perazioni su variabili 1-. [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.3. 2rit)etica con le variabili 1bbia*o gi! trattato di questo nella 4ezione 1/</>.1.

2e il trattino H<I viene sostituito con il segno uguale HbI./vartest.2.3 er *aggiori in)or*azioni su questo ti o di rova delle condizioni.[ -z "${COLONNE:-}" ] && COLONNE=80 6: una notazione abbreviata er if [ -z "${COLONNE:-}" ]..2. da una variabile.sh presente TESTVAR è stata dichiarata.sh #!/bin/bash # Questo script controlla se una variabile è stata dichiarata. uguale a OFFSET. In caso contrario. 5na di*ostrazione7 [bob in ~] cat vartest. possiamo procedere. 2e non 3 stata i* ostata. # esce stampando un messaggio. &i)ozione di sottostringhe Per togliere un nu*ero di caratteri." [bob in testdir] . then COLONNE=80 fi 4uardate la 2ezione 7./vartest. si sta* a l:es ansione di PAROLA nell:e*issione standard H tandard outputI e le shell non interattive si chiudono."} echo "TESTVAR è stata dichiarata. +i i@ sulle variabili 1$1 .3. 1-. echo ${TESTVAR:?"C'è così tanto che ancora volevo fare. usate questa sintassi7 ${VAR:OFFSET:LUNGHEZZA} Il ara*etro LUNGHEZZA de)inisce quanti caratteri tenere. non succede nulla. 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..1. 2e viene o*esso LUNGHEZZA. 8:uso di [][ al osto del unto escla*ativo i* osta la variabile er l:es ansione di PAROLA7 se non esiste./vartest. [bob in testdir] export TESTVAR=presente [bob in testdir] .3.sh . possiamo procedere. viene resa la restante arte del contenuto della variabile7 [bob in ~] export STRINGA="questoeunnomemoltolungo" [bob in ~] echo ${STRINGA:6} Ca itolo 1(.sh: line 6: TESTVAR: C'è così tanto che ancora volevo fare.. a co*inciare dal ri*o carattere do o il unto di o))set..

2e VAR 3 * o @. PAROLA si es ande er rodurre un *odello ro rio co*e nell:es ansione dei no*i di )ile. +i i@ sulle variabili 1$2 . &i)piazzare parti di no)i di variabili 9uesto si )a utilizzando la sintassi ${VAR/MODELLO/STRINGA} Ca itolo 1(. 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. 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 [_[. co*e nell:ese* io sottostante.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. 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[. 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. 2e il *odello coincide con l:inizio del valore es anso di VAR.3.3. 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.

sercizi 9ui ci sono alcuni ro* ica i7 1. 'edigete uno scri t che i* le*enti un se* lice navigatore >eb Hin *odalit! testualeI. uno. 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. sostituzione del contenuto delle variabili e di arte di esso.  2ta* i tutti i valori degli argo*enti restanti. 2e viene dichiarato un ti o di dato. inserire i er indietro e t er ter*inare.  2e ci sono i@ di tre ara*etri osizionali.$. 'edigete uno scri t che )accia quanto segue7  =ostri il no*e dello scri t che 3 in esecuzione. +i i@ sulle variabili 1$3 . 3o))ario Nor*al*ente una variabile uE contenere qualunque ti o di dati. Controllate con zero. a *eno che siano dichiarate es licita*ente. arit*etica con le variabili. 1-.  =ostri il nu*ero totale di argo*enti assati allo scri t. 1-.  =ostri il ri*o. . usando -get e lin!s -dump er *ostrare le agine B/=8 all:utente. allora tutti gli ele*enti della *atrice saranno i* ostati er contenere solo questo ti o di dato. terzo e deci*o argo*ento )ornito allo scri t. 8e )unzionalit! di -ash consentono la sostituzione e la tras)or*azione [al volo[ delle variabili. 9uest:ulti*o ha tre scelte7 inserire un 5'8.  2ta* i il nu*ero di argo*enti. 8e variabili costanti si i* ostano usando il co*ando integrato readonl. 4li ulti*i 1( 5'8 inseriti Ca itolo 1(. tre e i@ di dieci argo*enti.#. 5na *atrice contiene un insie*e di variabili. 8e o erazioni standard co* rendono il calcolo della lunghezza di una variabile.. usate shift er *uovere tutti i valori di 3 osizioni verso sinistra.

da cui il *edesi*o utilizzando la )unzionalit! indietro. uE ri ristinare l:5'8 Ca itolo 1(. +i i@ sulle variabili 1$# .dall:utente sono conservati in una *atrice.

return. . l:elenco dei co*andi associati con quella )unzione viene eseguito. 11. e+it.. +egli s eciali co*andi integrati si trovano ri*a delle )unzioni di shell durante la ricerca dei co*andi. /unzioni In questo ca itolo trattere*o di7  Cosa sono le )unzioni  Creazione e ra resentazione di )unzioni da linea di co*ando  . 4li integrati s eciali sono7 brea!. readonl.1.1. continue. se non 3 utilizzato.. . /utti i co*andi che costituiscono una )unzione vengono eseguiti co*e dei nor*ali co*andi.. Introduzione 11.1. sono necessarie le arentesi. 9uando si chia*a una )unzione co*e un se* lice no*e di co*ando. e+port.unzioni 1$$ .2. utilizzando un solo no*e er questo gru o o routine. /ali co*andi sono Ca itolo 11. I co*andi elencati tra le arentesi gra))e costituiscono il cor o della )unzione. Cosa sono le (unzioni? 8e )unzioni di shell sono un *odo di raggru are co*andi er l:esecuzione successiva .unzioni negli scri t  Passaggio di argo*enti alle )unzioni  9uando usare le )unzioni 11. set.1.Capitolo 11. 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. 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?%. . Il no*e della routine deve essere univoco all:interno della shell o dello scri t. e al. 8:uso del co*ando integrato function 3 )acoltativo7 tuttavia. e+ec. trap e unset. shift.

unzioni 1$& . 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." echo test () { echo "Parametro posizionale 1 nella funzione è $1. 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. 5n se* lice ese* io7 [lydia@cointreau ~/test] cat mostraparam. 2e l:integrato return viene eseguito in una )unzione. gli argo*enti di questa diventano ara*etri osizionali durante la sua esecuzione. viene restituito quello stato. Il cor o di una )unzione dovrebbe ter*inare con un unto e virgola o un nuovalinea. 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. I para)etri posizionali nelle (unzioni 8e )unzioni sono co*e dei *iniscri t7 ossono accettare ara*etri.1. 9uando si esegue una )unzione.sh #!/bin/bash echo "Questo script mostra gli argomenti delle funzioni./mostraparam. 8a variabile di -ash FUNCNAME 3 i* ostata con il no*e del FUNCNAME della )unzione durante la sua esecuzione. Ca itolo 11." VALORE_RITORNO=$? echo "Il codice di uscita di questa funzione è $VALORE_RITORNO.sh parametro1 Questo script mostra gli argomenti delle funzioni. Il ara*etro osizionale ( non viene *odi)icato. 5na )unzione ha anche un siste*a er inter retare i ara*etri osizionali. 9uando si conclude una )unzione. 2e viene attribuito un argo*ento nu*erico a return. altri*enti vengono inter retate nel *odo sbagliato. la )unzione si co* leta e ri rende l:esecuzione con il co*ando successivo alla chia*ata della )unzione." } test altro_param [lydia@cointreau ~/test] . 11. . /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.eseguiti ogni qualvolta si s eci)ica FK?YIG?% co*e il no*e di un co*ando.3." echo echo "Parametro posizionale 1 dello script è $1. usare variabili conosciute solo all:interno della )unzione Hutilizzando l:integrato di shell localI e restituire valori alla shell chia*ante.

27 dir () { ls -F --color=auto -lF --color=always "$@" | less -r } Ca itolo 11. 9ostrare le (unzioni /utte le )unzioni note alla shell corrente ossono essere *ostrate usando l:integrato set senza o zioni. cosicché questa uE essere interrogata in un unto successivo.#. [lydia@cointreau ~/test] Notate che il valore di ritorno o il codice d:uscita della )unzione sono s esso conservati in una variabile. +o o l:utilizzo. le )unzioni vengono conservate. Il codice di ritorno della )unzione 3 s esso utilizzato co*e codice d:uscita dell:intero scri t. 6cco qui una er gli utenti +. 11. 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. a *eno che non venga usato unset su di loro do o l:uso.d/amd. 8e )unzioni sono i@ )lessibili ris etto agli alias e )orniscono un *odo se* lice e )acile er adattare l:a*biente dell:utente.unzioni 1$7 . ro rio co*e questo7 if [ $RETVAL -eq 0 ]. then <avvia il demone> . . 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.Parametro posizionale 1 dello script è parametro1.fi. Il codice di uscita di questa funzione è 0. 0edrete una quantit! di initscri t ter*inanti in qualcosa di si*ile a e+it $RETVAL. co*e questo ese* io dallo scri t /etc/init. 4li scri t init nel vostro siste*a usano s esso la tecnica di interrogare la variabile RETVAL in un test condizionale.1. Parametro posizionale 1 nella funzione è altro_param.then.

che 3 riscontrabile in tutti gli scri t init. in scri t di))erenti. avviare e )er*are un de*one e cosD via. Ca itolo 11. Potreste realizzare il vostro )ile ersonale /etc/functions che contenga tutte le )unzioni che usate regolar*ente nel vostro siste*a.unzioni 1$" . *entre root ottiene una co ia di directorG eAtra contenenti co*andi di siste*a.2. viene aggiunto. then if [ "$2" = "dopo" ] . =ettete solo la linea . troverete il )ile di de)inizione /etc/rc. 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($|:)" . . 2e questo no*e di ercorso non 3 ancora nel ercorso corrente. la )unzione subisce unset cosicché non viene conservata.1.d/function. devono essere scritti solo una volta.11. in *odo generico. er ese* io. then PATH=$PATH:$1 else PATH=$1:$PATH fi fi } # Manipolazione del percorso if [ `id -u` = 0 ].d/init. Il secondo argo*ento alla )unzione de)inisce se il ercorso sar! aggiunto davanti o dietro la de)inizione del PATH J ercorsoK corrente.se)pi di (unzioni negli script 11.2. 11. o erazioni co*uni co*e controllare se il rocesso gira. 5sando questo *etodo. .2. In alcuni siste*i 8inuA. 4li utenti nor*ali ottengono solo l:aggiunta di /usr/X11R6/bin ai loro ercorsi. &iciclaggio Nel vostro siste*a ci sono quantit! di scri t che usano )unzioni co*e *odo strutturato di gestire serie di co*andi. 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. +o o essere stata usata. 2e la stessa o erazione serve di nuovo. il codice viene riciclato.2./etc/functions da qualche arte all:inizio dello scri t e otete riciclare le )unzioni. I)postazione del percorso 9uesta sezione si otrebbe trovare nel vostro )ile /etc/profile.

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

. 3o))ario 8e )unzioni )orniscono un *odo )acile er raggru are co*andi che vi serve eseguire ri etitiva*ente. questo non 3 ciE che volete. 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. . cosicché redirigia*o l:errore standard H tandard errorI dal co*ando scp verso /dev/null.9uesto scri t viene avviato da cron Hsigni)ica senza interazione u*anaI. se siete interessati ai risultati inter*edi che otrebbero essere ri ristinati in caso di )alli*ento dello scri t. ro rio co*e gli scri t. . 9uando una )unzione sta )unzionando.sercizi 9ui ci sono alcune cose utili che otete )are usando le )unzioni7 1.bashrc che auto*atizzi la sta* a delle agine *an. inserite la ossibilit! er l:utente di )ornire il nu*ero di sezione delle agina *an che vuole sta* are. 2ebbene questo sia stato un ca itolo breve. 2.ate le veri)iche usando una seudo eri)erica di sta* a er rovare le )unzionalit!. 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. Co*e eAtra. 1ggiungete una )unzione al vostro )ile di con)igurazione ~/. 8e )unzioni sono dei *iniscri t e. 8:es ressione comando 8I file equivale a comando I file PI81 11.bz2L /uttavia . Il risultato dovrebbe essere che digitate qualcosa co*e printman HcomandoI. essi vengono ri ortati a quelli del rogra**a chia*ante.3. 9uando si )er*a. i ara*etri osizionali vengono *odi)icati in quelli della )unzione. in *odo che la ri*a a ro riata agina *an esca dalla vostra sta* ante. Create una sottodirectorG nella vostra directorG Ca itolo 11.#. 11. generano dei codici d:uscita o di ritorno.tar.unzioni ersonale in cui otrete conservare le 1&( .

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

1.1. in base al vostro siste*a o erativo. una shell interattiva -ash ignora 4)'T%9. Ca itolo 12. *a. 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 alla vostra shell Bash In assenza di qualsiasi intercettazione.1. 4)'TT&( e 4)'4T&P sono ignorati.1.1. utilizzando l:integrato shopt. 3egnali 12. 4)')6T viene intercettato e gestito. 5sate l:o zione hu oneAit er uccidere H killingI tutti i lavori alla ricezione di un segnale 4)'7(P. 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. ure 4)'TT)6. e 4)'E()T. e se il controllo del lavori H jobI 3 attivo. 4)'7(P nor*al*ente ter*ina una shell. In caso di dubbio.1.2. quando generati da tastiera. 12. 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. 0rovare la pagina )an dei segnali Il vostro siste*a contiene una agina *an che elenca tutti i segnali dis onibili. Ignorano questi segnali anche i co*andi che sono stati avviati co*e risultato di una sostituzione di co*andi. Cattura dei segnali 1&2 . otrebbe essere a ribile in *odo di))erente. In *olti siste*i 8inuA. ciE otrebbe essere man Z signal.1. Introduzione 12.Capitolo 12. 5na shell interattiva invier! un 4)'7(P a tutti i lavori.

. ?ome segnale Salore segnale 2I4B5P 2I4IN/ 2I4SI88 1 2 % %ffetto 1ggancia Interruzione da tastiera 2egnale di ?ill 1&3 Ca itolo 12.#. *ettere dietro le quinte o uccidere un rocesso.2. 8a sos ensione ed il ri ristino delle e*issioni sono di solito disabilitate se state usando [*oderne[ e*ulazioni di ter*inale. se nessuno viene indicato. diverso da zero se 3 ca itato un errore. 6so dei segnali con Cill 8a *aggioranza delle *oderne shell.#1/ 4egnali di controllo in 3a h )ombina1ione Significato standard dei tasti )trl*) Il segnale di interruzione. Il controllo viene restituito alla shell e l:utente uE *ettere in ri*o iano. co*e con pgrep e p!ill. 8a sos ensione ritardata 3 dis onibile solo in siste*i o erativi che su ortino tale )unzionalit!. invia 2I4IN/ al lavoro che sta girando in ri*o iano Il carattere di o pen ione ritardata. in *odo da )er*arlo e restituire il controllo alla shell.12.3.1. Invio di segnali usando la shell 5sando la shell -ash si ossono inviare i segnali seguenti7 Tabella 1. In -ash sia i no*i che i nu*eri dei segnali vengono accettati co*e o zioni. 12.1. 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. Il segnale di o pen ione invia un 4)'4TP ad un rogra**a attivo. -ash co* resa. 6ntra*bi i co*andi !ill inviano il segnale T%9. )trl*[ )trl*Y Imposta1ione del terminale Controllate le vostre i* ostazioni stt.1. il vostro siste*a otrebbe abilitare delle o zioni eAtra. e gli argo*enti otrebbero essere un lavoro HjobI o un I+ di rocesso. 8o standard +term su orta in *odo rede)inito )trl*S e )trl*Q. hanno una )unzione !ill integrata. 2i uE rivere uno stato d:uscita utilizzando l:o zione -l7 zero quando al*eno un segnale 3 stato inviato con successo. +eter*ina l:interruzione di un rocesso in corso quando tenta di leggere i**issioni dal ter*inale. I* iegando il co*ando !ill da /usr/bin. Cattura dei segnali . 9uesto 3 un elenco dei segnali i@ co*uni7 Tabella 1.

?ome segnale Salore segnale 2I4/6'= 2I42/. 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. 8a sintassi er l:istruzione trap 3 chiara7 trap ")GQ7?@I# "S%G?7LI# Ca itolo 12.2. dal *o*ento che otrebbe non )unzionare co*e ci si as etta in alcuni tra gli 5niA co**erciali. 23 %ffetto 2egnale di ter*inazione . 12. Cattura dei segnali 1&# . Per ese* io. 0rappole 12. sottraete qualsiasi ossibilit! al rocesso di eseguire una ulitura e chiusura ordinate. bloccati o ignorati. cosa che otrebbe avere s iacevoli conseguenze. 2e inviate un segnale 4)'F)LL ad un rocesso.P 1$ 17. i segnali )6T o F)LL otrebbero essere la sola *aniera. 4)'T%9.1. 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. 3 senso co*une iniziare a rovare con il segnale *eno ericoloso. 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. co*e la ulitura e la chiusura di )ile a erti. !illall otrebbe essere i@ conveniente7 accetta le stesse o zioni di !ill.1%..er*a il rocesso SIGVILL e SIGSTG6 2I4SI88 e 2I42/.. *a le a lica a tutte le istanze di un dato rocesso.P non ossono essere intercettati. quando un rocesso non *uore usando )trl*).2. 9uando si uccide un rocesso o una serie di rocessi. er ese* io erché si deve )ornire un:i**issione o ure deve essere eseguita una ri ulitura. 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. =a se non )unziona una chiusura ulita. Provate questo co*ando ri*a di ado erarlo in un a*bito roduttivo.

sh trap "echo Buu!. 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. o da un ciclo -hile o until.. o quando lo stato di ritorno di un co*ando viene invertito usando l:o eratore 0. 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. la tra ola non sar! eseguita )ino a che questo co*ando non sar! co* letato. non accadr! nulla7 #!/bin/bash # traptest.2. che cattura )trl*) roveniente dall:utente sta* ando un *essaggio.. che sono docu*entate nelle agine in)o di -ash. 2e uno dei segnali 3 D%3('." SIGINT SIGTERM echo "pid is $$" while : do sleep 60 done # Questo è la stessa cosa di "while true".3. la lista dei )GQ7?@I 3 eseguita do o ogni singolo co*ando.3. 12. 3coprire quando viene utilizzata una variabile 9uando si correggono scri t i@ lunghi.1.CiE istruisce il co*ando trap a catturare i 4%'6:L) elencati. Il co*ando trap accetta una co ia di o zioni. # Questo script in realtà non sta facendo nulla. che otrebbero essere i no*i di segnali con o senza il re)isso 4)'. Cattura dei segnali 1&$ . Notate che questi co*andi non saranno eseguiti quando lo stato di uscita diverso da zero roviene da una arte di un:istruzione if. 12.2. 9uando -ash 3 in attesa di un co*ando asincrono attraverso l:integrato -ait. 2e un segnale 3 B o %G)T. 9uando rovate ad uccidere questo rogra**a senza s eci)icare il segnale F)LL. otreste voler assegnare ad una variabile l:attributo trace ed intercettare i *essaggi di D%3(' di quella variabile.2.2. 9ui c:3 un ese* io *olto se* lice. o ure i nu*eri dei segnali. 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". 2ostituire la dichiarazione della variabile con le linee seguenti otrebbe )ornire una in)or*azione interessante su cosa stia )acendo il Ca itolo 12. 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. Nor*al*ente dichiarereste una variabile solo utilizzando un assegna*ento co*e S7FI7BIL%N alore. 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. subito do o l:esecuzione della tra ola. i )GQ7?@I vengono eseguiti quando la shell esce. 6lteriori ese)pi 12.

}" EXIT touch $LOCKFILE makewhatis -u -w exit 0 12. 'ealizzate uno scri t che scriva una i**agine di avvio Hboot imageI in un dischetto utilizzando il rogra**a di utilit! dd. exit 255.vostro scri t7 declare -t VARIABILE=valore trap "echo VARIABILE è in uso qui.sercizi 5na co ia di ese* i ratici7 1.cron con cron7 #!/bin/bash LOCKFILE=/var/lock/makewhatis. deco* resso. utilizzando l:istruzione trap. 9uesti segnali ossono essere intercettati.lock # Previous makewhatis should execute successfully: [ -f $LOCKFILE ] && exit 0 # Upon exit. a seconda dell:azione che uE essere eseguita.2. *ostrate un *essaggio che dica che tale azione render! inutilizzabile il dischetto. 3o))ario 2i ossono inviare dei segnali ai vostri rogra**i usando il co*ando !ill o delle scorciatoie da tastiera. 2oltanto la reale installazione del acchetto non dovrebbe essere interro* ibile.2. 8:unico segnale che nessun rogra**a uE ignorare 3 il segnale F)LL/ 12. Il acchetto deve essere scaricato da Internet." DEBUG # resto dello script 12. 'edigete uno scri t che auto*atizzi l:installazione di un acchetto di terze arti di vostra scelta. 2. trap "{ rm -f $LOCKFILE . Ca itolo 12. 2e l:utente rova ad interro* ere lo scri t usando )trl*).#. &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. Cattura dei segnali 1&& . 1lcuni rogra**i ignorano i segnali. estratto dall:archivio e co* ilato se queste azioni sono co* atibili.3. . remove lockfile.3.

Cattura dei segnali 1&7 .Ca itolo 12.

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.a coincidere qualsiasi carattere nel no*e del )ile . Notate che i co*andi sto . sus end. Caratteristiche della shell 1&" .1.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 1 endice 1 . 2. Wobs. Caratteristiche co)uni 8e seguenti caratteristiche sono standard in ogni shell. 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 .

tutti i co*andi csh )unzioneranno in tcsh. Tabella :#. -ourne 1gain 2hell HbashI. e. bash ha *olte i@ caratteristiche di er se stesso. tutti i co*andi sh )unzioneranno anche in bash O *a non viceversa. co*e di*ostrato nella tabella sottostante.71ione Invito rede)inito d:utente . )ompatibilit] delle shell +al *o*ento che -ourne 1gain 2hell 3 un su erinsie*e di sh. Caratteristiche di((erenti 8a tabella sottostante *ostra le rinci ali di))erenze tra la shell standard HshI. Sorn shell H!shI e C shell HcshI. Poiché la /urbo C shell 3 un su erinsie*e di csh.2. *a non invece al contrario.)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. 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.orzatura redirezione 'edirezione di stdout e stderr verso file 1 endice 1 . *olte di esse sono state incor orate da altre shell. Caratteristiche della shell 1&% .

file $! $source file o . Z<. file alias +N&. file alias +N. zioni correnti $! $.do set -f/ set -o nullglob|dotglob| nocaseglob|noglob hash hash cmds hash -r hash hash cmds hash -r 1 endice 1 . bN Significato. 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 .do case done esac e+it n for.sh bash MO !sh csh MO EcomandoE $home Z b<. 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.& $! $.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]. Caratteristiche della shell 17( . 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 . case done esac e+it n for.do source file alias + .

FrecciaSu*In io o >> !str !sh histor.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. essendo bash la shell 4N5 e quella i@ se* lice er i rinci ianti.do if 99i==5:: fi ulimit p-d read trap 2 unalias until -hile. trattandosi del *anuale della vostra shell. Caratteristiche della shell 171 . /est condizioni d:ese* io . 2ta* atevelo e ortatevelo a casa.do if 9i==5: endif limit dirs AH onintr unalias -hile 8a -ourne 1gain 2hell ossiede *olte altre caratteristiche qui non elencate. =aggiori in)or*azioni sulle caratteristiche riscontrabili solo in -ash si ossono rinvenire nelle agine in)o di -ash. quando eseguito.do r x=y cmd !cmd:s/x/y/ if " $i 'e( 5 # fi ulimit p-d read trap 2 unalias until -hile. >> !str Significato.sh bash histor. 1 endice 1 . 8a scelta re)erita sarebbe info bash.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[. studiatevelo ogni volta che avete $ *inuti. 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. 5lteriori in)or*azioni7 +ovreste leggere al*eno un unico *anuale. nella sezione [-ash )eatures[. r r str csh histor.

apt'get Progra**a di utilit! er la gestione dei acchetti. =aggiori in)or*azioni sull:uso si ossono trovare nelle agine *an o in)o.. esa*e o cancellazione di lavori dell:ulti*a esecuzione. alias Crea un alias di shell er un co*ando.5lossario 9uesta sezione contiene una anora*ica in ordine al)abetico dei co*andi 5NIF co*uni. aspell Controllo ortogra)ico. anacron 6segue co*andi eriodica*ente. at(.or*atta i )ile er la sta* a in una sta* ante Post2cri t. non resu apropos Cerca stringhe nella base dati >hatis. at. 2 aPps . . adduser Crea un nuovo utente o aggiorna le in)or*azioni rede)inite del nuovo utente. 4lossario 172 one una *acchina se* re in )unzione. atrm 1ccoda*ento. acroread 0isualizzatore P+.

b1ipP 5n co* ressore di )ile a ordina*ento di blocchi. cdp. 5n rogra**a interattivo in *odalit! testuale er controllare e ri rodurre C+ 'o* audio sotto 8inuA.a girare un lavoro dietro le quinte. C cat Concatena )ile e sta* a sull:e*issione standard J tdoutK. bitmap 6ditor di bit*a e utilit! di conversione er il 2iste*a F >indo>.aumi+ 'egola il *iAer audio. bg . esa*e o cancellazione di lavori dell:ulti*a esecuzione. cd Ca*bia +irectorG.cdpla. 4lossario 173 . B bash -ourne 1gain 2hell. HgIa-! 8inguaggio di analisi ed elaborazione di *odelli. batch 1ccoda*ento.

cdparanoia 5n:utilit! er la lettura di C+ audio che co* rende caratteristiche eAtra er la veri)ica dei dati. o ro rietario. csh 1 re una shell C. cdrecord 'egistra un C+<'. cho-n Ca*bia il ro rietario e il gru compress Co* ri*e )ile. cp Co ia )ile e directorG. 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