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
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:
-frestreindre laction ou laffichage aux noms et définitions de fonction
-Flimiter laffichage aux noms de fonction uniquement (plus le numéro de ligne et le fichier source lors du débogage)
-gcréer des variables globales lorsquelles sont utilisées dans une fonction shell; sinon ignoré
-pafficher les attributs et la valeur de chaque NOM
Options qui définissent les attributs:
-apour créer des tableaux indexés NAME (si pris en charge)
-Apour créer des tableaux associatifs NAME (si pris en charge)
-ipour que les NOM aient lattribut integer
-lpour convertir les NOM en minuscules lors de lattribution
-nfaire de NAME une référence à la variable nommée par sa valeur
-rpour rendre NOMs adonly
-tpour que les NOM aient le attribut trace
-upour convertir les NOM en majuscules lors de laffectation
-xpour 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,
declarerend les NOM locaux, comme avec la commandelocal. Loption-gsupprime 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,localetdeclareest la plus compatible avec dautres shells? - @ 0xc0de
exportexiste dans toutes les variantes desh.localnexiste que dans bash et zsh,declareuniquement dans bash.typesetexiste en ksh, bash et zsh.
declarerend les NOMs locaux, comme avec la commandelocal. Loption-gsupprime ce comportement. Voirhelp declare.declarepermet de créer des tableaux associatifs, des entiers et des lectures. uniquement des variables. De plus, il étend ses arguments, donc des choses commedeclare $name=1sont possibles.