2011-11-17 1 views
1

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

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 из массива.

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

FILEARRAY=($(ls)) 
+0

Очень сложно понять, что вы пытаетесь выполнить здесь (и в своем предыдущем посте). Пожалуйста, отредактируйте свое сообщение, чтобы показать простой пример того, как вы хотите, чтобы это выглядело, т. Е. Шаг 1, используйте select для отображения N файлов (выглядит как .....), шаг 2 измените выбранные значения (я действительно не думаю это возможно!), Шаг 3 используйте select для отображения N + 1 -> N + 6 файлов (выглядит как .....). Шаг 4? В любом случае нам нужно увидеть только 2-3 строки вывода для каждого сегмента. Удачи. – shellter

+0

@shellter Я добавил дополнительную информацию, помогает ли это выяснить, что именно я пытаюсь сделать? – user1005415

+0

, так что вы пытаетесь добавить средство подкачки для выбора? – shellter

ответ

0

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

В любом случае позвольте мне объяснить вам несколько вещей, прежде всего select не получает переменную per se, то, что она получает, является расширенным результатом, потому что оболочка заменяет это, прежде чем команда увидит это так, если вы хочу выполнять разные 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" 

уведомления массива ломтика нотация в Баше не принимает пуск конца он принимает старт-длину.

также, и это очень важно, не EVER разобрать или повторно использовать вывод ls (см http://mywiki.wooledge.org/ParsingLs), если вы хотите, чтобы все файлы в каталоге на массиве вобще FILEARRAY=(*), и это будет безопасно храниться.

+0

не удастся, если есть файлы с именем «Prev» или «Next», возможно, мы также можем добавить чек. –

0
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 
Смежные вопросы