如何使用参数作为脚本的内部数组名称?

如何使用参数作为脚本的内部数组名称?

当我编写名为 array_call_self.sh 的脚本时,如下所示

#!/bin/bash
declare -A num word
word=(
 [a]='index_a'
 [b]='index_b'
 [c]='index_c'
)
num=(
 [a]=1
 [b]=2
 [c]=3
)
array=${$1[@]}
for i in ${$array[@]};do
  echo $i
done

当我运行bash array_call_self.sh word 它时返回我

test.sh: line 13: ${$1[@]}: bad substitution
test.sh: line 14: ${$array[@]}: bad substitution

答案1

看起来您可能想要使用名称引用变量(在bash版本 4.3 或更高版本中提供):

#!/bin/bash

declare -A num word

word=(
 [a]='index_a'
 [b]='index_b'
 [c]='index_c'
)

num=(
 [a]=1
 [b]=2
 [c]=3
)

declare -n var="$1"

printf '%s\n' "${var[@]}"

这将变量声明var为名称引用变量,引用脚本的第一个参数命名的变量。如果第一个参数不是变量的有效名称,或者它是 name var,那么您将收到错误。

声明var并分配变量名称后,访问 的值var就像通常访问指定变量的值一样。

请注意,提供变量名在脚本的命令行上是非常不可用的,您可能希望隐藏此类实现细节并将有效参数限制在有限的列表中,可能通过进行适当的命令行解析。上面的代码允许脚本用户输出脚本的任何变量

将值限制在有限列表中的一种简单方法:

case $1 in
        (word|num) ;; # ok
        (*)
                echo 'error' >&2
                exit 1
esac

declare -n var="$1"

相关内容