재귀를 피하다

재귀를 피하다
dountil() {

    #Prompt user below to guess randomly-generated number between 1 and 10
    
    (( answer = $RANDOM % 1-10 ))
    
    until [[ $guess -eq answer ]]
     do
     read -p "Enter a number between 1 and 10:" guess
     if [[ $guess -ne answer ]]; then
     echo "Incorrect. Try again"
     elif [[ $guess -eq answer ]]; then
     echo "Correct! Want to play again?"
     read -p prompt
     if [[ $prompt = yes ]]
     dountil
     if [[ $prompt = no ]]
     then
     echo "Goodbye."
    fi
    };

지난 며칠 동안 이 문제를 해결하려고 노력했지만 거의 매번 벽에 부딪혔습니다. 몇 가지 버그를 수정했지만 새로운 버그가 나타납니다. 지금처럼, 나는 얻는다

예상치 못한 표시 '}' 근처에 구문 오류가 있습니다.

어떤 도움이라도 대단히 감사하겠습니다!

답변1

항상 올바른 들여쓰기로 코드를 작성하세요. 문제는 뻔한데...

dountil () {
    (( answer = $RANDOM % 1-10 ))
    until [[ $guess -eq answer ]]
    do
         read -p "Enter a number between 1 and 10:" guess
         if [[ $guess -ne answer ]]; then
             echo "Incorrect. Try again"
         elif [[ $guess -eq answer ]]; then
             echo "Correct! Want to play again?"
             read -p prompt
             if [[ $prompt = yes ]]
                 dountil
                 if [[ $prompt = no ]]
                 then
                     echo "Goodbye."
                 fi
}

적어도 2개 then, 2개 fi, 1개가 done누락되었습니다. 그런 다음 내부에서 다시 함수를 호출하는 것은 무엇입니까?

코딩 수준에 따라 실제로 한 번에 하나 또는 두 개의 명령만 추가한 다음 새 버전의 스크립트를 실행해야 합니다. 구문 문제를 쉽게 파악하기 위한 것입니다.

재귀를 피하다

어차피 기능은 필요없어

while true; do
    # ...
    if [[ $prompt != yes ]]; then
        break
    fi
done

함수를 루프로 만들기

dountil () {
    while true; do
        # ...
        if [[ $prompt != yes ]]; then
            break
        fi
    done
}

핵심 코드만 함수에 넣기

guess_number () {
    (( answer = $RANDOM % 1-10 ))
    read -p "Enter a number between 1 and 10: " guess
    if [[ $guess -ne answer ]]; then
        echo "Incorrect."
    else
        echo "Correct."
    fi
}

while true; do
    guess_number
    # ...
    if [[ $prompt != yes ]]; then
        break
    fi
done

관련 정보