2016-12-09 5 views
0

初心者:

基本的に
echo $RANDOM % 10 + 1 | bc 

基本的に私はより多くの情報のための「読み取り」

コードを介してユーザによって与えられ、他の値に$ RANDOMの結果を比較したいですその$ RANDOM値の結果がユーザーが入力したものと等しいかどうかを確認するif文も必要です。例:

if [ [$RANDOM VALUE] is same as $readinput 
#readinput is the thing that was typed before 
then 
echo "well done you guessed it" 
fi 

その行に沿った何か!

私は私のように作っていたプログラムのecho "$RANDOM % 10 + 1 | bc"

考えるように読み取り、入力値を比較できるように、私はそれを作るのですか

を要約すると「NUMBERを推測!」

すべてが非常に高く評価を助ける:)

+1

は、' bc'は、乱数発生部に関与していません*全く* - それはあなたのコードではない唯一のものは、モジュロですあなたはこれらの事のどちらかのためにそれを必要としません。 –

+0

ところで、私は、質問する前に、あなたが本当にこの質問をコンポーネントに分解するべきだと主張する傾向があります。例えば、任意のコマンドの出力を変数に格納する方法を尋ねるなら、 'bc'や' RANDOM'と何もする必要はありません。あなたが2つの変数を比較する方法を尋ねていたら、同様に。この質問には、実際にはいくつかの異なる操作が前提として組み込まれていますが、そのうちのどれかが正しいことではないことは明らかです。 –

答えて

1

bcの必要はここにありません - あなたは整数で扱っていることから、本来の数学が行います。

printf 'Guess a number: '; read readinput 

target=$(((RANDOM % 10) + 1)) ## or, less efficiently, target=$(bc <<<"$RANDOM % 10 + 1") 

if [ "$readinput" = "$target" ]; then 
    echo "You correctly guessed $target" 
else 
    echo "Sorry -- you guessed $readinput, but the real value is $target" 
fi 

重要なことは、しかし、testコマンドである - また[の名前。

test "$readinput" = "$target" 

...は...の終了ステータスを持つ2つの値を比較し、出るの作業を行う

[ "$readinput" = "$target" ] 

...と全く同じであるifが扱います0( true)か、そうでない場合は0以外の終了ステータス(if)を返します。

1

簡単な答えは、ランダムに生成された値を格納するためにコマンド置換を使用し、次にユーザーに推測を求め、その2つを比較することです。彼らは正しい答えを得たまでそれがユーザーに求め続けるだろうように、おそらく、より堅牢な推測プログラムがループに埋め込まれることになる

#/bin/bash 

#Store the random number for comparison later using command substitution IE: $(command) or `command` 
random=$(echo "$RANDOM % 10 + 1" | bc) 

#Ask the user for their guess and store in variable user_guess 
read -r -p "Enter your guess: " user_guess 

#Compare the two numbers 
if [ "$random" -eq "$user_guess" ]; then 
    echo "well done you guessed it" 
else 
    echo "sorry, try again" 
fi 

:ここでは非常に単純な例です。また、おそらくユーザが整数を入力したことを確認する必要があります。 $ RANDOM`が、実際にはbash自体によって行われる `拡大

#!/bin/bash 

keep_guessing=1 

while [ "$keep_guessing" -eq 1 ]; do 

    #Ask the user for their guess and check that it is a whole number, if not start the loop over. 
    read -r -p "Enter your guess: " user_guess 
    [[ ! $user_guess =~ ^[0-9]+$ ]] && { echo "Please enter a number"; continue; } 

    #Store the random number for comparison later 
    random=$(echo "$RANDOM % 10 + 1" | bc) 

    #Compare the two numbers 
    if [ "$random" -eq "$user_guess" ]; then 
      echo "well done you guessed it" 
      keep_guessing=0 
    else 
      echo "sorry, try again" 
    fi 
done 
+0

さらに引用符が必要です。コードをhttp:// shellcheckで実行します。net/ –

+0

私のテストで変数を引用符で囲むことで、シェルのglobbingなどを防ぐことができますが、この場合は必要ありません。 RANDOMがここで使用される方法は、常に10未満の数字になり、その中には空白がありません。また、user_guess変数の値がスクラブされていて、その変数に空白がないことを確認しています。これは問題なく動作するはずです。 –

+1

IFSに数字がない場合は、です。 'IFS = 0 'の場合、' 109'は2つの単語、 '1'と' 9'になります。さらに重要なのは、引用符を残しておくことは、正当性を判断するために評価する必要があるロジックとコンテキストが増えていることを意味し、そのコメントへのコメントなしに、その評価に入るものは読者には見えません。たとえ重要ではない場合でも、私たちの例を通したベストプラクティスを示すことは、私たちが教えている人々が彼らの行動に従う可能性が高いことを意味します。 –

関連する問題