【问题标题】:How to manipulate arrays using indirect references in ksh?如何在 ksh 中使用间接引用来操作数组?
【发布时间】:2011-10-28 09:20:03
【问题描述】:

我想做一个这样的脚本:

#!/usr/bin/ksh93    
typeset -A foo

function fillItUP {
    typeset -A newarr
    newarr["this"]="bar"
    newarr["another"]="tut"

    inputarrayname=$1

    nameref $inputarrayname=newarr
}

使用排序的输出:

fillItUP "foo"
echo ${foo["this"]}
bar

我想这很明显,但我想做的是使用双重间接引用来操作函数内部的数组,然后在外部使用它。 没用 :(

有人知道实现这一目标的方法吗?

【问题讨论】:

  • 您好,您能否举例说明双重间接引用的含义。在问题本身中将其添加为 EDIT。
  • 嗯,那应该已经存在了,只是可能不是正确的术语(抱歉,想不出更好的方法)。这个想法是当我收到“foo”作为参数时,并尝试将其更改为指向我在函数内创建的变量。我说双重间接,因为我正在尝试更改函数内部的“指针”(在调用时我将第一个间接引用作为参数接收)。我是设法解释还是弄得更糟:(

标签: arrays shell reference ksh


【解决方案1】:

感谢您的解释。我理解你想要实现的目标。

现在是工作代码

#!/usr/bin/ksh93
typeset -A foo
foo["this"]="old bar"
foo["another"]="old tut"

function fillItUP {
    nameref newarr=$1
    newarr["this"]="bar"
    newarr["another"]="tut"
    ## nameref newarr=$1


}
fillItUP foo
echo ${foo["this"]}

typeset -n 的 nameref 的整个想法是将变量从一个范围提供给另一个范围。在您的示例代码中,您首先将一个本地数组分配给您的函数fillItUP(注意:为什么是本地的??请在 ...typeset and scope 上阅读此内容),然后尝试将本地数组指向 foo。如果你想改变foo..你需要让局部变量指向foo然后改变它。

如果您取消注释“注释的 nameref”并注释“未注释的 nameref” 您会看到 foo 的值仍然是“旧栏”。 如果您按原样执行我添加的代码,您将看到 if foo[this]=bar 的值,而不是“旧 bar”

希望这会有所帮助。

注意:您可以注释掉 foo 的初始“旧”内容并尝试一下 :)

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2020-03-21
    • 2018-12-26
    • 1970-01-01
    • 2012-06-26
    • 2011-10-14
    • 1970-01-01
    • 2019-03-05
    相关资源
    最近更新 更多