Untilループにifステートメントを入れることはできますか?

Untilループにifステートメントを入れることはできますか?

untilユーザーに繰り返し数字を求めるループを含むスクリプトを作成する必要があります。 - 50回でない場合、「間違った番号です。もう一度お試しください」というメッセージが表示されます。 - 別の番号をリクエストしてください。 - 数字が50の場合、「成功しました!」というメッセージを表示して停止します。

これが私が今まで持っているものです:

    echo -n "please choose a number: "
    read number
    until [$number -eq 50];
    do
         if [$number !=50]
         then 
               echo "Wrong number; try again" 
               read wrong 
         else 
               echo -n "Please choose a number: "
               read newnum
         fi
    done 

「番号を選択してください」ステートメントを繰り返す方法がわかりません。私はいつもエラーが発生します。

      syntax error near unexpected token 'fi' 

オンラインで探していますが、UNTILループの入出力の明確な例はありません。

答え1

echo -n "please choose a number: "

read number
until [ $number -eq 50 ]
do
     # if [ $number -ne 50 ]
     # then 
           echo "Wrong number; try again" 
           read number 
     # fi
done 

echo You got it\!

最初のread変数はから読み込まれますnumber。ループは50になるuntilまで続きます。$number

ループ内のテストは、数値が50(等しくない)untilの場合にのみ入るため、不要です。-ne

あなたが持っている主な問題は、readループ内で設定チェック()numberuntil同じ変数を更新する必要があることです。

ifスペースで囲まれた次の単語がコマンド名であるため、スペースも重要です。[$number入力したが「[」というプレフィックスが付いた項目を評価します。これは、既存のコマンドの名前ではない可能性が高いです。たとえば、最初の推測がある場合、コマンド42ifコマンドを実行しようとし、[42次のエラーが発生します。[42: not found

また、数値比較は、、、、、-eq-lt使用して行われます。-ge-gt-ge-ne

=そして=!文字列の場合。

答え2

他の回答にはプログラムに関するより一般的な提案があるので、次のような実際のエラーをお知らせします。if

if [$number !=50]

それが必要です:

if [ $number -ne 50 ]

ここで3つを変えました。

  • !=で置き換えました-ne。最初のものは無効です。
  • [との間にスペースを追加しました$number。 (最初の手順を修正してこれを行わない場合はどうなるか確認してください。)

もちろん、予期しない動作をする奇妙なプログラムを見るでしょうが、プログラムは実行されます:)

答え3

私はそうします:

#!/usr/bin/env bash

while :; do
    read -p "Please choose a number: " number
    [ "$number" -eq 50 ] 2>/dev/null
    case $? in
        0) break ;;
        1) echo "Wrong number; try again." ;;
        2) echo "Not a valid number; try again." ;;
    esac
done

echo "You got it!"

必要に応じてwhile交換する場所until。ところが、教授様がそうなると思います。いいえMusicstringsがこのプログラムを提出していただければ幸いです。 :)

答え4

あなたの予期しないタグ「fi」の近くに構文エラーがあります。thenそして、後にCR文字などの見えない文字がなければ、公開されたコードで説明することはできませんelse(ファイルがMicrosoft OSの場合、行区切り文字はLFではなくCRLFですが、DOS形式のファイルの場合、doCRのためまたは後に他のエラーメッセージが表示されると予想しましたdone

編集する: 問題の改訂履歴を見ると、次のエラーに該当するようです。以前のバージョンのスクリプト

すでに指摘したように、コマンド構文には引用符がない変数などの多くのエラーがありますが、[ループ構文は次のようになりますuntil

until
  condition-command-list
do
  action-command-list
done

condition-command-listたとえば、必要な数のコマンドを使用できるため、action-command-list次のことができます。

until
  printf 'please choose a number: '
  read number || [ -n "$number" ] || exit
  [ "$number" -eq 50 ]
do
  echo >&2 'Wrong number; try again'
done

その|| exit部分はEOFでスクリプトを終了することです(そうでなければ、実行中にスクリプトのstdoutが閉じられると永久に繰り返されますecho 49 | your-script)。

関連情報