По умолчанию 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')