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
  • / - 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 contesto if, …
  • $(( 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