Arrays 解释本地-a';xkeys=(“${!”、“$1”&“x27[@]}”)和“x27”;

Arrays 解释本地-a';xkeys=(“${!”、“$1”&“x27[@]}”)和“x27”;,arrays,bash,indirection,Arrays,Bash,Indirection,这段代码是作为数组间接寻址的解决方法给出的,例如间接获取数组长度和索引 这里面也提到了 我想特别了解local-a'xkeys=(“${!”“$1”[@]}”)工作的原因。这里发生了什么。我知道等号右边有三个不同的字符串: 'xkeys=(“${!” “$1” “[@]}”)” 为什么会这样 代码如下: isSubset() { local -a 'xkeys=("${!'"$1"'[@]}")' 'ykeys=("${!'"$2"'[@]}")' set -- "${@/%/[key]}"

这段代码是作为数组间接寻址的解决方法给出的,例如间接获取数组长度和索引

这里面也提到了

我想特别了解
local-a'xkeys=(“${!”“$1”[@]}”)
工作的原因。这里发生了什么。我知道等号右边有三个不同的字符串:

  • 'xkeys=(“${!”
  • “$1”
  • “[@]}”)”
  • 为什么会这样

    代码如下:

    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
    }
    
    isSubset(){
    local-a'xkeys=(“${!”“$1”[@]}”)'ykeys=(“${!”“$2”[@]}”)'
    设置--“${@/%/[key]}”
    
    ((${xkeys[@]}
    ${!“$1”}
    获取
    $1
    ${variable[@]}
    中命名的变量,并将其扩展到数组
    variable
    中的所有元素。因此,这基本上将
    $1
    命名的数组复制到
    xkeys

    isSubset
    的其余部分进行解释时,我犯了同样的错误)

    这里的关键细节是
    local
    (和
    declare
    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

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


    但是因为这是
    local
    ,正如我之前所说,它自己进行解析(事实上你知道它已经做了,因为如果不是这样,
    a
    赋值中的
    {0..5}
    扩展就不起作用了。试试
    echo{0..5}vs.“{0..5}”
    看看我的意思)单引号字符串由
    local
    重新计算,数组索引展开。因此
    ${!a[@]}
    展开为
    a
    ${!b[@]}的索引
    扩展到
    b
    的索引

    我知道这就是它的本意。我想问题是为什么它以这种特定的方式工作,而不是当我把它作为一个字符串(即删除单引号)时。有关更多内容,您可以查看我的一些探索。
    不是作为
    $1
    扩展的一部分被吞没的,它是数组索引扩展(与数组值扩展相反)。在这个位置上,
    的重载性质是复杂和令人困惑的。我刚才解释了
    isSubset
    的一系列操作,虽然没有具体说明这一点。