




Для этого вы можете использовать $СЛУЧАЙНО.
Примечания:
${#array[@]} дает размер массива$((min + RANDOM % max)) дает вам случайное целое число, тогда как max не включено.index_number вот так ${array[index_number]}# define array
a=()
while read line
do
# read the file list line by line and add to the array
a+=("$line")
done < <(find ./files -name '*-*.txt')
random_index=$((0 + RANDOM % ${#a[@]}))
echo ${a[$random_index]}
a=$(find ...) создает простую строковую переменную, а не массив. Чтобы сохранить список файлов в виде массива, используйте readarray -d '' -t a < <(find ./ -name "*-*.txt" -print0).
По умолчанию shuf принимает один аргумент имени файла и перемешивает содержимое этого файла. Вместо этого вы хотите, чтобы он перетасовал свои аргументы; для этого используйте shuf -e:
b=$(shuf -e -n1 $a)
Кстати, здесь есть более тонкая проблема: имена файлов путаются с пробелами и/или подстановочными знаками. Возможно, это не произойдет в вашей среде, но я предпочитаю использовать идиомы сценариев, которые не падают из-за забавных имен файлов. Чтобы защититься от этого, храните имена файлов в массиве, а не рассчитывайте на разбиение слов, чтобы сказать, где заканчивается один и начинается следующий:
readarray -d '' -t arr < <(find ./ -name "*-*.txt" -print0)
b=$(shuf -en1 "${arr[@]}")
Если вам не нужно хранить список файлов, все еще проще:
b=$(find ./ -name "*-*.txt" -print0 | shuf -zn1 | tr -d '\0')
Я взял random_index=$((0 + RANDOM% ${#a[@]})), а затем эхо $random_index всегда возвращает 0