
ユーザーに繰り返し数字を尋ねる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
数値が-ne
50 の場合 (等しくない場合) のみループに入るためです。
read
主な問題は、ループ内で、コンストラクトがチェックするnumber
のと同じ変数 ( )を更新する必要があることでしたuntil
。
スペースも重要です。なぜなら、 の後の単語(空白で囲まれている)はif
コマンドの名前だからです。 は、[$number
入力されたものを評価しますが、先頭に '[' が付きます。これは、既存のコマンドの名前ではない可能性が高いです。たとえば、最初の推測が だった場合42
、if
コマンド はコマンド を実行しようとし[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
)。