Выбрать случайную строку из нескольких и установить ее как переменную?

Выбрать случайную строку из нескольких и установить ее как переменную?

У меня есть несколько строк, и я хочу установить переменную для одной из них, случайным образом. Допустим, строки 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

Связанный контент