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