`select` 명령을 사용하여 Bash에서 메뉴 인쇄


10

select명령을 사용하여 간단한 메뉴를 구현하려고합니다 . 테스트 목적의 스크립트는 다음과 같습니다.

#!/bin/bash
echo "*******************"
PS3='Select an option and press Enter: '
options=("apache" "named" "sendmail")
select opt in "${options[@]}"
do
  case $opt in
        "apache")
          date
          ;;
        "named")
          echo "test"
          ;;
        "sendmail")
          echo "test 2"
          ;;
        *) echo "invalid option";;
  esac
done
echo "*********************"

스크립트가 내가 입력 한 유효한 입력을 인식하지 못하고 항상 "유효하지 않은 옵션"메시지를 인쇄합니다. 이 스크립트에서 무엇이 잘못 되었습니까?


4
입력 값이 1, 2 또는 3입니까?
enzotib

답변:


11

select로 표시된 메뉴는 다음과 같습니다.

1) apache
2) named
3) sendmail
Select an option and press Enter: 

이때 "1"또는 "2"또는 "3"을 입력하면 단어를 입력하지 않습니다.

또한 명령을 select볼 때까지 반복 break되므로 다음과 같이하십시오.

  case $opt in
        "apache")
          date
          break
          ;;
        "named")
          echo "test"
          break
          ;;
        "sendmail")
          echo "test 2"
          break
          ;;
        *) echo "invalid option";;
  esac

사용자가 숫자 나 단어를 입력하도록하려면 다음과 같이 쓸 수 있습니다.

select opt in "${options[@]}"; do
  case "$opt,$REPLY" in
    apache,*|*,apache)     do_something; break ;;
    named,*|*,named)       do_something; break ;;
    sendmail,*|*,sendmail) do_something; break ;;
  esac
done

쉼표는 구문 상 의미가 없으며 $ REPLY 변수 (사용자가 실제로 입력 한 것) 또는 $ opt 변수에서 패턴 일치를 할 수 있습니다.


select명령은 필요 break하지 case.
glenn jackman

감사! 나는 그것이 숫자 옵션이라는 것을 몰랐다. 응!
Sumod

아, 나도 C로 프로그램 break하고 모든 섹션에 거기 가 필요합니다 . 그러나 쉘 스크립트break 에는 case ... esac 블록이 필요하지 않습니다 . 그것들을 혼합하기가 너무 쉽게 일어날 수 있습니다. :-)
syntaxerror

1
@syntaxerror, 당신은 바로, 당신은 필요가 없습니다 것 break을 위해 case. 그러나 루프 break를 이스케이프해야 select합니다.
glenn jackman

@glenn jackman 이것이 더 유용한 의견으로 바뀌고 싶습니다 (다음 참조). 12:55에서 댓글 삭제에 동의하면 좋을 것입니다. 물론 저도 마찬가지입니다.
syntaxerror

3

귀하의 $opt변수는에 해당하는 옵션을 워드로 설정됩니다 번호를 사용자가 입력하는. 사용자가 실제로 입력 한 내용을 보려면을보십시오 $REPLY.


1
"apache", "named"및 "sendmail"과 case비교 하면 $opt정확하며 변경할 필요가 없습니다.
manatwork

OP가 사용자가 1, 2 또는 3을 누르지 않고 "apache", "named"또는 "sendmail"이라는 단어를 입력하기를 원하지 않는 한 @manatwork.
Kusalananda

흥미 롭군 $ REPLY 1/ 2/ 3및 $ opt hold apache/ named/sendmail
Peter.O.

예, @fred $REPLY는 사용자가 입력 한 것이 무엇이고, 유효한 숫자이면 $opt해당 숫자에 해당하는 단어가됩니다.
Kusalananda
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.