Bash Scripting: Como limitar a quantidade de opções em um loop de seleção?

3

Quando você usa o loop de seleção para apresentar os elementos de uma matriz como uma opção, ela exibirá tudo de uma vez. Existe uma maneira de apresentar as opções para o usuário por 25 opções de cada vez?

    
por ushaldi 13.11.2015 / 02:48

2 respostas

0

Eu nunca usei select antes, e também nunca usei bash arrays antes, portanto, aqui está a v0.1 de um menu que percorre 25 itens por vez. O número de itens por vez é configurado como howmany . Você precisaria adicionar lógica para voltar ao início. Também não faz nada de interessante com sua seleção de menu. Você pode querer break out quando o usuário escolhe um item de menu real.

As partes interessantes estão preenchendo o array CURRNUMS com base nos índices inicial e final e incluindo um item extra "próximo" no loop select .

ALLNUMBERS=({30..90})
start=0
howmany=25
while :
do
  end=$((start + howmany - 1))
  CURRNUMS=
  for (( i = start; i < end ; i++ ))
  do
    cindex=$((i - start))
    CURRNUMS[$cindex]=${ALLNUMBERS[$i]}
  done
  echo Presenting a new set of menu items...
  select number in ${CURRNUMS[*]} next; do
    echo You picked $REPLY
    echo number is now: $number
    if [ $REPLY = "next" ] || [ $REPLY = $howmany ] ; then
      start=$end
      break;
    fi
  done
done

Veja o exemplo de saída:

Presenting a new set of menu items...
1) 30      5) 34     9) 38    13) 42    17) 46    21) 50    25) next
2) 31      6) 35    10) 39    14) 43    18) 47    22) 51
3) 32      7) 36    11) 40    15) 44    19) 48    23) 52
4) 33      8) 37    12) 41    16) 45    20) 49    24) 53
#? 2
You picked 2
number is now: 31
#? 25
You picked 25
number is now: next
Presenting a new set of menu items...
1) 54      5) 58     9) 62    13) 66    17) 70    21) 74    25) next
2) 55      6) 59    10) 63    14) 67    18) 71    22) 75
3) 56      7) 60    11) 64    15) 68    19) 72    23) 76
4) 57      8) 61    12) 65    16) 69    20) 73    24) 77
#? 3
You picked 3
number is now: 56
#? next
You picked next
number is now:
Presenting a new set of menu items...
1) 78      3) 80     5) 82     7) 84     9) 86    11) 88    13) 90
2) 79      4) 81     6) 83     8) 85    10) 87    12) 89    14) next
#? ^C
    
por 13.11.2015 / 17:26
0

Eu sugiro que você faça uma função bash que tome elemento inicial e elemento final do que você deseja exibir em uma matriz, que faz uma chamada recursiva para si mesmo mais tarde. Partes da matriz podem ser exibidas com as qualidades de expansão do parâmetro do bash ( ${VARIABLE:start:off-set} )

Exemplo de script

#!/bin/bash

function selectStuff
{

select item in   ${ARRAY[@]:$1:$2};
do
  echo "You selected" $item
  if [ "$item" == "25"  ];then
    selectStuff 26 50
  fi
done

}

ARRAY=($(seq 1 50))
selectStuff 0 25

Demo

./selecScript.sh
1) 1     4) 4    7) 7   10) 10  13) 13  16) 16  19) 19  22) 22  25) 25
2) 2     5) 5    8) 8   11) 11  14) 14  17) 17  20) 20  23) 23
3) 3     6) 6    9) 9   12) 12  15) 15  18) 18  21) 21  24) 24
#? 25
You selected 25
1) 27    4) 30   7) 33  10) 36  13) 39  16) 42  19) 45  22) 48
2) 28    5) 31   8) 34  11) 37  14) 40  17) 43  20) 46  23) 49
3) 29    6) 32   9) 35  12) 38  15) 41  18) 44  21) 47  24) 50

#? 1
You selected 27
#? ^C
xieerqi@eagle:~$ 
    
por 14.11.2015 / 23:19