Tengo algunas cadenas y quiero establecer una variable para una de ellas, de forma aleatoria. Digamos que las cadenas son test001
, y .test002
test003
test004
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