En bash scripting, quelle est la différence entre declare et une variable normale?

44

Dans le script bash:

nous créons une variable en la nommant simplement:

abc=ok

ou on peut utiliser declare

declare abc=ok

quelle est la différence?

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

source d'amour
la source
6
Lorsqu'elle est utilisée dans une fonction, declareles noms sont locaux, comme avec la localcommande. L' -goption supprime ce comportement. Voir help declare.
Cyrus
2
declarepermet de créer des tableaux associatifs, des entiers et des variables en lecture seule. En outre, il développe ses arguments, de sorte que des choses comme declare $name=1sont possibles.
Choroba

Réponses:

34

De help -m declare:

PRÉNOM

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

SYNOPSIS

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

LA DESCRIPTION

    Définissez les valeurs et les attributs des variables.

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

    Options:

      -f
        restreindre l'action ou l'affichage aux noms de fonction et aux définitions
      -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
        affiche les attributs et la valeur de chaque NOM

    Options qui définissent les attributs:

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

    Utiliser ' +' au lieu de ' -' désactive l'attribut donné.

    Les variables avec l'attribut entier ont une évaluation arithmétique (voir la letcommande) effectuée lorsque la variable est affectée à une valeur.

    Lorsqu'elle est utilisée dans une fonction, declareles noms sont locaux, comme avec la local commande. L' -goption ' ' supprime ce comportement.

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

VOIR ÉGALEMENT

    bash (1)

LA MISE EN OEUVRE

    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/ licences / gpl.html>


Donc, declareest utilisé pour définir des valeurs de variables et des attributs .

Me laisser 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, vous devriez comprendre l'utilisation de declarevariable par rapport à la variable normale! Ce type de declarefonctionnalité est utile dans les fonctions, les boucles avec script.

Visitez aussi Typing variables: declare or typet

Pandya
la source
oui, le "et attributs" est le point! c'est la différence.
Lovespring
Génial! J'aime les exemples, la meilleure façon d'enseigner / d'apprendre. Merci!
jeudi
1
Vous devez savoir quels sont les "attributs" pour comprendre cette réponse. Ce sont des propriétés de la variable telles que 'entier', 'tableau' ou 'en lecture seule'.
Noumenon
11

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

En bash, comme dans d’autres shell, les variables string et array n’ont pas besoin d’être déclarées, elles declarene sont donc pas nécessaires à moins que vous ne souhaitiez passer des options, par exemple declare -A abcpour créer abcun tableau associatif oudeclare -r pour créer une variable en lecture seule. Cependant, à l'intérieur d'une fonction, declarecela fait une différence: cela 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 conservée. (Sauf utilisation declare -g, ce qui rend la variable non locale; ceci est utile lorsqu'il est combiné à d'autres options, par exemple declare -gApour 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"

Sortie:

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 declareintégrée est

Le declareconstruit est unique à bash. Il est fortement inspiré et très proche de celui de ksh typeset, et bash typesetest synonyme de declarecompatibilité. (Je ne sais pas pourquoi bash ne l’a pas appelé typeset). Il y a un troisième synonyme local. Il y a aussi export, ce qui revient au même declare -xprincipe que pour la compatibilité (avec chaque shell de style Bourne).

Gilles, arrête de faire le mal
la source
Oui! le 'et l'option' est le point. ps si je conçois la bash, je laisserai le comportement de "déclarer" faire quelque chose dans des conditions différentes. cela rend les choses simples.
Lovespring
Bonne réponse. Une autre question, que l' on entre export, localet declareest le plus compatible avec d' autres coquilles?
0xc0de
1
@ 0xc0de exportexiste dans toutes les variantes de sh. localn'existe que dans bash et zsh, declareseulement dans bash. typesetexiste dans ksh, bash et zsh.
Gilles 'SO- arrête d'être méchant'