我有一个脚本,其中包含几个数组。我不想重复计算数组大小,所以我尝试创建一个为我做的函数。我正在向函数传递我想要其大小的数组的名称。它遍历该函数,直到找到一个空白空间,然后返回计数。这是我的功能:
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]}:替代错误。如何将数组名称传递给此函数?
答案 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