¿Cómo crearía esta function para elegir una variable aleatoria de una matriz?

Aquí está mi bash:

rand_var() { printf "%s\n" "${${!1}[RANDOM % ${#${!1}[@]}]}" } 

Y lo manejo así

 array=("something" "somethingelse" "test") rand_var array 

Sin embargo, me dice bad substitution . Creo que puede tener algo que ver con las variables y las comillas, pero no puedo entenderlo, utilizo ${!1} para que realmente use los contenidos de la variable y no solo la array . Esta línea ha funcionado antes cuando especifico el nombre de la variable en lugar de ${!1} .

Puede hacer lo que quiera copyndo la matriz en una variable local y luego seleccionando desde esa matriz:

 rand_var() { local nm="$1[@]" local tmp=("${!nm}") printf "%s\n" "${tmp[RANDOM % ${#tmp[@]}]}" } 

No creo que puedas hacerlo de otra manera, porque no puedes indirectamente a la longitud de la matriz. Si también pasó la longitud de la function:

 rand_var_len() { local nm="$1[$((RANDOM % $2))]" printf "%s\n" "${!nm}" } rand_var_len array ${#array[@]} 

entonces podrías hacerlo sin ninguna copy.

Para evitar ambos, deberá usar uno de los estim -alikes.