Upload
trinhdat
View
230
Download
0
Embed Size (px)
Citation preview
Naso Ing. Michele 1
Corso Linux
• Realizzazione di Script
• Mediante la BASH
• Bourne Again Shell
BASH
• Interprete del linguaggio dei comandi
• Implementa il paradigma della programmazione strutturata secondo Bhom-Jacopini
• Serve un editor: utilizziamo gedit. Vanno bene anche nano, kwrite, vi, etc…
• Comando per eseguire la shell : /bin/bash
2Naso Ing. Michele
Costrutti sintattici fondamentali
• Assegnazione
• Selezione o diramqzione
• Iterazione non condizionata e condizionata
3Naso Ing. Michele
Servizi dell’Interprete(fornite ad ogni esecuzione)
• Analisi lessicale: analizza che gli identificatori siano costruiti rispettando le regole: formati da caratteri alfabetici , numeri, ed il carattere _: devono iniziare per carattere. Non è case sensitive
• Analisi Sintattica: Rispetto delle regole di formazione delle istruzione
• Analisi Semantica: interpretazione del significato dell’istruzione e traduzione in linguaggio macchina
• Esecuzione del codice precedentemente prodotto
4Naso Ing. Michele
Struttura di uno script
#!/bin/bash
#La prima direttiva Non È UN COMMENTO e deve essere la prima
#direttiva
#Questi sono Commenti
# la prima istruzione si chiama shebang
# che chiama l’entrata in scena del’interprete dei
#comandi
[istruzioni che implementano lo script]
5Naso Ing. Michele
Proceduradi realizzazione di uno script• Scrivere lo script mediante un editor:
gedit• Fornire al file di testo la proprietà di eseguibile con il
comando:
chmod u+x script e• Esecuzione con il comando :
./nomescript• Per eseguire lo script senza indicare il percorso utilizzare il
seguente comando:
export PATH=“$PATH:.”Con l’ultimo comando s’inserisce nel percorso di ricerca dei comandi la directory corrente che si indica con il . (punto)
6Naso Ing. Michele
Istruzioni di assegnazione di valori alle variabilimodalità immediata
Per dichiarare e assegnare un valore ad una variabile si utilizza la notazione la coppia :
nome=valore(Attribute Value Pair:AVP)Esempimichele=3Si noti che = non è preceduto né seguito da uno spazio
caterina= bellissimanaso=‘Giovanni Paolo’
Nell’ultimo esempio si utilizzano gli apici singoli perché il valore è costituito da due parole
7Naso Ing. Michele
Istruzioni di assegnazione di valori alle variabilimodalità interattiva
Per assengare dei valori a delle variabili si usa l’istruzione read
read dato
Legge da tastiera , senza prompt,un valore e lo assegna alla variabile di nome dato
read -p “Inserisce il valore per :” dato
Legge da tastiera con il prompt, rappresentato dal messaggio tra virgolette,un valore e lo assegna alla variabile di nome dato
8Naso Ing. Michele
Istruzioni di assegnazione assegnazione del risultato di un comando ad una variabile
Con il comando substitution si assegna il risultato di un comando ad una variabile
pippo= ‛ ls -la‛
pippo conterrà l’elenco esteso della cartella. Si utilizzano gli apici rovesciati che si ottengono digitando AltGr+apice semplice oppure Alt+96
pippo= ‛ cat testo‛
pippo conterrà il contenuto del file di nome testo
Naso Ing. Michele 9
Parametri posizionali
Agli script si possono passare dei parametri, che seguono il nome dello script stesso e separati da spazi.
I parametri all’interno dello script sono identificati con $n dove n indica la posizione dell’argomento nel comando di attivazione dello script. Se n è >9 allora la sintassi diventa ${11}.
Con $0 s’indica il nome del primo argomento ossia il nome dello script
Naso Ing. Michele 10
Dichiarazione di variabili non inizializzate
Per dichiarare una vriabile si usa la
direttiva
declare nome
11Naso Ing. Michele
Parametri posizionali
Esempio
#!/bin/bashcho “Identificatore primo argomento: $1”
echo “Identificatore secondo argomento: $2”
echo “Nome dello script: $0”
#Se lo script si chiama michele e lo attivo con il #seguentecomando
michele caterina giovanni
avrò in outputIdentificatore primo argomento: caterina
Identificatore secondo argomento: giovanni
Nome dello script: michele
Naso Ing. Michele 12
Parametri posizionalivariabili speciali
$# Numero di parametri passati non è contato il nome dello script
$* Elenco di tutti i parametri escluso il nome
dello script formattati come un’unica stringa e gli argomenti separati da spazio
$@ Elenco di parametri ognuno dei quali è una stringa delimitata da doppi apici
$? Codice di uscita dell’ultimo comando
$_ Ultimo argomento dell’ultimo comando
invocato
Naso Ing. Michele 13
Dichiarazione di array
Per dichiarare ed inizializare un array si usa la seguente sintassi
array=(10 45 67 6)
Un elemento dell’array si indica
array[3]=89
Si accede attraverso la posizione indicata tra parentesi quadre: la prima posizione è la posizione 0
Naso Ing. Michele 14
Istruzione di visualizzazione del contenuto delle variabili
Per la visualizzazione, sul video, del contenuto
delle variabile o per mandare messaggi
all’utente si usa l’istruzione
echo $nomevariabile
Si deve fare precedere il nome della variabile
dal carattere $ (sostituzione per variabile) per
visualizzare il contenuto della variabile e non il
nome
Naso Ing. Michele 15
Istruzione di visualizzazione di un messaggio
Per visualizzare un messaggio racchiudere il
messaggio da singoli apici
echo ‘Ciao Mondo’
Si possono utilizzare anche i doppi apici
echo “Ciao Mondo”
Se nel messaggio vi sono contenuti di variabili
da sostituire bisogna utilizzare i doppi apici
Naso Ing. Michele 16
Istruzione di visualizzazione di un messaggio … continua
EsempioX=5echo ‘Questo è il risultato x’
Visualizza Questo è il risultato x
echo “Questo è il risultato $x”
Visualizza
Questo è il risultato 5
Naso Ing. Michele 17
Istruzione di visualizzazione di un messaggio … continua
Visualizzazione di un array di un suo elemento
echo ${vettore[1]}
Visualizza il secondo elemento dell’array
echo ${vettore[*]}
Visualizza tutti i componenti del vettore
echo ${#vettore[1]}
Visualizza il numero dei componenti dell’array
Naso Ing. Michele 18
Istruzione di visualizzazione di un messaggio … continua
Utilizzo delle sequenze di escape con l’istruzione echoLe sequenze di escape sono formate da un particolare carattere preceduto da \ che provocano delle azioni
Sequenze di escape
\\ visualizza il carattere \
\a segnale acustico
\n Line Feed: porta il cursore a capo ma sulla #stessa colonna
\r Carriage Return: porta il cursore sulla prima
colonna della stessa line\ff form fedd
\t tabulazione
Etc…
Naso Ing. Michele 19
Istruzione di visualizzazione di un messaggio … continua
Per utilizzare gli effetti delle sequenze di escapel’istruzione echo si utilizza l’opzione –e . Si tul
echo –e “Ciao \nMondo”
VisualizzaCiao
Mondo
echo –e “Ciao \n\rMondo”
VisualizzaCiao
Mondo
Naso Ing. Michele 20
Istruzione di visualizzazione di un messaggio … continua
Funzione del carattere \Il carattere \ serve, anche, ad eliminare gli effetti di particolari
caratteri che invece mantengono il loro significato letterale
echo “Ciao \“Amici””
Visualizza
Ciao “Amici”
I doppi apici non sono visti come delimitatori bensi come loro stessi rappresentanti.
\è utilizzato anche come continuatore di riga se l’argomento di echo è troppo lungo
Naso Ing. Michele 21
Espressioni aritmetiche
Le espressioni aritmetiche si formano combinando operatori aritmetici, variabili e costanti e
assegnando o modificando il valore di una variabile
Operatori aritmetici e loro usoL’operatore deve essere preceduto e seguito da uno spazio
-Operando1 #Nega algebricamente il valore #Operando1
Operando1 + Operando2 #addizioneOperando1 - Operando2 #sottrazioneOperando1 * Operando2 #MoltiplicazioneOperando1 / Operando2 #DivisioneOperando1 % Operando2 # Modulo, se i numeri sono postivi
#coincide cn il resto della divisione
Naso Ing. Michele 22
Espressioni aritmetiche… continua
Se Operando 1 dovrà contenere anche il risultato si può utuilizzare la sintassi del
linguaggi c, c++ e java
Operando1 += Operando2
Operando1 -= Operando2
Operando1 *= Operando2
Operando1 /= Operando2
Operando1 %= Operando2
Naso Ing. Michele 23
Espressioni aritmetiche… continua
Esempio
#!/bin/bash
read “Inserisci un numero” num1
num2=3
let risultato=num1 + num2
echo –e “il risultato è \t $risultato
Naso Ing. Michele 24
Espressioni logicherestituiscono un valore vero o falsoPrimitive che hanno come argomento un solo file
- r file # Controlla se il file è lettura
-w file # Controlla se il file è in scrittura
- e file # Verifica l’esistenza del file
-o file # Verifica se si proprietario del file
-z file # Verifica se la dimensione del file è 0
- s file # Verifica se la dimensione dell file è >0
- f file # Verifica se è il nome di file ordinario
-d file # Verifica se è il nome di una
# directorry
Naso Ing. Michele 25
Espressioni logicherestituiscono un valore vero o falso
Primitive che hanno come argomento due file
nomefile1 -nt nomefile2 # controlla se il primo file è stato modificato
#più recentemente che il secondo nt=new time
nomefile1 -ot nomefile2# controlla se il primo file è stato modificato
#meno recentemente del secondo ot=oldt ime
nomefile1 -et nomefile2#Controlla se i due file hanno lo stesso i-node sono lo stesso
# link hard
Naso Ing. Michele 26
Espressioni relazionalirestituiscono un valore vero o falso
Primitive che hanno come argomento due numerinum1 –eq nume2
# Controlla se i due valori sono uguali
num1 –ne nume2# Controlla se i due valori sono diversi
num1 –lt nume2# Controlla se il primo valore è < del secondo less then
num1 –le nume2# Controlla se il primo valore è < = del secondo less or equal
num1 –gt nume2# Controlla se il primo valore è > del secondo greather then
num1 –ge nume2# Controlla se il primo valore è > = del secondo greather or equal
Naso Ing. Michele 27
Espressioni relazionalirestituiscono un valore vero o falso
Primitive che hanno come argomento due stringhe
-z parola #Controlla se la parola ha 0 caratteri
-n parola # Controlla se la parola ha caratteri >0
parola1 = parola2 # parole con gli stessi caratteri
parola1 != parola2 # parole con gli caratteri diversi
parola1 > parola2 # parola1 lessicograficamente secondo il codice ASCII
# viene dopo la parola2
parola1 < parola2 # parola1 lessicograficamente secondo il codice ASCII
# viene prima della parola2
Naso Ing. Michele 28
Espressioni logiche complesse
Le espressione condizionali possono essere utilizzate come argomenti di connettori logici per creare condizioni più complesse
Connettori logicicondizione1 -a condizione 2
-a sta per and logico quindi il risultato complessivo è vero se entrambe le condizioni sono vere
condizione1 -o condizione 2
-o sta per or logico quindi il risultato complessivo è vero se almeno una delle due condizioni sono vere
Operatore logico di negazione
!condizione! Sta per NOT quindi il risultato è vero se la condizione è falsa e viceversa
Naso Ing. Michele 29
Connettivi per i comandi
Si possono fare eseguire, a Linux, due o più comandi legandoli tramire l’operatore logico , che si indica con && , oppure tramite l’operatore or, che si indica ||.
L’elaborazione avviene con il metodo short-cut ossia l’esecuzione del secondo comando dipende dal codice di uscita del primo.
Esempiocomando1 && comando2
Il comando2 è eseguito solo se l’esecuzione del comando1 ha avuto successo (exit status=0) altrimenti non viene eseguito perché sicuramente il risultato finale è comunque falso
comando1 || comando2 Il comando2 è eseguito se l’esecuzione del comando1 non ha avuto successo (exit code diverso da 0) perché se ha avuto successo il risultato finale è comunque vero
Naso Ing. Michele 30
Strutture sintattiche di selezionea una via
Struttura if … then
If [ condizione ]thencomando---
fiSe la condizione è vera sono eseguiti i comandi
seguenti il then fino alla clausola fi, if al contrario.
Il then è riconosciuto dopo l’invio o dopo il ; che segue la parentesi quadra chiusa.
Naso Ing. Michele 31
Strutture sintattiche di selezione
Struttura if … then.
Esempio: Scrivere uno script che visualizza il contenuto di un
file, passato come argomento, solo se è un file
ordinario.
#!/bin/bash
If [ -f $1 ]
then
echo -e “$1 è un file ordinario e questo è il contenuto\n”
cat $1
fi
Naso Ing. Michele 32
Strutture sintattiche di selezionea due vie
If condizione then … elseIf [ condizione ]thencomandiVero
elsecomandiFalso
fiSe la condizione è vera sono eseguite le istruzioni dopo la clausolal then fino ala clausola else esclusa, altrimenteverranno eseguite le istruzioni dopo dopo la clausola else fino alla fclausola fi
Naso Ing. Michele 33
Strutture sintattiche di selezionea due vie
If condizione then … else
Esempio: Scrivere uno script che ricevendo dalla linea di comando il nome di un file che può essere un file ordinario oppure il nome di una sotto cartella. della pwd
Se è un file ordinario visualizza il ontenuto altrimente visualizza l’eleco dei file contenuti nella direcotory
#!/bin/bashIf [ -f $1 ]
then echo -e “$1 è un file ordinario e questo è il contenuto\n”
cat $1else
echo -e “$1 è cartella e questo è il contenuto\n”
cd ./$1ls –la
fi
Naso Ing. Michele 34
Strutture sintattiche di selezionea due vie… generalizzato
if [ condizione1 ]
then
comandi1
elif [ condizione2 ]
then
comandi2
else
comandi3
F
Se ll condizione1 è vera sono eseguiti i comandi1 altrimenti si valuta la condizione2 se è vera si eseguono i comandi 2 altrimenti i comandi 3
Naso Ing. Michele 35
Strutture sintattiche
selezione multipla
case selettore invalore1)
comandi1 ;;Valore2)
comandi2 ;;valore3)
comandi3 ;;…
*) comandi_otherwise ;;esacL’istruzione confronta il valore contenuto nella variabile selettore con i valori indicati. Se lo trova esegue i comandi fino ai relativi ;;. Dopo l’esecuzione dei comandi passa al comando successivo alla clausola esac.. Se nessun valore è indicato nelle opzioni sono eseguiti i comandi relativi allo schema *). Se in corrispondenza si più valori bisogna eseguire gli stessi comandi si usa la sintassi valore1 | valore2 ! Valoren) comandi;; Nei valori si possonno utilizzare i metacaratteri: * ? e [] per raggrupare più valori con un’unica notazione. I metacaratteri hanno lo sstesso significato che hanno nei comandi
Naso Ing. Michele 36
Strutture sintattiche selezione multipla
EsempioScrivere uno script che calcola l’espressione aritmetica inviato con il comando
momescript op1 operatore op2#!/bin/bash
case $2 in
‘+’) let somma= $1 + $3
echo “ la somma vale $somma” ;;
‘-’) let diff=$1 - $3
echo “ La differanza vale $diff” ;;
‘*) let prodotto=$1 * $3
echo “ il prodotto vale $prodotto” ;;
‘/’) let quotziente= $1 / $2
let resto=$1 % $3
echo “il quoziente vale $quoziente”
echo “ Il resto vale $resto” ;;
*) echo “ Operazione non prevista” ;;
Esac
Naso Ing. Michele 37
Costrutti sintatticiiterativi: ciclo for
for var in lista_valori
do
comando1
comando2
…
done
La variabile assume ciclicamente i valori contenuti nella
lista_valori e per ogni valore esegui i comandi compresi
tra il do ed il done
Naso Ing. Michele 38
Costrutti sintatticiiterativi: ciclo for
Esempio1
Scrivere uno script che visualizza i parametri passati nella riga dei comandi
#!/bin/bash
for valore in $*
do
echo $valore
done
Naso Ing. Michele 39
Costrutti sintatticiiterativi: ciclo for
Esempio2Scrivere uno script che conta
Il numero di file contenuto nella sottodirectory comunicata con la riga di comando
#!/bin/bashsomma=0cd ./$1elenco=‛ls -la‛
for var in elencodo
let somma+=1doneEcho “ il numero dei file contenuto in $1 è $somma”
Naso Ing. Michele 40
Costrutti sintatticiiterativi condizionati: ciclo while
while [ condizione ]
do
comando1
comando2
comando3
…
done
I comandi compresi tra la clausola do e done sono eseguiti fino a quando la condizione è vera. Quando la condizione diventerà falsa sarà eseguito il comando dopo al done. Se per caso si va in loop interrompere l’esecuzione come al solito con il Ctrl+C
Naso Ing. Michele 41
Costrutti sintatticiiterativi condizionati: ciclo while
EsempioScrivere uno script che calcola il quadrato di un numero fornito in input e visualizza il quadrato come somma dei primi n numeri dispari
#!/bin/bash
dispari=1
somma=0;
read –p “inserisci un valore” x
indice=1
while [ indice .le. $x ]
do
let somma+=dispari
let dispari+=2
let indice+=1
Done
echo -e “IL quadrato di $x è /t $somma”
Se x=3 somma=1+3+5=9
Naso Ing. Michele 42
Costrutti sintatticiiterativi condizionati: ciclo until
until [condizione ]
do
comando1
comando2
….
done
La logica è dello stesso tipo della while con la differenza che i comandi sono eseguiti se la condizione è falsa ed quando la condizione sarà vera verrà eseguito il comando dopo la clausola done
Naso Ing. Michele 43
Costrutti sintatticiiterativi condizionati: ciclo until
Scrivere uno script che calcola il quadrato di un numero fornito in input e visualizza il quadrato come somma dei primi n numeri dispari
#!/bin/bash
dispari=1
somma=0;
read –p “inserisci un valore” x
indice=1
until [ indice .gt. $x ]
do
let somma+=dispari
let dispari+=2
let indice+=1
done
echo -e “IL quadrato di $x è /t $somma”
Se x=3 somma=1+3+5=9
Naso Ing. Michele 44
Le funzioni
La funzione è un oggetto che consente di organizzare uno script complesso in più sottoscript più semplice. E’ associabile alle macro di un macroassemblatore
Le funzioni vanno definiti all’interno dello script che li utilizza con la seguente sintassi:
#!/bin/bash
# Definizione di una funzione
function nomefunzione ()
{
[ dichiarazione di variabili locali con la keyword local]
Corpo della funzione
}
#attivazione funzione all’interno dello script
nomefunzione
…
All’interno di una funzione si puù utilizzare il comando return per interrompere l’esecuzione senza eseguire tutti i comandi. Le funzioni sono ricorsive quindi si posso implemetare algoritmi ricorsivi. Si possono utilizzare le variabili posizionali per pasare parametri nella riga di comando
Ogni funzione ha le proprie variabili posizionali
Naso Ing. Michele 45
Funzioni
Esempio
Scrivere uno script che leggendo tre numeri
associabili ai lati di un triangolo fornisce un
messaggio che dica se i tre lati formano o meno un
triangolo rettangolo
Lo script prevede una funzione che riceve un numero intero e restituisce il quadrato.
Lo script principale sfrutta la funzione per ottenere i
quadrati dei tre numeri letti e fa il test decisionale.
Naso Ing. Michele 46
#!/bin/bash
function quadrato ()
{
local somma=0
local dispari=1
local indice =1
while [ indice .le. $1 ]
do
let somma+=dispari
let dispari +=2
let indice+=1
done
let risultato=somma
}
Naso Ing. Michele 47
read –p “Inserisci ulato minore ” x
quadrato xlet latoA=risultatoread –p “Inserisci lato intermedio” x
quadrato xlet latoB=risultatoread –p “Inserisci lato maggiore” x
quadrato xlet latoC=risultatolet sommaquadratocateti=latoA*latoA + latoB*latoBlet quadratoipotenusa=latoC*latoCIf [ sommaquadratocateti -eq quadratoipotenusa ]
thenecho ‘ Triangolo Rettangolo’
elseecho ‘Triangolo non rettangolo’
Naso Ing. Michele 48
Naso Ing. Michele 49