Перезапуск цикла Select с новыми переменными в bash - PullRequest
1 голос
/ 17 ноября 2011

Я пытаюсь перезапустить цикл выбора после того, как я изменяю переменные внутри него, в настоящее время он увеличивает все, но не перезапускает цикл выбора.Вот мой код:

select listfile in "${FILEARRAY[@]:$START:$FINISH}" Next
do
    if [[ $listfile == "Next" ]];then
        echo "Check point 1 $START and $FINISH"
        if [[ ${#FILEARRAY[@]} > $FINISH ]];then
            START=$(($START + 23))
            FINISH=$(($FINISH + 23))
            echo "Check point 2 $START and $FINISH"
        elif [[ ${#FILEARRAY[@]} < $FINISH || ${#FILEARRAY[@]} == $FINISH ]];then
            echo "No more files"
            exit
        fi
    else
        FILE=$listfile
        break
    fi
done    

Я отредактировал в контрольных точках 1 и 2, контрольная точка 1 дает мне 0 и 23 (как и должно быть), а контрольная точка 2 дает мне 23 и 46 (также как и должно быть)).После того, как он увеличивается, я хочу, чтобы он перезапустил выделение, но используя позиции от 23 до 46 из массива.

Редактировать 2: Массив просто содержит имена файлов:

FILEARRAY=( $(ls) )

Ответы [ 2 ]

0 голосов
/ 12 февраля 2012
   STEP=23
   START=0
   FINISH=$STEP
   FILEARRAY=( $(ls) )


   function slct {
       START=$1
       STEP=$2
       FINISH=$3


       select listfile in "${FILEARRAY[@]:$START:$STEP}" Next
       do
           if [[ $listfile == "Next" ]];then
               echo "Check point 1 $START and $FINISH"
               if [[ ${#FILEARRAY[@]} -gt $FINISH ]];then
               echo ${#FILEARRAY[@]}   FA
               echo $FINISH FIN
                   START=$((START + STEP))
                   FINISH=$((FINISH + STEP))
                   slct $START $STEP $FINISH
                   break;
               echo "Check point 2 $START and $FINISH"

               elif [[ ${#FILEARRAY[@]} < $FINISH || ${#FILEARRAY[@]} == $FINISH ]];then
                   echo "No more files"
                   exit
               fi
           else
               FILE=$listfile
               echo SELECTED $listfile
               break
           fi
       done
   }

   slct 0 $STEP $STEP
0 голосов
/ 19 декабря 2011

Я тоже не понял вопроса, но, согласно вашим комментариям, я "думаю", что знаю, что вы пытаетесь сделать, но до сих пор понятия не имею, ПОЧЕМУ вы это сделаете.

в любом случае позвольте мне объяснить вам несколько вещей, во-первых, 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=(*) и это будет безопасно храниться.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...