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”[@]}”)
工作的原因。这里发生了什么。我知道等号右边有三个不同的字符串:
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
命名的数组复制到xkeysisSubset
的其余部分进行解释时,我犯了同样的错误)
这里的关键细节是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
的一系列操作,虽然没有具体说明这一点。