Bash 脚本:如何限制选择循环中的选项数量?

Bash 脚本:如何限制选择循环中的选项数量?

当您使用 select 循环将数组的元素呈现为选项时,它将一次性显示所有元素。有没有办法一次向用户呈现 25 个选项?

答案1

我以前从未使用过select,也从未使用过 bash 数组,所以这里是 v0.1 的菜单,一次循环显示 25 个项目。一次的项目数设置为多少您需要添加循环回到开头的逻辑。它也不会对您的菜单选择做任何有趣的事情。您可能想break知道用户何时选择实际的菜单项。

有趣的部分是根据开始和结束索引重新填充 CURRNUMS 数组,并在循环中包含额外的“下一个”项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

这是示例输出:

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

答案2

我建议您创建一个 bash 函数,该函数采用要在数组中显示的内容的起始元素和结束元素,稍后对其自身进行递归调用。数组的部分内容可以通过 bash 的参数扩展特性来显示 ( ${VARIABLE:start:off-set})

示例脚本

#!/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

演示

./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:~$ 

相关内容