Eu tenho algumas strings e quero definir uma variável para uma delas, aleatoriamente. Digamos que as strings sejam test001
, test002
, test003
e test004
.
Se eu definir como normal, obviamente faria assim:
test=test001
Mas quero escolher uma aleatória entre as strings que tenho. Eu sei que poderia fazer algo assim, o que já fiz anteriormente, mas foi ao escolher um arquivo aleatório em um diretório:
test="$(printf "%s\n" "${teststrings[RANDOM % ${#teststrings[@]}]}")"
Mas neste caso não tenho certeza de como configurar o testrings
.
Responder1
Armazene suas strings em um array.
Usarjot(1)
para escolher um índice de array aleatoriamente.
Imprima o elemento da matriz nesse índice aleatório.
Considere este roteiro 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"
Saída:
$ . 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'
Responder2
array=(test001 test002 test003 test004) ;
rand_var="${array[RANDOM%${#array[@]}]}";
Responder3
Você ainda pode fazer algo semelhante:
v=$(printf "test%03d" $(($RANDOM%4+1)))
v=${!v}
onde bash ${!variable}
faz um nível de indireção em relação à variável real test001
, etc.
Quando os nomes das variáveis puderem ser qualquer coisa, por exemplo, test001 somevar anothervar, configure um array:
declare -a teststrings=(test001 somevar anothervar)
v=${teststrings[$(($RANDOM % ${#teststrings[*]}))]}
w=${!v}
echo $w