いくつかの文字列があり、そのうちの 1 つをランダムに変数に設定したいと考えています。文字列がtest001
、test002
、test003
であるとしますtest004
。
通常通りに設定すると、明らかに次のようにします。
test=test001
しかし、私は持っている for 文字列からランダムに 1 つ選択するようにしたいのです。以前もやったことがあるのですが、これはディレクトリからランダムにファイルを選択するときのことでした。
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
などに対して 1 レベルの間接参照を実行します。
変数名が test001 somevar anothervar のように何でも良い場合は、配列を設定します。
declare -a teststrings=(test001 somevar anothervar)
v=${teststrings[$(($RANDOM % ${#teststrings[*]}))]}
w=${!v}
echo $w