¿Elegir una cadena aleatoria entre algunas y establecerla como variable?

¿Elegir una cadena aleatoria entre algunas y establecerla como variable?

Tengo algunas cadenas y quiero establecer una variable para una de ellas, de forma aleatoria. Digamos que las cadenas son test001, y .test002test003test004

Si lo configuro como normal, obviamente lo haría así:

test=test001

Pero quiero que elija una aleatoria de las cadenas que tengo. Sé que podría hacer algo como esto, que ya hice anteriormente, pero eso fue al elegir un archivo aleatorio de un directorio:

test="$(printf "%s\n" "${teststrings[RANDOM % ${#teststrings[@]}]}")"

Pero en este caso no estoy seguro de cómo configurarlo testrings.

Respuesta1

Guarde sus cadenas en una matriz.

Usarjot(1)para elegir un índice de matriz al azar.

Imprima el elemento de la matriz en ese índice aleatorio.

Considere este guión foo.sh:

# initialize array a with a few strings
a=("test1" "test2" "test3" "test4" "test5" "test6")

# get the highest index of a (the number of elements minus one)
Na=$((${#a[@]}-1))

# choose:  
#    jot -r 1         1 entry, chosen at random from between
#             0       0 and ...
#               $Na     ... the highest index of a (inclusive)
randomnum=$(jot -r 1 0 $Na)

# index the array based on randomnum:
randomchoice="${a[$randomnum]}"

# display the result:
printf "randomnum is %d\na[randomnum] is '%s'\n" \
    $randomnum "$randomchoice"

Producción:

$ . foo.sh
randomnum is 3
a[randomnum] is 'test4'
$ . foo.sh
randomnum is 0
a[randomnum] is 'test1'
$ . foo.sh
randomnum is 4
a[randomnum] is 'test5'
$ . foo.sh
randomnum is 1
a[randomnum] is 'test2'

Respuesta2

array=(test001 test002 test003 test004) ;
rand_var="${array[RANDOM%${#array[@]}]}";

Respuesta3

Todavía puedes hacer algo similar:

v=$(printf "test%03d" $(($RANDOM%4+1)))
v=${!v}

donde bash ${!variable}hace un nivel de direccionamiento indirecto hacia la variable real test001, etc.


Cuando los nombres de las variables pueden ser cualquier cosa, por ejemplo, test001 somevar anothervar, configure una matriz:

declare -a teststrings=(test001 somevar anothervar)
v=${teststrings[$(($RANDOM % ${#teststrings[*]}))]}
w=${!v}
echo $w

información relacionada