9.4. Typer des variables : declare ou typeset

Les commandes internes declare et typeset (ils sont synonymes) permettent de restreindre les propriétés des variables. C'est une forme très faible de déclaration de variables disponible dans certains langages de programmation. La commande declare est spécifique à la version 2, ou supérieure, de Bash. La commande typeset fonctionne aussi dans les scripts ksh.

Options pour declare/typeset

-r lecture seule
declare -r var1

(declare -r var1 fonctionne de la même façon que readonly var1)

Ceci est l'équivalent du qualificateur C const. Une tentative de modification de la valeur d'une variable en lecture seule échoue avec un message d'erreur.

-i entier
declare -i nombre
# Ce script va traiter les occurrences suivantes de "nombre" comme un entier.

nombre=3
echo "Nombre = $nombre"     # Nombre = 3

nombre=trois
echo "Nombre = $nombre"     # Nombre = 0
# Essaie d'évaluer la chaîne "trois" comme un entier.

Certaines opérations arithmétiques sont permises pour des variables déclarées entières sans avoir besoin de expr ou de let.

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

declare -i n
n=6/3
echo "n = $n"       # n = 2
-a tableau (array)
declare -a index

La variable index sera traitée comme un tableau.

-f fonction(s)
declare -f

Une ligne declare -f sans argument dans un script donnera une liste de toutes les fonctions définies auparavant dans ce script.

declare -f nom_fonction

Un declare -f nom_fonction dans un script liste simplement la fonction nommée.

-x export
declare -x var3

Ceci déclare la disponibilité d'une variable pour une exportation en dehors de l'environnement du script lui-même.

-x var=$value
declare -x var3=373

La commande declare permet d'assigner une valeur à une variable lors de sa déclaration.

Exemple 9.23. Utiliser declare pour typer des variables

#!/bin/bash

fonc1 ()
{
echo Ceci est une fonction.
}

declare -f        # Liste la fonction ci-dessus.

echo

declare -i var1   # var1 est un entier.
var1=2367
echo "var1 déclaré comme $var1"
var1=var1+1       # La déclaration d'un entier élimine le besoin d'utiliser let.
echo "var1 incrémenté par 1 vaut $var1."
# Essai de modification de la variable déclarée comme entier.
echo "Essai de modification de var1 en une valeur flottante, 2367.1."
var1=2367.1       # Résultat: un message d'erreur, et une variable non modifiée.
echo "var1 vaut toujours $var1"

echo

declare -r var2=13.36           #  'declare' permet de configurer une variable
                                #+ proprement et de lui affecter une valeur.
echo "var2 déclaré comme $var2" #  Essai de modification d'une valeur en lecture
                                #+ seule.
var2=13.37                      # Génère un message d'erreur, et sort du script.

echo "var2 vaut toujours $var2" # Cette ligne ne s'exécutera pas.

exit 0                          # Le script ne terminera pas ici.

[Attention]

Attention

Utiliser la commande interne declare restreint la portée d'une variable.

foo ()
{
FOO="bar"
}

bar ()
{
foo
echo $FOO
}

bar   # Affiche bar.

Néanmoins...

foo (){
declare FOO="bar"
}

bar ()
{
foo
echo $FOO
}

bar  # N'affiche rien.


# Merci pour cette indication, Michael Iatrou.