9.4. Tipizzare le variabili: declare o typeset

I builtin declare o typeset (sono sinonimi esatti) consentono di limitare le proprietà delle variabili. È una forma molto debole di tipizzazione, se confrontata con quella disponibile per taluni linguaggi di programmazione. Il comando declare è specifico della versione 2 o successive di Bash. Il comando typeset funziona anche negli script ksh.

opzioni declare/typeset

-r readonly (sola lettura)

declare -r var1

(declare -r var1 è uguale a readonly var1)

È approssimativamente equivalente al qualificatore di tipo const del C. Il tentativo di modificare il valore di una variabile in sola lettura fallisce generando un messaggio d'errore.

-i intero

declare -i numero
# Lo script tratterà le successive occorrenze di "numero" come un intero.

numero=3
echo "numero = $numero"     # Numero = 3

numero=tre
echo "Numero = $numero"     # numero = 0
# Cerca di valutare la stringa "tre" come se fosse un intero.

Sono consentire alcune operazioni aritmetiche sulle variabili dichiarate interi senza la necessità di usare expr o let.

n=6/3
echo "n = $n"       # n = 6/3

declare -i n
n=6/3
echo "n = $n"       # n = 2

-a array

declare -a indici

La variabile indici verrà trattata come un array.

-f funzioni

declare -f

In uno script, una riga con declare -f senza alcun argomento, elenca tutte le funzioni precedentemente definite in quello script.

declare -f nome_funzione

Un declare -f nome_funzione elenca solo la funzione specificata.

-x export

declare -x var3

Dichiara la variabile come esportabile al di fuori dell'ambiente dello script stesso.

-x var=$valore

declare -x var3=373

Il comando declare consente di assegnare un valore alla variabile mentre viene dichiarata, impostando così anche le sue proprietà.

Esempio 9-22. Utilizzare declare per tipizzare le variabili

#!/bin/bash

funz1 ()
{
echo Questa è una funzione.
}

declare -f        # Elenca la funzione precedente.

echo

declare -i var1   # var1 è un intero.
var1=2367
echo "var1 dichiarata come $var1"
var1=var1+1       #  La dichiarazione di intero elimina la necessità di
                  #+ usare 'let'.
echo "var1 incrementata di 1 diventa $var1."
# Tentativo di modificare il valore di una variabile dichiarata come intero.
echo "Tentativo di modificare var1 nel valore in virgola mobile 2367.1."
var1=2367.1       # Provoca un messaggio d'errore, la variabile non cambia.
echo "var1 è ancora $var1"

echo

declare -r var2=13.36         #  'declare' consente di impostare la proprietà
                              #+ della variabile e contemporaneamente 
                              #+ assegnarle un valore.
echo "var2 dichiarata come $var2"
                              #  Tentativo di modificare una variabile in sola
                              #+ lettura.
var2=13.37                    #  Provoca un messaggio d'errore e l'uscita dallo
                              #+ script.

echo "var2 è ancora $var2"    # Questa riga non verrà eseguita.

exit 0                        # Lo script non esce in questo punto.

Attenzione

L'uso del builtin declare restringe l'ambito di una variabile.

foo ()
{
FOO="bar"
}

bar ()
{
foo
echo $FOO
}

bar   # Visualizza bar.

Tuttavia . . .

foo (){
declare FOO="bar"
}

bar ()
{
foo
echo $FOO
}

bar  # Non visualizza niente.


# Grazie a Michael Iatrou, per il chiarimento.