Unix Calculator.bashの問題

Unix Calculator.bashの問題

これはUnixで数値を計算するために書いたbashスクリプトです。

echo "Please enter the calculation(operation) type (+)(-)(*)(/)"
        read $opr
echo "Enter the first number"
        read $num1
echo "Enter the second number"
        read $num2
if [[ $opr = "+" ]]; then
        num=$(($num1 + $num2))
                echo "The sum is = $num"
elif [[ $opr = "-" ]]; then
        num=$(($num1 - $num2))
                echo "The sum is = $num"
elif [[ $opr = "*" ]]; then
        num=$(($num1 * $num2))
                echo "The sum is = $num"
elif [[ $opr = "/" ]]; then
        num=$(($num1 / $num2))
                echo "The sum is = $num"
fi

実行されますが、「合計は=」であり、数値を提供しません。この問題の原因は何ですか?

答え1

現在の入力を受け取る方法が間違っているようで、read数学がまったく行われず、答えがない状態になります。この部分だけを変更すると、残りのコードが機能します。

読む方法

最初に公開されたコードからの抜粋は、次のように最初の数字を保存しようとしていることを示しています。

echo "Enter the first number"
        read $num1

代わりに-p、プロンプトを使用してドル記号なしで変数名を指定してください。コマンドプロンプトで以下をテストして確認numすることもできます。read -p ...

$ read -p "Enter the first number" num1
Enter the first number:

今1を入力してください。

$ read -p "Enter the first number" num1
Enter the first number: 1

これで、echo $num1値が正常に表示されます。

$ echo $num1
1
  • -p the_prompt_textヒントを含むメソッドです。
  • と比較して末尾に戻り行を追加しますechoechoしかし-p、そうではないので、私のように余分なスペースを置く方が良いです。コロンの後に:スペースがあることに注意してください"Enter the first number: "。これは、ユーザーの入力がコロンの右側に表示されないようにするためです。
  • 応答を含む変数を指定するときに正しい読み取り構文は含まれません$readnum1

readこれにより、スクリプトのさまざまな部分を調整でき、正しく機能します。

答え2

ユーザー 454038そして男の名前トラブルシューティングの方法を正しく説明しますが、間違った内容については説明しません。$ 引用するシェルで(または少なくともbashで)の価値変数ですが、変数自体を参照するとき(例:環境値)。これは混乱しています。ほとんどの(すべて?)一般的なプログラミング言語では、どちらも同じ構文を使用します。あなたが言う概念を部分的に理解しているようです。

num=$(($num1 + $num2))

よくある間違いを犯す代わりに

$num=$(($num1 + $num2))                                                (これはしないでください!)

これはreadこの声明にも当てはまります。拡張される予定です(read $opr次に置き換えられます)。$opr現在の変数値opr) - 変数の現在の値はopr空の文字列です。だから、コマンドは次のように見えます。

read

これがバグだと思うかもしれません。実際にはread REPLY。だから、

$$num1を読む
番号17
$エコ $num1
                                                                    (空のライン出力)
$echo$REPLY
番号17

この例では、メカニズムをよりよく説明します。

$ superman=clark_kent
$ read $superman
man of steel
$ echo $superman
clark_kent
$ echo $clark_kent
man of steel

ただし、このような操作(特に上記の例)は複雑すぎるため、実行しないでください。読者/メンテナンス者は、コードが何をしているのかを理解するのが難しいでしょう。

長い話を短く

あなたの声明は、および(sなし)でなければreadなりません。read oprread num1read num2$

関連情報