配列から任意の変数を選択するには、この関数をどのように作成しますか?

配列から任意の変数を選択するには、この関数をどのように作成しますか?

私の試みは次のとおりです。

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

関連情報