if 文を until ループ内に置くことはできますか?

if 文を until ループ内に置くことはできますか?

ユーザーに繰り返し数字を尋ねる1 つのループを持つスクリプトを作成する必要があります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

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

read主な問題は、ループ内で、コンストラクトがチェックするnumberのと同じ変数 ( )を更新する必要があることでしたuntil

スペースも重要です。なぜなら、 の後の単語(空白で囲まれている)は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 形式のファイルの場合は、 と の後の CR が原因で他のエラー メッセージが表示されると予想されdoます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)。

関連情報