Title: La shell di Linux
1La shell di Linux
- Linux ha una varietà di shell differenti
- Bourne shell (sh), C shell (csh), Korn shell
(ksh), TC shell (tcsh), Bourne Again shell
(bash). - Sicuramente la shell più popolare è bash. Bash
è la shell che è stata introdotta nel sistema
operativo GNU. Bash è una shell sh-compatibile
che incorpora utili caratteristiche della Korn
shell (ksh) e della C shell (csh). - Bash è conforme allo standard IEEE POSIX
P1003.2/ISO 9945.2 Shell and Tools. - Garantisce miglioramenti funzionali rispetto a sh
sia per programmare che per luso interattivo.
2Programming o Scripting ?
- Bash non è soltanto uneccellente interprete di
comandi, ma un vero e proprio supporto per un
linguaggio di script. Il linguaggio di script
della shell permette di utilizzare le
potenzialità della shell e di automatizzare un
mucchio di compiti che richiederebbero altrimenti
una grande quantità di comandi. - Differenza tra linguaggi di programmazione e
linguaggi di script - I linguaggi di programmazione sono in genere
notevolmente più potenti e veloci dei linguaggi
di script. I linguaggi di programmazione
generalmente partono dal codice sorgente e
vengono compilati in un eseguibile. Tale
eseguibile non è facilmente portabile su
differenti sistemi operativi. - Un linguaggio di script parte a sua volta dal
codice sorgente, ma non viene compilato in un
eseguibile. Piuttosto, un interprete legge le
istruzioni nel file sorgente ed esegue ciascuna
istruzione. I programmi interpretati sono in
genere più lenti dei programmi compilati. Il
vantaggio principale è che si può facilmente
portare il file sorgente su ogni sistema
operativo. Bash è un linguaggio di script. Altri
esempio di linguaggi di script sono Perl, Lisp, e
Tcl.
3Il primo programma bash
- Occorre sapere come usare un editor di testo. Ci
sono due editor di testo principali in Linux - vi (o vim), emacs (o xemacs).
- Dunque lanciamo un editor di testo ad esempio
- vi
- e digitiamo ciò che segue
- !/bin/bashecho Hello World
- La prima linea dice a Linux di utilizzare
linterprete bash per eseguire questo script. Lo
chiameremo hello.sh. Ora rendiamo lo script
eseguibile - chmod 700 hello.sh
- ls l
- -rwx------ hello.sh
4Il primo programma bash
- Per eseguire il programma
- hello.sh
- -bash hello.sh command not found
- La directory home (in cui il comando hello.sh si
trova) - non si trova fra quelle elencate nella variabile
dambiente PATH - echo PATH
- bin/usr/bin
- Occorre specificare il path di hello.sh
- /home/srinaldi/Scripts/hello.sh
- ./hello.sh
5Il secondo programma bash
- Scriviamo un programma che copia tutti i files in
una directory, e poi cancella la directory con
tutto il suo contenuto. Ciò può essere fatto col
seguente comando - mkdir trash
- cp trash rm -rf trash
- Invece di essere costretti a digitare tutto ciò
in modo interattivo nella shell, scriviamo uno
script di shell - cat gt trash
- !/bin/bash this script deletes some files
- mkdir trash
- cp trashrm -rf trash
- echo Deleted all files!
6Variabili
- Si possono usare le variabili come in ogni
linguaggio di programmazione. I loro valori sono
sempre memorizzati come stringhe, ma ci sono
delle strutture nel linguaggio di shell che
convertono le variabili in numeri per fare i
calcoli. - Non cè bisogno di dichiarare una variabile, il
solo fatto di assegnarle un valore la crea
automaticamente. - Esempio
- !/bin/bash
- STRHello World!
- echo STR
- La linea 2 crea una variabile detta STR e assegna
la stringa "Hello World!" ad essa. Quindi il
valore di questa variabile viene recuperato
mettendo il '' allinizio.
7Attenzione!
- Il linguaggio della shell non tipizza (assegna un
tipo a) le variabili. Ciò significa che una
variabile può contenere dati numerici o
alfabetici. - count0
- countSunday
- Cambiare il tipo di una variabile può generare
confusione, sia per chi scrive lo script che per
qualcuno che cerca di modificarlo, pertanto è
raccomandato luso di un solo tipo di dati per
ogni singola variabile allinterno di uno script. - \ è il carattere di escape di bash, e conserva il
valore letterale del carattere che segue. - ls \
- ls No such file or directory
8Virgolette singole e doppie
- Quando si assegnano dati contenenti spazi o
caratteri speciali, i dati devono essere
racchiusi tra virgolette (singole o doppie). - Quando si usano virgolette doppie (partial
quoting) per stampare a video una stringa di
caratteri, ogni variabile verrà sostituita dal
valore che essa assume in quel momento. - vartest string
- newvarValue of var is var
- echo newvar
- Value of var is test string
- Luso di virgolette singole (full quoting) per
visualizzare una stringa di caratteri non
permette la risoluzione delle variabili. - vartest string
- newvarValue of var is var
- echo newvar
- Value of var is var
9Esempi vari
- pippo pluto
- pippo pluto
- ls Pp
- ls Pp
- ls Pp
- var(\\\\
- echo var
- echo var
- echo var
- echo \z z
- echo \\z \z
- echo \\z \\z
errore
Not resolved
10Esempi vari
- pippocat
- echo comando \ pippo \
- comando cat
- echo comando \ pippo \
- comando \ pippo \
- echo comando pippo
- comando pippo
11Il comando export
- Il comando export inserisce una variabile
nellambiente, così che essa sarà accessibile ai
processi figli. Per esempio - xhello
- bash Run a child shell.
- echo x Nothing in x.
- exit Return to parent.
- export x
- bash
- echo x
- hello It's there.
- Se il processo figlio modifica x, non verrà
modificato il valore originale nel processo
padre. Si verifichi tale fatto cambiando x nel
modo seguente - xciao
- exit
- echo x
- hello
12Variabili di ambiente
- Ci sono due tipi di variabili
- Variabili locali
- Variabili di ambiente
- Le variabili di ambiente sono definite a livello
di sistema e possono di norma essere reperite
usando il comando env. Le variabili di ambiente
contengono valori speciali. Ad esempio, - echo SHELL
- /bin/bash
- echo PATH
- /usr/X11R6/bin/usr/local/bin/bin/usr/bin
- Le variabili di ambiente sono definite in
/etc/profile, /etc/profile.d/ e /.bash_profile.
Questi files sono files di inizializzazione e
vengono letti quando la shell bash viene
invocata. Al momento del logout da parte
dellutente, bash legge /.bash_logout.
13Variabili di ambiente
- HOME Il pathname della home dellutente
(largomento di default di cd). - PATH Il search path per i comandi. É un elenco
delle directories (separate da ) nelle quali la
shell cerca il comando da eseguire. - Solitamente, si lancia uno script nel modo
seguente - ./trash.sh
- Ponendo PATHPATH. la nostra working directory
viene inclusa nel search path per i comandi, e
possiamo digitare semplicemente - trash.sh
14Variabili di ambiente
- LOGNAME contiene il nome dellutente.
- HOSTNAME contiene il nome della macchina.
- MACHTYPE hardware del sistema.
- PS1 sequenza di caratteri visualizzata davanti
al prompt. - \t ora
- \d data
- \w current directory
- \W ultima parte della current directory
- \u nome dellutente
- \ carattere del prompt
- Esempio
- lferrari_at_homelinux lferrari PS1ciao \u
- ciao lferrari _
- UID contiene lid number dellutente (non può
essere cambiato).
15Il comando exit
- Il comando exit può essere usato per terminare
uno script. Esso restituisce un valore, che è
disponibile per il processo padre dello script. - Quando uno script termina col comando exit senza
ulteriori parametri, lo stato di uscita è lo
stato di uscita dellultimo comando eseguito
nello script.
!/bin/bash COMMAND_1 . . . exit with
status of last command. COMMAND_LAST exit
!/bin/bash COMMAND_1 . . . exit with
status of last command. COMMAND_LAST exit ?
16Il comando exit
- Il comando exit può essere usato per terminare
uno script. Esso restituisce un valore, che è
disponibile per il processo padre dello script. - Quando uno script termina con
- exit nnn
- dove nnn0-255, lo stato di uscita è nnn.
17Il Comando read
- Il comando read consente di leggere linput da
tastiera e memorizzarlo in una variabile. - Esempio (read.sh)
18Il Comando read
- Opzioni
- read s (non stampa a video linput)
- read nN (accetta soltanto N caratteri di input)
- read p message (visualizza il messaggio
message) - read tT (accetta linput per T secondi)
- Esempio
- read s n1 -p Yes (Y) or not (N)? answer
- Yes (Y) or not (N) ? (digitare Y non si vedrà)
- echo answer
- Y
19Sostituzione dei comandi
- La virgoletta retrograda, o accento grave,
è diversa dalla virgoletta . Essa viene usata
per la sostituzione dei comandi command - LISTls
- echo LIST
- hello.sh read.sh
- PS1pwdgt
- /home/rinaldi/didattica/gt
- Possiamo eseguire la sostituzione dei comandi
anche usando (command) - LIST(ls)
- echo LIST
- hello.sh read.sh
- rm ( find / -name .tmp )
- ls ( pwd )
- ls ( echo /bin )
20Esempio
- aecho Hello
- echo a
- echo a
- bls /home
- echo b
- echo a b
- echo a b
21Operatori aritmetici
- somma
- - sottrazione
- moltiplicazione
- / divisione
- esponenziazione
- modulo
- Esempio
- a(52)3
- echo a
- b23
- echo ab
22Valutazioni aritmetiche
- Il costrutto let può essere usato per creare
funzioni matematiche - let X1027
- echo X
- 24
- let YX24
- echo Y
- 32
- Unespressione aritmetica può essere valutata
usando expression o ((expression)) - echo ((12320))
- 143
- VALORE12320
- echo 10VALORE
- 1430
- echo 23
- echo 83
Non è necessario usare X per riferirsi al valore
di X
23Costrutti condizionali
- Le strutture condizionali ci permettono di
decidere se eseguire unazione oppure no, a
seconda del valore di unespressione da valutare.
Il costrutto condizionale fondamentale è - if expression
- then
- statements
- elif expression
- then
- statements
- else
- statements
- fi
- Le parti elif (else if) e else sono opzionali.
24Espressioni
- Unespressione può essere un confronto fra
stringhe, un confronto fra numeri, un operatore
su file, un operatore logico ed è rappresentata
da expression - Confronto fra stringhe
- per valutare se due stringhe sono uguali
- ! per valutare se due stringhe sono diverse
- -n per valutare se la lunghezza di una stringa è
maggiore di zero - -z per valutare se la lunghezza di una stringa è
uguale a zero - Esempi
- s1 s2 (vero se s1 è uguale a s2,
altrimenti falso) - s1 ! s2 (vero se s1 è diverso da s2,
altrimenti falso) - s1 (vero se s1 è non vuota, altrimenti
falso) - -n s1 (vero se s1 ha lunghezza maggiore di
0, altrimenti falso) - -z s2 (vero se s2 ha lunghezza 0,
altrimenti falso)
25Espressioni
- Confronto fra numeri
- -eq valuta se due numeri sono uguali
- -ge valuta se un numero è maggiore o uguale a
un altro - -le valuta se un numero è minore o uguale a un
altro - -ne valuta se due numeri sono diversi
- -gt valuta se un numero è maggiore di un altro
- -lt valuta se un numero è minore di un altro
- Esempi
- n1 -eq n2 (vero se n1 è uguale a n2,
altrimenti falso) - n1 -ge n2 (vero se n1 è maggiore o uguale a
n2, altrimenti falso) - n1 -le n2 (vero se n1 è minore o uguale a
n2, altrimenti falso) - n1 -ne n2 (vero se n1 è diverso da n2,
altrimenti falso) - n1 -gt n2 (vero se n1 è maggiore di n2,
altrimenti falso) - n1 -lt n2 (vero se n1 è minore di n2,
altrimenti falso)
26Espressioni
- Operatori su files
- -d controlla se il cammino dato rappresenta una
directory - -f controlla se il cammino dato rappresenta un
file ordinario - -e controlla se il nome del file esiste
- -s controlla se un file ha lunghezza maggiore di
0 - -r controlla se si possiede il permesso di
lettura per un file o una directory - -w controlla se si possiede il permesso di
scrittura per un file o una directory - -x controlla se si possiede il permesso di
esecuzione per un file o una - directory
- Esempi
- -d fname (vero se fname è una directory,
altrimenti falso) - -f fname (vero se fname è un file
ordinario, altrimenti falso) - -e fname (vero se fname esiste, altrimenti
falso) - -s fname (vero se la lunghezza di fname è
maggiore di 0, altrimenti falso) - -r fname (vero se fname ha il permesso di
lettura, altrimenti falso) - -w fname (vero se fname ha il permesso di
scrittura, altrimenti falso) - -x fname (vero se fname ha il permesso
di esecuzione, altrimenti falso)
27Esempio
- !/bin/bashif -f /etc/fstab
- then cp /etc/fstab .
- echo Done.
- else echo This file does not exist.
- exit 1
- fi
- Esercizio. Scrivere uno script di shell che
prenda in input un nome di file ltpippogt - Lo script controlla se esiste una cartella
Backup, altrimenti la crea. - Se il file cercato esiste, copia il file con lo
stesso nome .bak nella cartella Backup. - Se il file non esiste, allora visualizza il
messaggio The file ltpippogt does not exist!!!
28Espressioni
- Operatori logici
- ! negare (NOT) unespressione logica
- -a congiunzione (AND) tra due espressioni logiche
- -o disgiunzione (OR) tra due espressioni logiche
29Espressioni
- Operatori logici
- congiunzione (AND) tra due espressioni logiche
- disgiunzione (OR) tra due espressioni logiche
30Parametri di shell
- Un parametro posizionale corrisponde ad un
argomento fornito alla shell al momento
dellesecuzione di un programma. Il primo
argomento specificato corrisponde alla variabile
1, il secondo argomento alla variabile 2 e così
via. Il parametro posizionale N può essere
referenziato come N, o come N quando N
consiste in una singola cifra. - Parametri speciali
- è il numero dei parametri passati
- 0 rende il nome dello script di shell in
esecuzione nonchè la sua posizione nel file
system - rende una singola parola contenente tutti i
parametri passati allo script - _at_ rende un array di parole contenente tutti i
parametri passati allo script
31Il costrutto case
- Viene usato per eseguire azioni basate su valori
specifici. Usato spesso al posto di un costrutto
if se cè un numero elevato di condizioni. - Il valore usato può essere unespressione.
- Ciascun insieme di azioni deve concludersi con
una coppia di punto e virgola. - Il simbolo ) viene usato per accettare ogni
valore non corrispondente con la lista dei
valori. - case var in
- val1)
- statements
- val2)
- statements
- )
- statements
- esac
32Costrutti di iterazione
- Il ciclo for viene usato quando si vuole ripetere
un blocco di comandi in corrispondenza di valori
tratti da un elenco. - for var in list
- do
- istruzioni
- done
- Le istruzioni vengono eseguite assegnando a var
ciascun valore in list. - !/bin/bash
- let sum0
- for num in 1 2 3 4 5
- do
- let sumsumnum
- done
- echo sum
33Costrutti di iterazione ltlistgt
- !/bin/bashfor x in paper pencil pen do
- echo The value of variable x is x
- sleep 1
- done
- The value of variable x is paper
- The value of variable x is pencil
- The value of variable x is pen
- !/bin/bashfor x in paper A4 pencil STADTLER
pen BIC do - echo The value of variable x is x
- sleep 1
- done
- The value of variable x is paper A4
- The value of variable x is pencil STADTLER
- The value of variable x is pen BIC
34Costrutti di iterazione ltlistgt
- !/bin/bashlistaantonio
- michele
- paolo
- luca
- for x in lista
- do
- echo The value of variable x is x
- sleep 1
- done
- The value of variable x is antonio
- The value of variable x is michele
- The value of variable x is paolo
- The value of variable x is luca
35Costrutti di iterazione ltlistgt
- !/bin/bash
- for x in
- do
- ls -l x
- sleep 1
- done
- Lists all files in current directory
- !/bin/bash
- for x in /bin
- do
- ls -l x
- done
- Lists all files in /bin
36Costrutti di iterazione ltlistgt
- !/bin/bash
- read p Insert the name of a directory
directory - echo "symbolic links in directory \ directory
\ " - for file in ( find directory -type l )
-type l symbolic links - do
- echo "file"
- done sort Otherwise file list is unsorted
37Costrutti di iterazione ltlistgt
- Se la parte list viene omessa, a var viene
assegnato ciascun parametro passato allo script (
1, 2, 3,).
38Costrutti di iterazione ltlistgt
- Se la parte list viene omessa, a var viene
assegnato ciascun parametro passato allo script (
1, 2, 3,).
39Operazioni sulle variabili
-
-
- let index 5 incrementa la variabile
index di 5 -
- incrementa la variabile
- - decrementa la variabile
- moltiplica la variabile
- / divide la variabile
40Arrays
- Nella shell bash, possiamo usare gli arrays. Il
modo più semplice per crearne uno è usare uno dei
due metodi seguenti - pet0dog
- pet1cat
- pet2fish
- pet4apple
- pet( dog cat fish apple )
- Si possono inserire fino a 1024 elementi. Per
estrarre un valore, digitare arraynamei. - echo pet0
- dog
- echo pet2
- fish
41Arrays
- Per estrarre tutti gli elementi, usare un
asterisco come segue - echo arraynames
- Per vedere quanti elementi ci sono nellarray
- echo arraynames
- Si possono utilizzare gli arrays nei cicli per
realizzare la lista di un ciclo for - for x in arrayname
- do
- echo x
- done
42Un for alternativo
- Una forma alternativa per la struttura for è
- for (( EXPR1 EXPR2 EXPR3 ))
- do
- istruzioni
- done
- Per prima cosa, viene valutata lespressione
aritmetica EXPR1. Quindi EXPR2 viene valutata
ripetutamente fino a che non assume risulta
falsa. Ogni volta che EXPR2 è vera, le istruzioni
vengono eseguite e, in coda, viene eseguita
EXPR3.
43Debugging
- Bash fornisce due opzioni che danno informazioni
utili per il debugging - -v visualizza ciascuna linea dello script così
come era stata digitata prima dellesecuzione - -x simile a sopra, ma se cè un ciclo mostra
tutti le iterazioni. - Utilizzo !/bin/bash v, o !/bin/bash x
- cat for3.sh
- !/bin/bash x
- echo n Enter a number read x
- let sum0
- for (( i1 iltx ii1 )) do
- let sum sum i
- done
- echo the sum of the first x numbers is sum
44Debugging
- ./for3.sh
- echo n Enter a number
- Enter a number read x
- 3
- let sum0
- (( i0 ))
- (( 0lt3 ))
- let sum 0 0
- (( i01 ))
- (( 1lt3 ))
- let sum 0 1
- (( i11 ))
- (( 2lt3 ))
- let sum 1 2
- (( i21 ))
- (( 3lt3 ))
- let sum 3 3
- (( i31 ))
- (( 4lt3 ))
45Dovè lerrore?
- Uno script da correggere
- !/bin/bash
- ex74.sh
- a37
- if a -gt 27
- then echo a
- fi
- Output dello script
- ./ex74.sh 37 command not found
46Dovè lerrore?
- Uno script da correggere
- !/bin/bash -x
- ex74.sh
- a37
- if a -gt 27
- then echo a
- fi exit
- 0
- Output dello script
- a37
- 37 -gt 37
- ./ex74.sh 37 command not found
- .
47Il costrutto While
- La struttura while è una struttura di ciclo che
viene usata per eseguire un insieme di comandi
finchè una certa condizione specificata è vera.
Il ciclo termina non appena la condizione diventa
falsa. Se la condizione non diventa mai falsa, il
ciclo non termina e si entra in loop. - while espressione
- do
- istruzioni
- done
48Il costrutto continue
- Il comando continue genera un salto
alliterazione successiva del ciclo, dimenticando
tutti i restanti comandi in quella particolare
iterazione. - !/bin/bash
- LIMIT19
- echo
- echo Printing Numbers 1 through 20 (but not 3
and 11) - a0
- while a -le LIMIT do
- a((a1))
- if a -eq 3 a -eq 11
- then
- continue
- fi
- echo -n a
- done
49Il costrutto break
- Il comando break termina il ciclo (ed esce da
esso). - !/bin/bash
- LIMIT19
- echo Printing Numbers 1 through 20, but
something happens after 2 - a0
- while a -le LIMIT do
- a((a1))
- if a -gt 2
- then
- break
- fi
- echo -n a
- done
- echo echo echo
50Il costrutto until
- La struttura until è molto simile alla struttura
while. La struttura until mantiene il ciclo
finchè la condizione è falsa. Quindi,
sostanzialmente, il significato è finchè la
condizione è falsa, fai questo. - until espressione
- do
- istruzioni
- done
51Manipolare le stringhe
- Bash supporta un numero impressionante di
operazioni per manipolare stringhe.
Sfortunatamente, questi strumenti non soddisfano
una delle primitive esigenze di Linux, cioè
quella delleconomicità dei comandi. - string rende la lunghezza della stringa.
- stringposition estrae da string la
sottostringa che inizia dalla posizione
position. - stringpositionlength estrae length
caratteri della sottostringa di string che
inizia dalla posizione position. - Esempio
- st0123456789
- echo st
- 10
- echo st6
- 6789
- echo st62
- 67
52Sostituzione dei parametri
- Manipolare e/o espandere variabili
- parameter-default, se parameter non è
istanziato, usa default. - echo username-lferrari
- lferrari
- usernameluca
- echo username-lferrari
- luca
- parameterdefault, come sopra.
- parametervalue, se parameter è istanziato,
usa value, altrimenti usa la stringa vuota. - echo usernameandrea
- andrea
- echo pippoandrea
- null string
53Sostituzione dei parametri
- parameter?msg, Se parameter è istanziato, lo
usa, altrimenti stampa msg. - valuetotal?total is not set
- -bash total total is not set
- total10
- valuetotal?total is not set
- echo value
- 10
Esempio !/bin/bash OUTFILEsymlinks.list
directory1-pwd for file in ( find
directory -type l ) do echo file done
sort gtgt HOME/OUTFILE
54Operazioni avanzate sulle stringhe
- stringsubstring, elimina la più corta
occorrenza corrispondente a substring dallinizio
di string. - pippoabbcaabccbcabcdbcdaba
- echo pippoac
- aabccbcabcdbcdaba
- echo pippoac strips the longest
match - daba
55Operazioni avanzate sulle stringhe
- string/substring/replacement, elimina la prima
occorrenza corrispondente a substring in string,
rimpiazzandola con replacement. - pippoabbcaabccbcabcdbcdabab
- echo pippo/ca/11
- abb11abccbcabcdbcdabab
- echo pippo//ca/11
- abb11abccb11bcdbcdabab replaces all matches
- echo pippo/ab?c/000
- a000aabccbcabcdbcdabab
- echo pippo/ca/\!
- abb!b
- echo pippo//b?/00
- a00caa00c00a00d00da00b
56Funzioni
- Le funzioni rendono gli scripts più facili da
mantenere. Sostanzialmente, permettono di
suddividere il programma in pezzetti più piccoli.
Una funzione esegue unazione definita
dallutente, e può rendere un valore se lutente
lo desidera. - !/bin/bashhello()echo You are in function
hello() - echo Calling function hello()helloecho You
are now out of function hello() - Sopra, abbiamo richiamato la funzione hello() col
suo nome usando la linea hello. Quando questa
linea viene eseguita, bash cerca nello script la
linea hello(). La trova, e ne esegue i contenuti.
57Funzioni
- !/bin/bash
- function check()
- if -e "/home/1"
- then
- return 0
- else
- return 1
- fi
-
- echo Enter the name of the file read x
- if check x
- then
- echo x exists !
- else
- echo x does not exist !
- fi.
58Massimo comun divisore
- !/bin/bash
- gcd.sh massimo comun divisore
- Si usa lalgoritmo di Euclide
- Il massimo comun divisore" (gcd) di due interi
è il più grande intero - che divide entrambi, senza che ci sia del
resto. - Lalgoritmo di Euclide utilizza divisioni
successive. - Ad ogni passo, dividend lt--- divisor, divisor
lt--- remainder - finchè remainder 0. Nellultimo passo, si ha
gcd dividend. - ARGS2 E_BADARGS65
- if -ne "ARGS"
- then
- echo "Usage basename 0 first-number
second-number" - exit E_BADARGS
- fi
59Massimo comun divisore
- gcd ()
- dividend1
- divisor2
- remainder1
- until "remainder" -eq 0 do
- let "remainder dividend divisor"
- dividenddivisor
- divisorremainder
- done
- Last dividend is the gcd.
- gcd 1 2
- echo echo "GCD of 1 and 2 dividend
60Script 1 estrarre una carta a caso da un mazzo
- !/bin/bash
- SuitesClubs Diamonds Hearts Spades
- Denominations2 3 4 5 6 7 8 9 10 Jack Queen King
Ace - Read into array variable.
- suite(Suites)
- denomination(Denominations)
- Count how many elements.
- num_suitessuite
- num_denominationsdenomination
- Extract
- echo -n "denomination((RANDOMnum_denomination
s)) of " - echo suite((RANDOMnum_suites))
61Script 2 cambiare i nomi di tutti i file
mettendoli in lettere minuscole
- !/bin/bash
- for filename in
- Traverse all files in directory.
- do
- fnamebasename filename
- Change name to lowercase.
- necho fname tr A-Z a-z
- if fname ! n
- Rename only files not already lowercase.
- then
- mv fname n
- fi
- done
62Script 3 Confrontare due files con uno script
- !/bin/bash
- ARGS2 Two args to script expected.
- if -ne ARGS then
- echo Usage basename 0 file1 file2 exit
1 - fi
- if ! -r "1 ! -r "2" then
- echo Both files must exist and be readable.
exit 2 - fi
- cmp 1 2 gt /dev/null
- /dev/null buries the output of the cmp
command. - Also works with 'diff', i.e., diff 1 2 gt
/dev/null - if ? -eq 0 Test exit status of cmp
command. - then
- echo File \1\ is identical to file \2\.
- else
- echo File \1\ differs from file \2\.
- fi
63Esercizio
- !/bin/bash
- MAX10000
- for((nr1 nrltMAX nr)) do
- let "t1 nr 5"
- if "t1" -ne 3
- then continue fi
- let "t2 nr 7"
- if "t2" -ne 4
- then continue fi
- let "t3 nr 9"
- if "t3" -ne 5
- then continue fi
- break What happens when you comment out this
line? Why? -
- done