
선택 루프를 사용하여 배열 요소를 옵션으로 렌더링하면 모든 요소가 한 번에 표시됩니다. 사용자에게 한 번에 25가지 옵션을 제공할 수 있는 방법이 있나요?
답변1
저는 이전에 bash 배열로 작업한 적이 없으므로 select
한 번에 25개 항목을 반복하는 v0.1 메뉴가 있습니다. 한 번에 항목 수는 다음과 같이 설정됩니다.얼마나.처음으로 루프백하려면 논리를 추가해야 합니다.또한 메뉴 선택에 흥미로운 작업을 수행하지 않습니다. 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:~$