当我编写名为 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"