【问题标题】:local variable and asterisk局部变量和星号
【发布时间】:2011-05-30 14:56:06
【问题描述】:

我在函数中声明了一个本地变量 (a),它接收第一个参数 (${1}) 的值。当我在第一个参数的内容中用星号调用它时,值分配有不同的处理方式。为什么?

# 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_*'

# 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_*'

【问题讨论】:

  • @Rob:你应该把它作为答案。

标签: bash function shell variables


【解决方案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_\*

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

顺便说一句,正如@Rob 所说,a='param_1_*''a=param_1_*'not 等效命令,而 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_*'

【讨论】:

    【解决方案2】:

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2023-03-14
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多