我有几个字符串,我想随机地为其中一个字符串设置一个变量。假设字符串是test001
、test002
、test003
和test004
。
如果我像平常一样设置它,我显然会这样做:
test=test001
但我希望它从我拥有的字符串中随机选择一个。我知道我可以做这样的事情,我之前已经做过,但那是在从目录中选择随机文件时:
test="$(printf "%s\n" "${teststrings[RANDOM % ${#teststrings[@]}]}")"
但在这种情况下我不知道如何设置testrings
。
答案1
将字符串存储在数组中。
使用jot(1)
随机选择一个数组索引。
打印该随机索引处的数组元素。
考虑这个脚本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"
输出:
$ . 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'
答案2
array=(test001 test002 test003 test004) ;
rand_var="${array[RANDOM%${#array[@]}]}";
答案3
你仍然可以做类似的事情:
v=$(printf "test%03d" $(($RANDOM%4+1)))
v=${!v}
其中 bash${!variable}
对实际变量进行一级间接寻址test001
等。
当变量的名称可以是任何名称时,例如 test001 somevar anothervar,设置一个数组:
declare -a teststrings=(test001 somevar anothervar)
v=${teststrings[$(($RANDOM % ${#teststrings[*]}))]}
w=${!v}
echo $w