Я тоже не понял вопроса, но, согласно вашим комментариям, я "думаю", что знаю, что вы пытаетесь сделать, но до сих пор понятия не имею, ПОЧЕМУ вы это сделаете.
в любом случае позвольте мне объяснить вам несколько вещей, во-первых, select
не получает переменную как таковую, а получает расширенный результат, потому что оболочка заменяет его до того, как команда его видит, если Вы хотите выполнить разные select
для каждого среза, который нужно зациклить снаружи и каждый раз повторно запускать оператор выбора с новыми аргументами.
Я бы сделал что-то вроде этого:
#!/bin/bash
pagesize=23
filearray=(*)
start=0
while true; do
pagefiles=("${filearray[@]:$start:$pagesize}")
((start > 0)) && pagefiles=(Prev "${pagefiles[@]}")
((start+pagesize < ${#filearray[@]})) && pagefiles=("${pagefiles[@]}" Next)
select listfile in "${pagefiles[@]}"; do
case $listfile in
Prev)
start=$((start-pagesize));;
Next)
start=$((start+pagesize));;
*)
filename=$listfile
esac
break
done
[[ $filename ]] && break
done
echo "$filename"
обратите внимание, что нотация фрагмента массива в bash не принимает начало-конец, она занимает начальную длину.
также, и это ОЧЕНЬ важно, НИКОГДА не анализируйте и не используйте повторно вывод ls
(см. http://mywiki.wooledge.org/ParsingLs), если вы хотите, чтобы все файлы в каталоге в массиве просто делали FILEARRAY=(*)
и это будет безопасно храниться.