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