2011-05-30 7 views
0

J'ai déclaré une variable LOCAL (a) dans une fonction qui reçoit la valeur du premier paramètre ($ {1}). Quand je l'appelle avec un astérisque dans le contenu du premier paramètre, l'affectation de la valeur a un traitement différent. Pourquoi?variable locale et astérisque

# function_name() { local a="${1}"; echo $a; } 
# set -xv && function_name "param_1_*" && set +xv 
set -xv && function_name "param_1_*" && set +xv 
+ set -xv 
+ function_name 'param_1_*' 
+ local 'a=param_1_*' 
+ echo 'param_1_*' 
param_1_* 
+ set +xv 

REMARQUE: + local 'a = param_1_ *' < - Voir? la citation est inséré avant le nom de la variable "a"

# function_name() { a="${1}"; echo $a; } 
# set -xv && function_name "param_1_*" && set +xv 
+ function_name 'param_1_*' 
+ a='param_1_*' 
+ echo 'param_1_*' 
param_1_* 
+ set +xv 

REMARQUE: + a = 'param_1_ *' < - Dans ce cas, la citation est inséré après le signal égal

+0

@Rob: vous devriez probablement mettre cela en guise de réponse. –

Répondre

1

I don Je ne pense pas que l'astérisque soit la différence. Dans vos deux fonctions, l'une déclare un local et l'autre définit une variable shell. Dans le premier cas, vous passez a=param_1_* comme argument à la version locale (et le shell ne se soucie pas que l'un de ces caractères soit un * ou un =), mais dans la seconde le shell analyse le a=foo dans ses composants . Dans le premier cas, il est logique de placer des guillemets autour de l'argument entier, a=param_1_*, mais cela n'a pas de sens dans la seconde, car vous ne pouvez pas vraiment taper 'a=param_1_*' à l'invite du shell et attendre que le shell la variable a.

1

Ils sont affichés différemment par le mode -x de bash, mais cela ne signifie pas que bash les traite différemment. Qu'est-ce qui se passe ici, c'est que lorsque bash exécute local a="${1}", il l'analyse dans une représentation interne (quelque chose de plus compliqué qu'une chaîne), substitue le premier paramètre dans cela, puis remarque que le mode -x est actif. Ce qu'il fait, c'est prendre cette représentation interne, et la décomposer en une commande que vous pourriez taper pour obtenir le même effet. En général, il y aura un certain nombre de façons de taper une commande qui produirait le même effet (c'est-à-dire la représentation interne), et elle en choisit une. Il pourrait imprimer une des opérations suivantes:

+ local a='param_1_*' 
+ local 'a=param_1_*' 
+ local $'a=param_1_*' 
+ local a=param_1_"*" 
+ local a=param_1_\* 

... ou tout d'un certain nombre d'autres possibilités. Son choix n'est peut-être pas celui que vous attendez, mais c'est une manière parfaitement valide de taper dans la "même" commande.

BTW, en tant que dit @Rob, il existe une différence en ce que a='param_1_*' et 'a=param_1_*' sont pas commandes équivalentes, tandis que local a='param_1_*' et local 'a=param_1_*' sont équivalents. En effet, avec la commande locale, l'assignation est essentiellement un paramètre, et la citation autour de celle-ci n'a pas autant d'importance qu'avec une affectation autonome. Ainsi, lors de l'affichage a="${1}", il pourrait imprimer tous:

+ a='param_1_*' 
+ a="param_1_*" 
+ a=param_1_$'*' 
+ a=param_1_\* 

mais aucun de ceux-ci:

+ 'a=param_1_*' 
+ "a=param_1_*" 
+ $'a=param_1_*'