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

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

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$REPLY1$REPLY1$optElvis$optOption 1case$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

관련 정보