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

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 "*********************" 

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

댓글

  • 입력 한 내용은 1, 2 또는 3입니다.

답변

선택으로 표시되는 메뉴는 다음과 같습니다.

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

이때 ” 1 “또는”2 “또는”3 “: 단어를 입력하지 않습니다.

또한 selectbreak 명령이므로 다음을 원합니다.

 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 명령에는 case가 아닌 break가 필요합니다.
  • 감사합니다! 나는 그것이 숫자 옵션이라는 것을 몰랐습니다. Duhh!
  • Hah, 저도 C로 프로그래밍하고 있습니다. 모든 섹션에 break가 필요합니다. 그러나 shell 스크립트 case … esac 블록에는 break가 필요하지 않습니다. 그것들이 섞이는 일은 너무나 쉽게 일어날 수 있습니다. 🙂
  • @syntaxerror, 당신 ' 맞습니다. ' iv id = “가 필요하지 않습니다. case의 경우 eefe9e6ecf “>

. 하지만 select 루프를 이스케이프하려면 break가 필요합니다.

  • @glenn jackman 이것을 갖고 싶습니다. 더 유용한 댓글로 바뀌 었습니다 (다음 참조). 따라서 12:55에서 댓글 삭제에 동의했다면 좋을 것입니다. 물론 저도 마찬가지입니다.
  • 답변

    $opt 변수는 사용자가 입력 한 숫자 에 해당하는 옵션 단어로 설정됩니다. 사용자가 실제로 입력 한 내용을 보려면 $REPLY를 확인하세요.

    댓글

    • case$opt를 " apache ", " 이름이 " 및 " sendmail ", 정확하며 변경할 필요가 없습니다.
    • @manatwork, OP가 사용자가 "라는 단어를 입력하기를 원하지 않는 경우 Apache ", " 이름이 " 또는 " sendmail "
    • 흥미 롭습니다. $ REPLY는 1 / 2 / 3를 보유하고 $ opt는 apache / named / sendmail
    • @fred, 예, $REPLY는 사용자가 입력 한 내용이며 유효한 숫자이면 $opt가 해당 숫자에 해당하는 단어가됩니다.

    답글 남기기

    이메일 주소를 발행하지 않을 것입니다. 필수 항목은 *(으)로 표시합니다