繁体   English   中英

将数组名称传递给bash中的函数

[英]Passing an array name to a function in bash

我有一个脚本,其中包含几个数组。 我不想重复计算数组大小,所以我尝试创建一个为我做的函数。 我正在向函数传递我想要其大小的数组的名称。 它遍历该函数,直到找到一个空白空间,然后返回计数。 这是我的功能:

array_size ()
{
    # Calculate the size of your array
    count=0
    while [ ${$1[$count]} != "" ]
    do
         count=$(( $count + 1 ))
    done

    #Subtracts 1 from count to reset array position
    count=$(( $count - 1 ))

    return $count

}

调用此错误消息:$ {$ 1 [$ count]}:替代错误。 如何将数组名称传递给此函数?

(请注意,在这些示例中,我尚未实现您的计数逻辑。)

使用最新的bash(我认为从4.3版本开始),您可以使用nameref:

$ declare -a main
$ main[4]=a main[6]=b main[11]=c
$ declare -p main
declare -a main='([4]="a" [6]="b" [11]="c")'
$ aryfunc () { 
    local -n ary=$1
    for key in "${!ary[@]}"; do
        printf "%d => %s\n" "$key" "${ary[$key]}"
    done
}
$ aryfunc main
4 => a
6 => b
11 => c

否则,您可以使用间接变量,但是会丢失索引:

$ aryfunc2() {
    local tmp="${1}[@]"
    local -a localary=( "${!tmp}" )
    for key in "${!localary[@]}"; do
        printf "%d => %s\n" "$key" "${localary[$key]}"
    done
}
$ aryfunc2 main
0 => a
1 => b
2 => c

或者,如果您想获得实际的收益,请传递数组的定义

$ aryfunc3() {
    local declaration="$1"
    eval local -a localary="${declaration#*=}"
    for key in "${!localary[@]}"; do
         printf "%d => %s\n" "$key" "${localary[$key]}"
    done
}
$ aryfunc3 "$(declare -p main)"
4 => a
6 => b
11 => c

暂无
暂无

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

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