繁体   English   中英

Bash对关联数组的间接引用

[英]Bash indirect reference to an associative array

在这个非常简化的示例中,我需要处理数组元素的键和值:

declare -A writer
writer[H.P.]=Lovecraft
writer[Stephen]=King
writer[Clive]=Barker
writer[Jack]=Ketchum

for i in ${!writer[@]}
do
    echo "$i ${writer[$i]}"
done

fullname()
{
    pointer=$1[@]
    for i in "${!pointer}"
    do
        echo "? $i"
    done
}
fullname writer

该函数必须以与示例循环相同的格式显示输出,并且它应该接收数组名,键列表或值,但我尝试了所有这些,但均未成功。 任何建议,不胜感激。

从Bash 4.3开始, declare具有标志-n来定义引用(这与C ++中的引用大致相同)。 这个标志极大地简化了您的问题:

fullname() {
    declare -nl pointer="$1"
    for i in "${!pointer[@]}"
    do
        echo "${pointer[$i]} $i"
    done
}

如果您的哈希键中有空格或有趣的符号(与接受的答案不同),这将是安全的。

indir_keys() {
    eval "echo \${!$1[@]}"
}

indir_val() {
    eval "echo \${$1[$2]}"
}

fullname()
{
    pointer=$1
    for i in $(indir_keys $pointer)
    do  
        echo "$i $(indir_val $pointer $i)"
    done
}

给出:

Jack Ketchum
Clive Barker
Stephen King
H.P. Lovecraft

Bash参考指南

当执行Shell函数时,位置参数将被临时替换(请参见Shell Functions )。

因此,您可以这样做:

fullname()
{
    for first
    do
        echo "$first ${writer[$first]}"
    done
}
fullname "${!writer[@]}"

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM