局部变量和星号

问题描述

| 我已经在接收第一个参数($ {1})值的函数中声明了一个LOCAL变量(a)。当我在第一个参数的内容中使用带星号的a进行调用时,值分配具有不同的处理方式。为什么?
# 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
注意:+ local \'a = param_1 _ * \'<-看到了吗?在变量名\“ 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
注意:+ a = \'param_1 _ * \'<-在这种情况下,在等号后插入引号     

解决方法

        bash的-x模式对它们的显示方式有所不同,但这并不意味着bash对它们的处理方式有所不同。这里发生的是,当bash执行
local a=\"${1}\"
时,它将其解析为某种内部表示形式(比字符串复杂一些),将第一个参数替换为该内部表示形式,然后注意到-x模式处于活动状态。因此,它要做的就是获取内部表示形式,并将其解析为您可以键入以得到相同效果的命令。通常,有多种方法可以键入产生相同效果的命令(即内部表示形式),并且可以选择其中一种。它可以打印以下任何内容:
+ local a=\'param_1_*\'
+ local \'a=param_1_*\'
+ local $\'a=param_1_*\'
+ local a=param_1_\"*\"
+ local a=param_1_\\*
...或许多其他可能性中的任何一种。它的选择可能不是您所期望的,但这是键入“ same \”命令的一种完全有效的方法。 就像@Rob所说的那样,BTW的区别在于
a=\'param_1_*\'
\'a=param_1_*\'
不是等效命令,而
local a=\'param_1_*\'
local \'a=param_1_*\'
是等效命令。这是因为在本地命令中,赋值本质上是一个参数,而用引号引起来的引用与独立赋值无关。因此,当显示
a=\"${1}\"
时,它可以打印以下任一项:
+ a=\'param_1_*\'
+ a=\"param_1_*\"
+ a=param_1_$\'*\'
+ a=param_1_\\*
但这些都不是:
+ \'a=param_1_*\'
+ \"a=param_1_*\"
+ $\'a=param_1_*\'
    ,        我不认为星号是有区别的。在您的两个函数中,一个是声明局部变量,另一个是设置shell变量。在第一种情况下,您将
a=param_1_*
作为参数传递给本地内置函数(shell并不关心这些字符中的一个是
*
还是
=
),但是在第二种情况中,shell会将
a=foo
解析为它的组件。在第一种情况下,在整个参数周围加上引号是有意义的,即
a=param_1_*
,但在第二种情况中则没有意义,因为您不能在shell提示符下真正键入
\'a=param_1_*\'
并期望shell设置一个变量。