從幾個隨機字串中選擇並將其設定為變數?

從幾個隨機字串中選擇並將其設定為變數?

我有幾個字串,我想隨機地為其中一個字串設定一個變數。假設字串是test001test002test003test004

如果我像平常一樣設置它,我顯然會這樣做:

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

相關內容