【发布时间】:2013-10-05 21:48:25
【问题描述】:
我在 bash 和 ksh 中都遇到了间接问题。下面的示例适用于 ksh。它使用了一个 nameref (typeset -n),但它并没有像我预期的那样工作。 func_a 将数组的名称传递给 func_b 以便可以对其进行修改(在这个简单的例子中,func_b 将第二个条目添加到数组中)。这显然不起作用,因为 func_b 中定义的第二个本地变量发生 具有与 nameref var2 所指的名称相同的名称(来自 func_a 的数组 var1)。 但是,拥有原生 nameref 类型的原因之一(与在 bash 中使用的各种 eval hack 不同)不应该是不必处理函数(在本例中为 func_b)工作的这些动态范围问题为某些来电者准备的 函数而不是仅仅因为局部定义的变量的名称而对其他人? 似乎 nameref var 基本上只是一个别名或宏,而不是连接两个严格分隔的范围的安全方法。我对 bash 有同样的问题,我希望 ksh 能够像在 C 中那样实现间接引用(当然,出于安全原因,不像低级指针,但至少可以说具有类似的“范围隔离”)。我错过了什么吗?
func_b ()
{
typeset -n var2=$1
typeset -i var1
var2[1]=b
}
func_a ()
{
typeset -a var1=( a )
func_b var1
echo "${var1[@]}"
}
【问题讨论】:
-
"似乎 nameref var 基本上只是一个别名或宏,而不是连接两个严格分隔的范围的安全方法。"但是,事实上,nameref 是 只是一个字符串。连接两个严格分开的范围不是一种安全的方法。我猜你缺少的是 shell 脚本语言的本质。
-
考虑编辑您的问题以包括您的示例输入、所需输出和当前输出。很难从您的文本描述中说出您的期望是什么,而示例输入和输出将很容易理解。祝你好运。
标签: bash scope pass-by-reference ksh