read num1
2
read num2
5
echo "$((num1+num2))"
7
echo "$(($num1+$num2))"
7
私は言及しましたこれ。
上記の2つの式が同じ結果をどのように生成できるかはわかりません。説明してください。
echo "$[num1+num2]"
この質問で提案されているように動作しません。私は何が間違っていましたか?
echo 'expr "$num1" + "$num2"`
動作しません。いくつかの提案をしてください。
ベストアンサー1
算術式を評価するために、シェルはまず変数とコマンド置換を拡張します。たとえば、 でecho "$(($num1+$num2))"
最初に行われることは、$num1
と を$num2
変数の値に置き換えることです。式は2+5
算術式で解析され、数値 7 と評価されます。解析と拡張の結果"$(($num1+$num2))"
はです7
。
算術式には変数名を含めることができます。これは変数の値として評価されます。したがって、$((num1+num2))
算術式num1+num2
($(($num1+$num2))
しかし算術式2+5
)です。この場合、結果は同じです。
num1
orの値が単純な数値シーケンス以上の場合、num2
2つの表現は異なります。たとえば、次のコードスニペットを考えてみましょう。
a="1+2"
echo "$(($a * 4))"
echo "$((a * 4))"
2行目で評価する算術式はです1+2 * 4
。乗算が加算より優先順位が高いため、これは1 +(2×4)に解析されます。算術評価が行われると、プラス記号が変数拡張から生じることが忘れられます。結果は数値9であるため、echo
printが最初に呼び出されます9
。
3行目の動作はシェルによって異なります。一部のシェル(ダッシュなど)は、a
有効な数値が含まれていないと文句を言います。他のシェル(ksh、bash、zshなど)は、の値をa
サブ式として扱います。これは、基本式で使用される値を取得するために評価されます。つまり、これらの他のシェルでは の値がa
で評価3
され算術式が 3 × 4 と評価されるため、結果は 12 です。
最後に、非推奨の$[…]
非標準バリアントがあります$((…))
。このexpr
ユーティリティは、シェルに組み込まれた算術構文がなかった頃にさかのぼり、シェルスクリプトで算術計算を実行する古い方法です。expr "$num1" + "$num2"
冗長性と同様に、7を印刷しますecho `expr "$num1" + "$num2"`
(引用符の1つを誤って入力しました)。