Capitolo 4. Introduzione alle variabili ed ai parametri

Sommario
4.1. Sostituzione di variabile
4.2. Assegnamento di variabile
4.3. Le variabili Bash non sono tipizzate
4.4. Tipi speciali di variabili

Le variabili rappresentano il modo in cui i linguaggi di scripting e di programmazione identificano i dati. Una variabile non è nient'altro che un'etichetta, un nome assegnato a una locazione, o a una serie di locazioni, di memoria del computer che contiene un dato.

Le variabili compaiono nelle operazioni aritmetiche, nelle manipolazioni quantitative e nelle verifiche di stringhe.

4.1. Sostituzione di variabile

Il nome di una variabile è il contenitore del suo valore, il dato memorizzato. Il riferimento a questo valore è chiamato sostituzione di variabile.

$

Bisogna fare una netta distinzione tra il nome di una variabile ed il suo valore. Se variabile1 è il nome di una variabile, allora $variable1 è il riferimento al suo valore, il dato in essa contenuto.

bash$ variabile=23


bash$ echo variabile
variabile

bash$ echo $variabile
23

L'unica volta in cui una variabile compare "nuda" -- senza il prefisso $ -- è quando viene dichiarata o al momento dell'assegnamento, quando viene annullata, quando viene esportata, o nel caso particolare di una variabile che rappresenta un segnale (vedi Esempio 29-5). L'assegnamento può essere fatto con l'= (come in var1=27), con un enunciato read ed all'inizio di un ciclo (for var2 in 1 2 3).

Racchiudere il nome della variabile tra doppi apici (" ") non interferisce con la sostituzione di variabile. Questo viene chiamato quoting parziale, o anche "quoting debole". Al contrario, l'utilizzo degli apici singoli (' ') fa sì che il nome della variabile venga interpretato letteralmente, per cui la sostituzione non avverrà. In questo caso si ha il quoting pieno, chiamato anche "quoting forte". Vedi Capitolo 5 per una trattazione dettagliata.

È da notare che $variabile in realtà è una forma semplificata ed alternativa di ${variabile}. In contesti in cui la sintassi $variabile può provocare un errore, la forma estesa potrebbe funzionare (vedi la Sezione 9.3, più oltre).

Esempio 4-1. Assegnamento e sostituzione di variabile

#!/bin/bash

# Variabili: assegnamento e sostituzione

a=375
ciao=$a

#----------------------------------------------------------------------------
#  Quando si inizializzano le variabili, non sono consentiti spazi prima
#+ e dopo il segno  =.
#  Cosa succederebbe se ce ne fosse uno?

#  Nel caso "VARIABILE =valore",
#                     ^
#% Lo script cerca di eseguire il comando "VARIABILE"  con l'argomento
#+ "=valore". 

#  Nel caso "VARIABILE= valore", 
#                      ^
#% Lo script cerca di eseguire il comando "valore" con la variabile
#+ d'ambiente "VARIABILE" impostata a "".
#----------------------------------------------------------------------------


echo ciao     # Non è un riferimento a variabile, ma solo la stringa "ciao".

echo $ciao
echo ${ciao}  # Come sopra.

echo "$ciao"
echo "${ciao}"

echo

ciao="A B  C   D"
echo $ciao    # A B C D
echo "$ciao"  # A B  C   D
#  Come si può vedere, echo $ciao  e  echo "$ciao" producono                                       
#+ risultati differenti. 
# ===============================================
# Il quoting di una variabile preserva gli spazi.
# ===============================================

echo

echo '$ciao'  # $ciao
#    ^     ^
#  Gli apici singoli disabilitano la referenziazione alla variabile,
#+ perché il simbolo "$" viene interpretato letteralmente.

# Notate l'effetto dei differenti tipi di quoting.


ciao=     # Imposta la variabile al valore nullo.
echo "\$ciao (valore nullo) = $ciao"
#  Attenzione, impostare una variabile al valore nullo non è la stessa
#+ cosa di annullarla, sebbene il risultato finale sia lo stesso (vedi oltre).
#
# --------------------------------------------------------------
#
#  È consentito impostare più variabili sulla stessa riga,
#+ separandole con uno spazio.
#  Attenzione, questa forma può diminuire la leggibilità
#+ e potrebbe non essere portabile.

var1=21  var2=22  var3=$V3
echo
echo "var1=$var1   var2=$var2   var3=$var3"

# Potrebbe causare problemi con le versioni più vecchie di "sh". . .

# --------------------------------------------------------------

echo; echo

numeri="uno due tre"
#          ^   ^
altri_numeri="1 2 3"
#              ^ ^
#  Se ci sono degli spazi all'interno di una variabile, 
#+ allora è necessario il quoting.
#  altri_numeri=1 2 3                  # Dà un messaggio d'errore.
echo "numeri = $numeri"
echo "altri_numeri = $altri_numeri"    # altri_numeri = 1 2 3
#  Funziona anche l'escaping degli spazi.
miscuglio=2\ ---\ Altro
#           ^    ^ Spazio dopo il carattere di escape (\).

echo "$miscuglio"              # 2 --- Altro

echo; echo

echo "variabile_non_inizializzata = $variabile_non_inizializzata"
# Una variabile non inizializzata ha valore nullo (nessun valore).
variabile_non_inizializzata=   #  Viene dichiarata, ma non inizializzata -
                               #+ è come impostarla al valore nullo,
                               #+ vedi sopra.
echo "variabile_non_inizializzata = $variabile_non_inizializzata"
                               # Ha ancora valore nullo.

variabile_non_inizializzata=23       # È impostata.
unset variabile_non_inizializzata    # Viene annullata.
echo "variabile_non_inizializzata = $variabile_non_inizializzata"
                                     # Ha ancora valore nullo.
echo

exit 0

Attenzione

Una variabile non inizializzata ha valore "nullo": cioè proprio nessun valore (non zero!). Utilizzare una variabile prima di averle assegnato un valore, solitamente provoca dei problemi.

Ciò nonostante è possibile eseguire operazioni aritmetiche su una variabile non inizializzata.

echo "$non_inizializzata"                          # (riga vuota)
let "non_inizializzata += 5"                       # Aggiunge 5 alla variabile.
echo "$non_inizializzata"                          # 5

#  Conclusione:
#  Una variabile non inizializzata non ha alcun valore, tuttavia si comporta, 
#+ nelle operazioni aritmetiche, come se il suo valore fosse 0 (zero).
#  Questo è un comportamento non documentato (e probabilmente non portabile).
Vedi anche Esempio 14-22.