再帰を避ける

再帰を避ける
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ありません。その後、内部で関数を呼び出すことは何ですか?

コーディングレベルに応じて、一度に1つまたは2つのコマンドのみを追加してから、新しいバージョンのスクリプトを実行する必要があります。構文の問題を簡単に把握するためのものです。

再帰を避ける

とにかく機能は必要ありません。

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

おすすめ記事