【问题标题】:easy way to cleanly dump contents of associative array in bash?在 bash 中干净地转储关联数组的内容的简单方法?
【发布时间】:2013-02-16 02:21:51
【问题描述】:

zsh 中,我可以使用单个命令轻松转储关联数组的内容:

zsh% typeset -A foo
zsh% foo=(a 1 b 2)
zsh% typeset foo
foo=(a 1 b 2 )

然而,尽管搜索高低,我能找到的最好的是declare -p,其输出包含declare -A

bash$ typeset -A foo
bash$ foo=([a]=1 [b]=2)
bash$ declare -p foo
declare -A foo='([a]="1" [b]="2" )'

有没有一种干净的方法来获得类似zsh 输出的东西(最好是foo=(a 1 b 2 )foo='([a]="1" [b]="2" )'),最好不借助字符串操作?

【问题讨论】:

  • 通过转储内容,您的意思是准确地打印foo=(a 1 b 2 ),还是简单地从容器中打印pairs(key, value)?
  • 为什么包含declare命令的输出有问题?
  • @Rubens:对问题进行了澄清。
  • @glennjackman:这不是一个大问题,但declare -A 是多余的,并且最终会使调试输出变得混乱,因为我已经知道它是一个关联数组。

标签: bash associative-array zsh


【解决方案1】:

除了字符串操作之外似乎没有其他方法可以做到这一点。但至少我们可以避免每次都分叉一个sed 进程,例如:

dump_assoc_arrays () {
    for var in "$@"; do
        read debug < <(declare -p $var)
        echo "${debug#declare -A }"
    done
}

【讨论】:

  • 试过 dump_assoc_arrays $terminfo 但我猜它包含嵌套的 assoc 数组,有没有办法让这个函数递归?
  • dump_assoc_arrays $terminfo 将首先扩展$terminfo,因此只有在$terminfo 包含要转储的关联数组变量的名称 时才有意义。这真的是你的意思吗?同样 AFAIK 在 bash 中没有嵌套关联数组之类的东西。
【解决方案2】:

declare -A 是多余的

好的先生,declare -A 不是多余的。

$ foo=([a]="1" [b]="2")

$ echo ${foo[a]}
2

$ declare -A bar=([a]="1" [b]="2")

$ echo ${bar[a]}
1

【讨论】:

  • 史蒂文,抱歉,您完全忽略了问题上下文的重点。我正在调试自己的代码,所以我已经知道foo 是一个关联数组。因此,declare -A 在调试输出中 的出现是完全多余的,只会使输出混乱。所以是的,我可以抛出“基本”信息,并且我已经说过我更喜欢“原生”解决方案而不是字符串操作。也就是说,看起来字符串操作可能是唯一的方法:(
猜你喜欢
  • 2017-05-29
  • 2010-12-01
  • 1970-01-01
  • 2018-04-07
  • 2014-10-26
  • 2012-11-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多