局部变量和星号

时间:2011-05-30 14:56:06

标签: bash function shell variables

我在一个接收第一个参数($ {1})值的函数中声明了一个LOCAL变量(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 _ *'< - 在这种情况下,引号会在等号后插入

2 个答案:

答案 0 :(得分:1)

我不认为星号是不同的。在你的两个函数中,一个是声明一个本地,一个是设置一个shell变量。在第一种情况下,您将a=param_1_*作为参数传递给本地内置函数(并且shell不关心其中一个字符是*还是=),但是在第二个shell中,shell正在将a=foo解析为其组件。在第一种情况下,在整个参数(a=param_1_*)周围加上引号是有意义的,但是在第二种情况下它是没有意义的,因为你无法真正键入'a=param_1_*' shell提示符并期望shell设置变量。

答案 1 :(得分: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_\*

......或任何其他可能性。它的选择可能不是你所期望的,但它是一种完全有效的输入“相同”命令的方式。

BTW,正如@Rob所说,a='param_1_*''a=param_1_*'不是等效命令,而local a='param_1_*'和{{1}有所不同是等价的。这是因为使用本地命令,赋值本质上是一个参数,并且引用它并不像独立赋值那么重要。因此,在显示local 'a=param_1_*'时,它可以打印以下任何内容:

a="${1}"

但不是这些中的任何一个:

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