Tipi, Arrays ed Espressioni
Bash, a differnenza di sh ammette la dichiarazione opzionale di tipi di variabili. Tutte le variabili il cui tipo non è dichiarato sono di default stringhe.
Non ci sono tipi veri ma indicazioni sull'utilizzo.
In realtà dei tipi se ne può fare benissimo a meno. La shell non è un linguaggiodi programmazione applicativi, ma un metodo per automatizzare attività di sistema.
Per assegnare un altro tipo, esempio:
declare -i conta=1
- tipo intero
Opzioni per i tipi:
-a var
- array-f var
- funzione-i var
- intero-r var
- read-only (costante: deve subito venire assegnata)-p var
- mostra gli attributi e il tipo-t var
- marcata per il trace-x var
- marcata per l'export all'ambiente
Esempio.
(tipi1.sh):
#! /bin/bash
declare -i conta=1
echo $conta
conta=pippo
echo $conta
declare -p conta
declare -r PI=3.14159
PI=3
echo PI=$PI
Uso:
./tipi1.sh
1
0
declare -i conta="0"
./tipi1.sh: line 8: PI: readonly variable
PI=3.14159
Altro esempio.
(tipi2.sh):
#! /bin/bash
var=pippo
declare -p var
readonly area=7.25
area=3
declare -p area
Uso:
./tipi2.sh
declare -- var="pippo"
./tipi2.sh: line 5: area: readonly variable
declare -r area="7.25"
readonly
è un sinonimo di declare -r
Array
Strutture monodimensionali ad allocazione dinamica di elementi
indicizzati con interi
- Indici iniziano da zero (non da uno)
- Non tutti gli elementi devono esistere (buchi possibili)
Dichiarazione esplicita:
declare -a array
Dichiarazione indiretta su inizializzazione di un elemento:
array[indice]=valore
Notare l'assenza di spazi
Inizializzazione con più valori:
array=(val1 val2 val3 …)
I separatori sono spazi
Accesso agli array:
- Riferimento a elemento:
${array[indice]}
- Le graffe sono necessarie
- Il valore del nome di un array è il valore del suo primo elemento
$array
come${array[0]}
- Lista di tutti gli elementi assegnati:
${array[*]}
- Numero degli elementi assegnati:
${#array[*]}
- Lunghezza di un elemento di array:
${#array[indice]}
- E' trattato come stringa
Esempio
(array1.sh):
#! /bin/bash
colori=(bianco rosso verde)
echo ${colori[*]}
echo $colori
echo $colori[*]
echo ${colori[0]}
echo ${colori[1]}
echo ">>${colori[4]}<<"
colori[4]=blu
echo ">>${colori[4]}<<"
echo ${colori[*]}
Esecuzione:
./array1.sh
bianco rosso verde
bianco
bianco[*]
bianco
rosso
>><<
>>blu<<
bianco rosso verde blu
Altro esempio.
(array2.sh):
#! /bin/bash
animali=(mucca gatto cane)
animali[4]=corvo
echo "Lista: ${animali[*]}"
echo "Numero: ${#animali[*]}"
unset animali[1]
echo "Lista: ${animali[*]}"
unset animali
echo "Lista: ${animali[*]}"
Esecuzione:
./array2.sh
Lista: mucca gatto cane corvo
Numero: 4
Lista: mucca cane corvo
Lista:
Il comando expr
E' un valutatore di espressioni
Uso:
variabile=$(expr espressione)
- Un'espressione contiene operandi e operatori
- Ogni elemento deve essere separato da spazi
- Operatori aritmetici infissi - solo su numeri interi
+
- addizione-
- sottrazione\*
- moltiplicazione- occorre lo
\
perchè*
è un metacarattere shell
- occorre lo
/
- divisione%
- modulo (resto della divisione)
Esempio.
(expr1.sh):
#! /bin/bash
v1=10; v2=3
echo "var1=$v1 var2=$v2"
echo "piu': $(expr $v1 + $v2)"
echo "meno: $(expr $v1 - $v2)"
echo "per: $(expr $v1 \* $v2)"
echo "diviso: $(expr $v1 / $v2)"
echo "modulo: $(expr $v1 % $v2)"
Ce da:
./expr1.sh
var1=10 var2=v2
piu': 13
meno: 7
per: 30
diviso: 3
modulo: 1
Le espressioni aritmetiche e logiche possono anche essere contenute tra doppie parentesi tonde:
(( espressione ))
- in contestoif
, …$(( espressione ))
- in contesto stringa
NB: ci vogliono gli spazi
Migliorie rispetto ad expr
:
- Le variabili dell'espressione non necessitano del prefisso
$
- Nessun operatore ha bisogno di
\
- Non sono indispensabili gli spazi separatori tra ogni elemento dell'espressione
Esempio.
(expr2.sh):
#! /bin/bash
v1=10; v2=3
echo "var1=$v1 var2=v2"
echo "piu': $((v1+v2))"
echo "meno: $((v1-v2))"
echo "per: $((v1*v2))"
echo "diviso: $((v1/v2))"
echo "modulo: $((v1%v2))"
if ((v1 > v2))
then
echo "$v1 > $v2"
fi
Che dà:
./expr2.sh
var1=10 var2=v2
piu': 13
meno: 7
per: 30
diviso: 3
modulo: 1
10 > 3