Bash programming

Click here to load reader

description

Practical lesson about bash programming and shell scripting

Transcript of Bash programming

  • 1.Seminario: Bash ProgrammingSeminario: Bash ProgrammingSebastiano MerlinoUniversit` degli Studi di Catania - Facolt` di Ingegneriaaa17 Maggio 20101 / 17

2. Seminario: Bash ProgrammingScripting Scripting In generaleUn linguaggio di scripting ` un linguaggio di programmazione einterpretato destinato a compiti di automazione di sistema, piccoleapplicazioni o compiti lightweight.Generalmente si tratta di semplici programmi atti ad interagire consistemi pi` complessi. uI primi linguaggi di scripting nacquero dallesigenza di automatizzareoperazioni ripetitive come lesecuzione di particolari programmi; essitrovarono, successivamente, spazio in vari altri ambiti ed attualmente sitrovano molto diusi anche nello sviluppo per il web. Bash ScriptingCon tale termine ci si riferisce a quello che ` un linguaggio solitamenteeusato per lautomazione di processi ripetitivi sui sistemi operativiUnix-like. 2 / 17 3. Seminario: Bash ProgrammingEsempi semplici Esempi sempliciHello World#!/bin/bashecho Hello WorldQuesto script ha solo due righe.La prima indica al sistema quale software usare per avviare lo script.La seconda ` lazione eseguita dallo script che stamper` a video la scritta e aHello World.Fornendo diritti di esecuzione allo script esso potr` essere eseguitoatramite il comando ./nome script Script di backup#!/bin/bashtar -cZf /var/my-backup.tgz /home/me/Questo script serve a dimostrare come ogni comando possa essereeseguito su shell. In questo caso realizziamo facilmente un backup dellahome tramite la sua compressione allinterno di un le. 3 / 17 4. Seminario: Bash ProgrammingElementi del LinguaggioVariabiliLe VariabiliCome in qualunque altro linguaggio di programmazione, possiamo usarele variabili come contenitori pratici per i nostri dati. In questo particolarelinguaggio, non esistono tipi per le variabili e non vi ` necessit` di eadichiararle prima di utilizzarle ma basta solo assegnarne il riferimento. Hello World - migliorato#!/bin/bashSTR=Hello Worldecho STR Script di backup - migliorato#!/bin/bashOF=/var/my-backup-$(date +%Y%m%d).tgztar -cZf $OF /home/me/In questo modo il nostro backup sara facilmente datato. Notate che ilcomando date viene eseguito e loutput ci viene ritornato. 4 / 17 5. Seminario: Bash ProgrammingElementi del LinguaggioVariabiliAltre VariabiliVariabili Built-inSono variabili predenite per ogni script e permettono di compieresvariate azioni tramite il nostro script.$0: Nome dello script.$1: Valore del primo parametro (similmente $2, $3, ecc...).$#: Numero di parametri.$* e $@: Tutti i parametri.$-: Opzioni date alla shell.$?: Exit status dellultimo comando.$$: PID dello script. Variabili LocaliEsse sono variabili proprie di un certo scope (blocco di codice come unafunzione, un ciclo, ecc...); possono essere create usando il costruttolocal. 5 / 17 6. Seminario: Bash ProgrammingElementi del LinguaggioCaratteri SpecialiCaratteri Speciali La shell accetta alcuni caratteri speciali o combinazioni di tasti che aiutano molto nel suo utilizzo quotidiano: Tasto tab : permette lauto-completamento del percorso per raggiungere un le. ~ (ottenibile da ) | : detta anche pipe, connette fra loro due comandi passando in ingresso al secondo, luscita del primo. cmd > file, cmd >> file : salvano i valori stampati dal comando cmd nel le indicato. Il primo riscrive totalmente il le (cancellando eventuali contenuti precedenti), il secondo accoda i nuovi contenuti ai vecchi. cmd < file : permette al comando cmd di prendere input da le. cmd ; cmd : permette di eseguire due comandi uno dopo laltro. () : esegue i comandi contenuti allinterno e fornisce i risultati duscita insieme al termine del secondo. & : permette di mantenere il controllo della shell nonostante un programma sia in esecuzione tramite essa cos` da eseguire pi` programmi contemporaneamente.u ` (ottenibile da ) : detto anche backtick; ci` che ` contenuto fraoe due backtick viene eseguito e se ne utilizzeranno i risultati di uscita. Virgolette doppie e virgolette singole : indenticano stringhe. : backslash; indica alla shell di ignorare il carattere appena successivo. !! : viene sostituito con lultimo comando in history. 6 / 17 7. Seminario: Bash ProgrammingElementi del LinguaggioOperatoriOperatori Operatori di comparazione Stringhes1 = s2: verica che s1 sia uguale a s2s1 != s2: verica che s1 sia diverso da s2s1 =~ s2: s2 ` unespressione regolare e confrontata con s1 e-n s1: verica che la stringa s1 sia non nulla (almeno un carattere)-z s1: verica che la stringa s1 sia nullaOperatori Aritmetici Oltre agli operatori aritmetici (+, -, *, /, %) esistono vari operatori relazionali:-lt (): Verica che il numero a sinistra sia maggiore di quello a destra-le (=): Verica che il numero a sinistra sia maggiore o uguale di quello adestra-eq (==): Verica che il numero a sinistra sia uguale a quello a destra-ne (! =): Verica che il numero a sinistra sia diverso da quello a destra 7 / 17 8. Seminario: Bash ProgrammingElementi del LinguaggioOperatoriOperatori Operatori su les-r file: Verica che il le sia leggibile-w file: Verica che il le sia scrivibile-x file: Verica che il le sia eseguibile-f file: Verica che il le sia ordinario (non un device le o unacartella)-s file: Verica che il le abbia dimensione maggiore di 0-d file: Verica che il le sia una directory-e file: Verica che il le esista 8 / 17 9. Seminario: Bash ProgrammingElementi del LinguaggioComandi composti (list): ci` che qui ` indicato con list, viene eseguito in una subshell e ci viene o e restituito solo lexit status di list. {list; }: il comando viene eseguito nella shell corrente. Deve essere terminato da un punto e virgola e le parentesi devono essere isolate mediante spazi. ((expression)): lepressione ` valutata secondo regole aritmetiche; se il valore e restituito dalla valutazione ` diverso da zero, il costrutto restituisce 0, altrimentie viene restituito 1. Equivale a let expression. [[expression]]: ritorna il valore ottenuto tramite valutazione di unespressione condizionale. ( expression ): ritorna il valore di expression; pu` essere usato per forzare lao precedenza. !expression: ` true se expression ` falseee expression1 && expression2: restituisce vero se e solo se tutte e due le espressioni sono vere expression1 || expression2: restituisce vero se anche una sola delle espressioni ` vera. eGli operatori && e || godono di corto circuito; nel caso di && la seconda espressione viene valutata solo se la prima ` vera; invece per || la seconda e espressione viene valutata solo se la prima ` falsa. e9 / 17 10. Seminario: Bash ProgrammingElementi del Linguaggio Operatori condizionaliCostrutto IFAssume la forma: if list; then list; [ elif list; then list; ] ...[ else list; ] fi ` E il pi` semplice costrutto condizionale ed esegue il blocco di codiceu dopo lif solo nel caso in cui lespressione valutata sia vera. #!/bin/bash if [ $1 -lt $2 ]; then echo Minore elif [ $1 -gt $2 ]; then echo Maggiore else echo Uguale fi Questo script previo passaggio di due numeri come parametri, valuta se quello a sinistra sia minore, uguale o maggiore di quello a destra. 10 / 17 11. Seminario: Bash ProgrammingElementi del Linguaggio Operatori condizionaliCostrutto CASERisulta utile spesso al ne di evitare enormi trale di if-elif-else. Il tutto risulta, tramite questo costrutto, molto pi` compresso.u case word in [ [(] pattern [ | pattern ] ...) list ;; ] ... esac Il comando case confronta word con i pattern uno alla volta ed esegue il blocco corrispondente al primo pattern che fa match con la word.#!/bin/bash case $1 in a) echoa;; b) echob;; c) echoc;; *) echodefault;; esacUsando ;& invece che ;; viene eseguito anche il blocco che segue il simbolo. Usando ;;& invece che ;; viene valutata anche la condizione che segue il simbolo e se vera viene eseguito il blocco. 11 / 17 12. Seminario: Bash ProgrammingElementi del Linguaggio CicliCostrutto FORSebbene il costrutto si chiami for esso rappresenta quello che tipicamente in informatica viene detto foreach; esso si occupa di iterare gli elementi di una sequenza.#!/bin/bash #!/bin/bashfor i in $( ls ); dofor i in ` seq 1 10` do echo item: $i echo item: $idonedone Il primo itera su una lista di e resistuita da ls e ne stampa il nome a video; il secondo, invece, simula un normale ciclo for (stile C) stampando i numeri da 1 a 10. 12 / 17 13. Seminario: Bash ProgrammingElementi del Linguaggio CicliCostrutti WHILE e UNTILIl costrutto while esegue un blocco di codice iterativamente nch si e mantiene vera la condizione di controllo; il costrutto until invece esegue il blocco nch la condizione di controllo ` falsa.ee #!/bin/bash#!/bin/bash COUNTER=0COUNTER=20 while [ $COUNTER -lt 10 ]; dountil [ $COUNTER -lt 10 ]; do echo Contatore: $COUNTER echo Contatore: $COUNTER let COUNTER=COUNTER+1let COUNTER=COUNTER-1 done done Il primo mostrer` il valore del contatore per i valori da 0 a 9 ed il secondoa per i valori da 20 a 11. 13 / 17 14. Seminario: Bash ProgrammingElementi del Linguaggio FunzioniFunzioniCome ogni altro linguaggio di programmazione, anche il linguaggio bash ha il suo costrutto per la creazione delle funzioni. Le funzioni risultano esterne rispetto al usso di esecuzione. Ogni funzione creata pu` poi essere richiamata allinterno dello script comeo qualunque altro comando. #!/bin/bash function quit {Allinizio dello script sono dichiarate le funzioniexitquit, h e f. } function h {Viene eseguita la funzione h che prende unecho $1 parametro in ingresso stampandolo a video. } function f {Successivamente viene eseguita la funzione f chelocal W = paroladichiara al proprio interno la variabile W e laecho W }stampa a video. Inne viene chiamata la funzione h Helloquit che termina il usso tramite lutilizzo della f quitparola chiave exit. Lultima riga dello script, echo fooinfatti, non viene eseguita.14 / 17 15. Seminario: Bash ProgrammingElementi del Linguaggio Select e MenuCostrutto SELECT Un tale costrutto permette di creare facilmente dei menu printati su schermo allinterno dei quali si associa un numero ad un valore che pu` o riferire unazione. #!/bin/bash OPTIONS=Hello Quit select opt in $OPTIONS; doif [ $opt = Quit ]; then echo done exitelif [ $opt = Hello ]; then echo Hello Worldelse clear echo bad optionfi doneIl risultato ` un menu che permette la scelta fra le voci Hello e Quit ede esegue le azioni associate mediante costrutto if. 15 / 17 16. Seminario: Bash ProgrammingVarie VarieLettura da tastieraCi` che un utente scrive su tastiera pu` essere letto mediante il comandoo oread nomevar. Ritroveremo tutto il contenuto scritto dallutente no alprimo ritorno a capo allinterno della variabile nomevar. Cattura delloutputCome abbiamo gi` visto gli apici ` permettono di eseguire i comandi ache si trovano al loro interno.Mediante una sintassi del tipo var=` comando ` riusciamo a trovareallinterno della variabile var loutput del comando fra apici. 16 / 17 17. Seminario: Bash ProgrammingAndare Oltre Sei sicuro di voler usare Bash? Array Gli array si indicano con la classica notazione [ ]. Quindi nome array[indice]=valore indicher` che lelemento dellarray indicato cona indice assume il valore specicato. Gli array possono essere sparsi.Thread Possono essere lanciati comandi e processi in maniera asincrona tramite la sintassi coproc NAME command [redirections].Tool source: lancia lesecuzione di unaltro script. sed e awk: utili per il parsing e il processamento di stringhe.Altro Molto altro lo potete trovare negli script associati alle slide che verranno presentati sul sito.17 / 17