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:
-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 commandelocal
. 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
etdeclare
est la plus compatible avec dautres shells? - @ 0xc0de
export
existe dans toutes les variantes desh
.local
nexiste que dans bash et zsh,declare
uniquement dans bash.typeset
existe en ksh, bash et zsh.
declare
rend les NOMs locaux, comme avec la commandelocal
. Loption-g
supprime ce comportement. Voirhelp 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 commedeclare $name=1
sont possibles.