Bash 스크립트의 두 가지 메뉴 선택

Bash 스크립트의 두 가지 메뉴 선택

저는 Bash를 배우고 있으며 연습문제를 해결하려고 합니다.

연습은 메뉴 목록에서 이름과 성을 선택하는 것으로 구성됩니다. 그러나 이름이 목록에 없으면 수동 입력을 설정하십시오.

하지만 옵션을 선택할 때 두 번째 메뉴로 이동하는 방법을 선택하지 않고 종료 옵션을 선택하지 않기 때문에 약간 혼란스럽습니다(모든 옵션에 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$REPLY1$REPLY1$optElvis$optOption 1case$REPLY$opt

그리고 이름을 부르기에는 아직 이르다.내부에select아직 실제 이름이 있는지 확신할 수 없기 때문에 루프입니다 . 사용자가 문을 선택하면 문의 끝 casedone루프 사이의 코드가 실행됩니다.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"

기타 작은 문제 수정: 백슬래시를 올바르게 읽을 수 있도록 -rwith를 사용하고 두 번째 루프에서 선택 프롬프트를 설정하는 대신 사용했습니다.readPS4PS3

관련 정보