我将如何创建这个函数来从数组中选择随机变量?

我将如何创建这个函数来从数组中选择随机变量?

这是我的尝试:

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

相关内容