메뉴 목록에 공백이나 탭을 포함하는 방법은 무엇입니까?
PS3='Please enter your choice: '
options=("Option 1" "Option 2" "Quit")
select opt in "${options[@]}"
do
case $opt in
"Option 1")
echo "Your choise is 1"
;;
"Option 2")
echo "Your choise is 2"
;;
"Quit")
break
;;
*) echo "Invalid option;;
esac
done
알 겠어:
[user@Server:/home/user] ./test.sh
1) Option 1
2) Option 2
3) Option 3
4) Quit
Please enter your choice:
하지만 나는 다음과 같은 것을 원합니다 :
[user@Server:/home/user] ./test.sh
1) Option 1
2) Option 2
3) Option 3
4) Quit
Please enter your choice:
아이디어가 있나요?
답변1
select
적어도 다중 열 목록이 필요한 옵션이 너무 많지 않은 한 수동으로 (대략) 디스플레이를 다시 구현하고 미세 조정하는 것은 그리 어렵지 않습니다 .
#!/bin/bash
# print the prompt from $1, and a menu of the other arguments
choose() {
local prompt=$1
shift
local i=0
for opt in "$@"; do
# we have to do the numbering manually...
printf " %2d) %s\n" "$((i += 1))" "$opt"
done
read -p "$prompt: "
}
options=("Foo" "Bar" "Quit")
while choose 'Please enter your choice' "${options[@]}"; do
case $REPLY in
1) echo "you chose 'foo'" ;;
2) echo "you chose 'bar'";;
3) echo 'you chose to quit'; break;;
*) echo 'invalid choice';;
esac
done
물론 이것은 배열 키(인덱스)를 고려하여 카운터를 실행하는 대신 메뉴의 옵션으로 렌더링하도록 확장될 수 있습니다.
답변2
select
bash
메뉴를 표시하는 문에서는 메뉴에 대한 들여쓰기를 지정할 수 없습니다 .
코드에 대한 설명: 선택한 문자열이 있는 변수에 대해 명령문을 적용하는 것보다 명령문을 case
실행하는 것이 더 쉬운 경우가 많습니다. $REPLY
문자열을 두 번 입력하지 않아도 됩니다.
예를 들어
select opt in "${options[@]}"
do
case $REPLY in
1)
echo "Your choice is 1"
;;
2)
echo "Your choice is 2"
;;
3)
break
;;
*) echo 'Invalid option' >&2
esac
done
또는 이 구체적인 예에서는
select opt in "${options[@]}"
do
case $REPLY in
[1-2])
printf 'Your choice is %s\n' "$REPLY"
;;
3)
break
;;
*) echo 'Invalid option' >&2
esac
done