Dans les scripts bash, quelle est la différence ' entre declare 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 fait-il autant de façons de créer une variable?

Commentaires

  • Lorsquil est utilisé dans une fonction, declare rend les NOMs locaux, comme avec la commande local. Loption -g supprime ce comportement. Voir help declare.
  • declare permet de créer des tableaux associatifs, des entiers et des lectures. uniquement des variables. De plus, il étend ses arguments, donc des choses comme declare $name=1 sont possibles.

Réponse

De help -m declare:

NOM

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

SYNOPSIS

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

DESCRIPTION

    Définir les valeurs et attributs des variables.

    Déclarer les variables et donnez-leur des attributs. Si aucun NOM nest indiqué, affichez les attributs et les valeurs de toutes les variables.

    Options:

      -f

        restreindre laction ou laffichage aux noms et définitions de fonction

      -F

        limiter laffichage 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 lorsquelles 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 NOM aient lattribut integer

      -l

        pour convertir les NOM en minuscules lors de lattribution

      -n

        faire de NAME une référence à la variable nommée par sa valeur

      -r

        pour rendre NOMs adonly

      -t

        pour que les NOM aient le attribut trace

      -u

        pour convertir les NOM en majuscules lors de laffectation

      -x

        pour créer des NOM export

    Utilisation de + au lieu de - désactive lattribut donné .

    Les variables avec lattribut entier ont une évaluation arithmétique (voir la commande let) effectuée lorsque la variable reçoit une valeur.

    Quand utilisé dans une fonction, declare rend les NOM locaux, comme avec la commande local. Loption -g supprime ce comportement.

    Statut de sortie:
    Renvoie le succès sauf si une option non valide est fournie ou quune erreur dattribution de variable se produit.

VOIR AUSSI

    bash (1)

IMPLEMENTATION

    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 version ultérieure < http : //gnu.org/licenses/gpl.html >


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

Permettez-moi de montrer lutilisation 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 

À partir de lexemple ci-dessus, je pense que vous devriez comprendre lutilisation de declare variable sur la variable normale! Ce type de declare ation est utile dans les fonctions, les boucles avec script.

Visitez également Variables de saisie: declare ou composition

Commentaires

  • oui, les " et les attributs " est le point! cest la différence.
  • Génial! Jadore les exemples, la meilleure façon denseigner / dapprendre. Merci!
  • Vous devez savoir quels sont les " attributs " pour comprendre cette réponse. Ils ' concernent les propriétés de la variable comme ' integer ', ' array ' ou ' en lecture seule '.
  • Cela fait un bon travail dexplication de declare, mais ignore complètement ce qui se passe lorsque vous déclarez simplement une variable via bash.

Réponse

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

Dans bash, comme les autres shells, les variables de chaîne et de tableau nont pas besoin dêtre déclarées, donc declare nest pas nécessaire sauf si vous voulez passer des options, par exemple declare -A abc pour faire de abc un tableau associatif ou declare -r pour rendre une variable en lecture seule. Cependant, à lintérieur dune fonction, declare 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 préservée . (Sauf si vous utilisez declare -g, ce qui rend la variable non locale; ceci est utile lorsquil est combiné avec dautres options, par exemple declare -gA pour créer un fichier global tableau associatif 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 

Autre ce que vous pouvez faire avec le declare intégré est

Le declare intégré est unique à bash. Il « est fortement inspiré et très proche de ksh » s typeset intégré, et bash fournit typeset comme synonyme de declare pour la compatibilité. (Je ne sais pas pourquoi bash ne la pas simplement appelé typeset). Il ya « un troisième synonyme, local. Il » y a aussi export, qui est identique à declare -x, encore une fois pour la compatibilité (avec tous les shell de style Bourne).

Commentaires

  • oui! le ' et loption ' est le point. p.s. si je conçois le bash, je laisserai le comportement de " déclarer " faire quelque chose dans des conditions différentes. cela simplifie les choses.
  • Bonne réponse. Une autre question, laquelle parmi export, local et declare est la plus compatible avec dautres shells?
  • @ 0xc0de export existe dans toutes les variantes de sh. local nexiste que dans bash et zsh, declare uniquement dans bash. typeset existe en ksh, bash et zsh.

Laisser un commentaire

Votre adresse e-mail ne sera pas publiée. Les champs obligatoires sont indiqués avec *