Ich habe einige Zeichenfolgen und möchte einer davon zufällig eine Variable zuweisen. Angenommen, die Zeichenfolgen sind test001
, test002
, test003
und test004
.
Wenn ich es wie gewohnt einstelle, würde ich es natürlich so machen:
test=test001
Ich möchte aber, dass eine zufällige Datei aus den vorhandenen Zeichenfolgen ausgewählt wird. Ich weiß, dass ich so etwas machen könnte, was ich schon einmal gemacht habe, aber das war bei der Auswahl einer zufälligen Datei aus einem Verzeichnis:
test="$(printf "%s\n" "${teststrings[RANDOM % ${#teststrings[@]}]}")"
In diesem Fall bin ich mir jedoch nicht sicher, wie ich es einstellen soll testrings
.
Antwort1
Speichern Sie Ihre Zeichenfolgen in einem Array.
Verwendenjot(1)
um einen Array-Index nach dem Zufallsprinzip auszuwählen.
Drucken Sie das Array-Element an diesem zufälligen Index.
Betrachten Sie dieses Skript 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"
Ausgabe:
$ . 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'
Antwort2
array=(test001 test002 test003 test004) ;
rand_var="${array[RANDOM%${#array[@]}]}";
Antwort3
Sie können immer noch etwas Ähnliches tun:
v=$(printf "test%03d" $(($RANDOM%4+1)))
v=${!v}
wo Bash ${!variable}
eine Indirektionsebene zur realen Variable test001
usw. durchführt.
Wenn die Namen der Variablen beliebig sein können, z. B. test001 somevar anothervar, richten Sie ein Array ein:
declare -a teststrings=(test001 somevar anothervar)
v=${teststrings[$(($RANDOM % ${#teststrings[*]}))]}
w=${!v}
echo $w