Bash를 배우고 있으며 연습문제를 해결하려고 합니다.
이 연습에는 메뉴 목록에서 이름과 성을 선택하는 작업이 포함됩니다. 그러나 이름이 목록에 없으면 수동 입력이 설정됩니다.
하지만 하나의 옵션을 선택하면 "Exit" 옵션을 선택하지 않고 두 번째 메뉴로 이동하는 방법을 선택하지 않기 때문에 조금 혼란스럽습니다. (어떤 옵션에든 "Break"를 추가하려고 시도했지만 작동하지 않습니다) .
수동 입력의 경우 사용자 입력을 읽으려고 했지만 제안 사항이 표시되지 않았습니까?
이름과 성을 얻을 때 루프를 어떻게 종료합니까? 왜냐하면 둘 다 얻으면 같은 루프에 빠지기 때문입니다.
echo -e "Choose your name Exercise #2 \n"
PS3='Please enter your name from the List: '
options=("Elvis" "John" "Mark" "Manual Input" "Quit")
select opt in "${options[@]}"
do
case $opt in
"Option 1")
;;
"Option 2")
;;
"Option 3")
;;
"Option 4")
echo "Sorry your Name is not in the List Give your name"
read -e -p "Whats your name: " MANUALINPUT
;;
"Quit")
break
;;
esac
echo "Hello $opt Next Step is Select your Lastname "
done
PS4='Please enter your last name from the List: '
options2=("Smith" "Brown" "Miller" "Manual Input" "Quit")
select opt2 in "${options2[@]}"
do
case $opt2 in
"Option 1")
;;
"Option 2")
;;
"Option 3")
;;
"Option 4")
echo "Sorry your Name is not in the List Give your name"
read -e -p "Whats your name: " MANUALINPUT
;;
"Quit")
break
;;
esac
clear
echo "Welcome $opt $opt2"
done
답변1
루프는 사용자가 선택한 옵션으로 select
설정되고 사용자가 입력한 옵션으로 설정됩니다. 따라서 사용자가 첫 번째 질문에 대한 답변을 입력하면 가 되고 가 됩니다 . 언제든지 아닙니다 . 작성하는 것보다 테스트용 명령문을 작성하는 것이 더 쉽습니다 .opt
$REPLY
1
$REPLY
1
$opt
Elvis
$opt
Option 1
case
$REPLY
$opt
게다가 상대방의 이름을 부르기엔 아직 이르다.~에loop select
, 아직 실제 이름이 확실하지 않을 수 있기 때문입니다. 사용자가 명령문을 선택하면 명령문 끝 case
과 루프 끝 done
사이의 코드가 실행됩니다.select
유효하지 않은메뉴에서 선택하세요( *)
이 작업을 수행하려면 케이스 태그를 사용할 수도 있습니다).
name
및 와 같이 더 설명적인 변수 이름을 사용하는 것이 더 좋으며 family
옵션을 저장하기 위해 두 개의 별도 배열이 필요하지 않습니다. (사실 이 경우 문자를 직접 나열할 수 있으므로 배열이 필요한지 의문입니다. 끈) .
아래 코드에서는 exit
사용자 선택 시 코드가 종료 되도록 만들었습니다 Quit
( 사용자가 성공적으로 이름을 선택할 때 사용하는 루프를 break
종료함 ). select
일반적으로 모든 대화형 대화는 표준 오류 스트림에서 발생합니다.
#!/bin/bash
PS3='Please enter your name from the list: '
options=("Elvis" "John" "Mark" "Manual input" "Quit")
select name in "${options[@]}"; do
case $REPLY in
1|2|3)
break # user picked name from list
;;
4)
echo 'Sorry your name is not in the list' >&2
read -e -r -p "What's your name: " name
break
;;
5)
echo 'Bye!' >&2
exit
;;
esac
echo 'Try again!' >&2
done
printf 'Hello %s, now select your family name\n' "$name" >&2
PS3='Please enter your family name from the list: '
options=("Smith" "Brown" "Miller" "Manual input" "Quit")
select family in "${options[@]}"; do
case $REPLY in
1|2|3)
break # user picked name from list
;;
4)
echo 'Sorry your family is not in the list' >&2
read -e -r -p "What's your family: " family
;;
5)
echo 'Bye!' >&2
exit
;;
esac
echo 'Try again!' >&2
done
printf 'Welcome, %s %s!\n' "$name" "$family"
-r
기타 사소한 수정: with 를 사용하고 read
두 번째 루프에서 선택 프롬프트를 설정하는 PS4
대신 을 사용하여 백슬래시를 올바르게 읽을 수 있습니다 .PS3