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 “: 단어를 입력하지 않습니다.
또한 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
명령에는case
가 아닌break
가 필요합니다. - 감사합니다! 나는 그것이 숫자 옵션이라는 것을 몰랐습니다. Duhh!
- Hah, 저도 C로 프로그래밍하고 있습니다. 모든 섹션에
break
가 필요합니다. 그러나 shell 스크립트 의 case … esac 블록에는break
가 필요하지 않습니다. 그것들이 섞이는 일은 너무나 쉽게 일어날 수 있습니다. 🙂 - @syntaxerror, 당신 ' 맞습니다. ' iv id = “가 필요하지 않습니다.
case
의 경우 eefe9e6ecf “>
. 하지만 select
루프를 이스케이프하려면 break
가 필요합니다.
답변
$opt
변수는 사용자가 입력 한 숫자 에 해당하는 옵션 단어로 설정됩니다. 사용자가 실제로 입력 한 내용을 보려면 $REPLY
를 확인하세요.
댓글
-
case
가$opt
를 " apache ", " 이름이 " 및 " sendmail ", 정확하며 변경할 필요가 없습니다. - @manatwork, OP가 사용자가 "라는 단어를 입력하기를 원하지 않는 경우 Apache ", " 이름이 " 또는 " sendmail "
- 흥미 롭습니다. $ REPLY는
1
/2
/3
를 보유하고 $ opt는apache
/named
/sendmail
- @fred, 예,
$REPLY
는 사용자가 입력 한 내용이며 유효한 숫자이면$opt
가 해당 숫자에 해당하는 단어가됩니다.