2

此代码在bash-hackers.org wiki 页面上作为数组间接的解决方法给出,作为间接获取数组长度和索引的示例。

这个Stackoverflow 问题中也提到了这一点。

我想具体了解为什么local -a 'xkeys=("${!'"$1"'[@]}")'有效。这里发生了什么。我知道等号右侧有三个不同的字符串:

  1. 'xkeys=("${!'
  2. “1美元”
  3. '[@]}")'

为什么这行得通?

这是代码:

isSubset() {
local -a 'xkeys=("${!'"$1"'[@]}")' 'ykeys=("${!'"$2"'[@]}")'
set -- "${@/%/[key]}"

(( ${#xkeys[@]} <= ${#ykeys[@]} )) || return 1

local key
for key in "${xkeys[@]}"; do
    [[ ${!2+_} && ${!1} == ${!2} ]] || return 1
done
}

谢谢

4

2 回答 2

1

${!"$1"}获取名为 in 的变量$1${variable[@]}扩展到数组中的所有元素variable。所以这基本上将名为的数组复制$1xkeys.

于 2014-06-04T04:15:41.387 回答
1

@tripleee 基本上是正确的,尽管遗漏了一个细节(几分钟前我在此处写下我对其余部分的解释时犯了同样的isSubset错误

这里的关键细节是local(and declareand typeset)自己解析他们的论点。

让我们来看看这条线的各种扩展

local -a 'xkeys=("${!'"$1"'[@]}")' 'ykeys=("${!'"$2"'[@]}")'

现在拆分引用的部分将有助于理解。这让我们

local -a 'xkeys=("${!' "$1" '[@]}")' 'ykeys=("${!' "$2" '[@]}")'

扩展到

local -a 'xkeys=("${!' "a" '[@]}")' 'ykeys=("${!' "b" '[@]}")'

哪个重新组装成

local -a 'xkeys=("${!'"a"'[@]}")' 'ykeys=("${!'"a"'[@]}")'

结合相邻的引用词得到我们

local -a 'xkeys=("${!a[@]}")' 'ykeys=("${!a[@]}")'

如果这是任何事情,但local我们会在这一点上完成(eval也可以)。

例如echoe() { echo 'xkeys=("${!'"$1"'[@]}")' 'ykeys=("${!'"$2"'[@]}")'; }; e a b输出xkeys=("${!a[@]}") ykeys=("${!b[@]}")

但是local,正如我之前所说,因为这是它自己的解析(事实上你知道它已经这样做了,因为否则{0..5}赋值中的扩展a将不起作用。试着echo {0..5} vs. "{0..5}"看看我的意思)单引号字符串重新评估local并发生数组索引扩展。因此${!a[@]}扩展到 的索引a${!b[@]}扩展到 的索引b

于 2014-10-22T02:26:00.127 回答