複数のランダムな文字列から選択して変数に設定しますか?

複数のランダムな文字列から選択して変数に設定しますか?

複数の文字列があり、そのうちの1つに変数をランダムに設定したいと思います。文字列が、test001と仮定さtest002れます。test003test004

正常に設定した場合は、明らかに次のようにします。

test=test001

しかし、私は私が持っている文字列の中からランダムに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


変数名が test001 somevar anothervar のようなものであれば、配列を設定します。

declare -a teststrings=(test001 somevar anothervar)
v=${teststrings[$(($RANDOM % ${#teststrings[*]}))]}
w=${!v}
echo $w

関連情報