web-dev-qa-db-fra.com

Dans les scripts bash, quelle est la différence entre déclarer et une variable normale?

Dans les scripts bash:

nous créons une variable en la nommant simplement:

abc=ok

ou nous pouvons utiliser declare

declare abc=ok

quelle est la différence?

et pourquoi bash crée-t-il autant de façons de créer une variable?

50
lovespring

De help -m declare:

[~ # ~] nom [~ # ~]

    declare- Définissez les valeurs et les attributs des variables.

[~ # ~] synopsis [~ # ~]

    declare [-aAfFgilnrtux] [-p] [name [=value] ...]

[~ # ~] description [~ # ~]

    Définissez les valeurs et les attributs des variables.

    Déclarez les variables et donnez-leur des attributs. Si aucun NOM n'est indiqué, affichez les attributs et les valeurs de toutes les variables.

    Options:

      -f
        restreindre l'action ou l'affichage aux noms et définitions de fonction
      -F
        restreindre l'affichage aux noms de fonction uniquement (plus le numéro de ligne et le fichier source lors du débogage)
      -g
        créer des variables globales lorsqu'elles sont utilisées dans une fonction Shell; sinon ignoré
      -p
        afficher les attributs et la valeur de chaque NOM

    Options qui définissent les attributs:

      -a
        pour créer des tableaux indexés NAME (si pris en charge)
      -A
        pour créer des tableaux associatifs NAME (si pris en charge)
      -i
        pour que les NOMS aient l'attribut "entier"
      -l
        pour convertir les NOM en minuscules lors de l'attribution
      -n
        faire de NAME une référence à la variable nommée par sa valeur
      -r
        pour rendre les NOMs en lecture seule
      -t
        pour que les NOM aient l'attribut "trace"
      -u
        pour convertir les NOM en majuscules lors de l'affectation
      -x
        pour exporter des NOMs

    Utilisation de ‘+ "au lieu de" - "désactive l'attribut donné.

    Les variables avec l'attribut entier ont une évaluation arithmétique (voir la commande let) effectuée lorsque la variable se voit affecter une valeur.

    Lorsqu'il est utilisé dans une fonction, declare rend les NOM locaux, comme avec la commande local. Le ‘-g "l'option supprime ce comportement.

    Statut de sortie:
    Renvoie le succès sauf si une option non valide est fournie ou qu'une erreur d'affectation de variable se produit.

VOIR ÉGALEMENT

    bash (1)

Implémentation de [~ # ~] [~ # ~]

    GNU bash, version 4.3.11 (1) -release (i686-pc-linux-gnu)
    Copyright (C) 2013 Free Software Foundation, Inc.
    Licence GPLv3 +: GNU GPL version 3 ou ultérieure <http://gnu.org/licenses/gpl.html>

Ainsi, declare est utilisé pour définir les valeurs des variables et les attributs .

Permettez-moi de montrer l'utilisation de deux attributs avec un exemple très simple:

$ # First Example:
$ declare -r abc=ok
$ echo $abc
ok
$ abc=not-ok
bash: abc: readonly variable


$ # Second Example:
$ declare -i x=10
$ echo $x
10
$ x=ok
$ echo $x
0
$ x=15
$ echo $x
15
$ x=15+5
$ echo $x
20

D'après l'exemple ci-dessus, je pense que vous devriez comprendre l'utilisation de la variable declare par rapport à la variable normale! Ce type de declareation est utile dans les fonctions, boucles avec script.

Visitez également Typing variables: declare or typeset

39
Pandya

abc=ok assigne une valeur à la variable abc. declare abc déclare une variable appelée abc. Les deux peuvent être combinés comme declare abc=ok.

En bash, comme les autres shells, les variables de chaîne et de tableau n'ont pas besoin d'être déclarées, donc declare n'est pas nécessaire sauf si vous voulez passer des options, par ex. declare -A abc pour faire de abc un tableau associatif ou declare -r pour rendre une variable en lecture seule. Cependant, à l'intérieur d'une fonction, declare fait une différence: il fait que la variable est locale à la fonction, ce qui signifie que la valeur de la variable en dehors de la fonction (le cas échéant) est préservée. (Sauf si vous utilisez declare -g, ce qui rend la variable non locale; ceci est utile lorsqu'il est combiné avec d'autres options, par ex. declare -gA pour créer un tableau associatif global dans une fonction.) Exemple:

f () {
  declare a
  a='a in f'
  b='b in f'
  echo "From f: a is $a"
  echo "From f: b is $b"
}
a='Initial a'
b='Initial b'
f
echo "After f: a is $a"
echo "After f: b is $b"

Production:

From f: a is a in f
From f: b is b in f
After f: a is Initial a
After f: b is b in f

Une autre chose que vous pouvez faire avec la fonction intégrée declare est

La fonction intégrée declare est unique à bash. Il est fortement inspiré et très proche de la commande intégrée typeset de ksh, et bash fournit typeset comme synonyme de declare pour la compatibilité. (Je ne sais pas pourquoi bash ne l'a pas simplement appelé typeset). Il existe un troisième synonyme, local. Il y a aussi export, qui est identique à declare -x, encore pour la compatibilité (avec tous les Shell de style Bourne).