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

时间:2018-09-24 14:56:32

标签: linux bash scripting

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

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]}:替代错误。如何将数组名称传递给此函数?

1 个答案:

答案 0 :(得分:2)

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

使用最新的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