这是我的尝试:
rand_var() {
printf "%s\n" "${${!1}[RANDOM % ${#${!1}[@]}]}"
}
我这样运行
array=("something" "somethingelse" "test")
rand_var array
然而,它告诉我bad substitution
。我认为这可能与变量和引用有关,但我无法弄清楚,我使用它,${!1}
以便它实际上使用变量的内容,而不仅仅是array
.当我指定变量名而不是 时,这条线之前已经起作用了${!1}
。
答案1
您可以通过将数组复制到局部变量中,然后从该数组中进行选择来执行您想要的操作:
rand_var() {
local nm="$1[@]"
local tmp=("${!nm}")
printf "%s\n" "${tmp[RANDOM % ${#tmp[@]}]}"
}
我认为你不能这样做,因为你不能间接知道数组的长度。如果您也将长度传递给函数:
rand_var_len() {
local nm="$1[$((RANDOM % $2))]"
printf "%s\n" "${!nm}"
}
rand_var_len array ${#array[@]}
那么你就可以不用任何复制就可以做到。
为了避免这两种情况,您需要使用其中之一eval
。