Bash算術はどのように機能しますか?

Bash算術はどのように機能しますか?
 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)です。この場合、結果は同じです。

num1orの値が単純な数値シーケンス以上の場合、num22つの表現は異なります。たとえば、次のコードスニペットを考えてみましょう。

a="1+2"
echo "$(($a * 4))"
echo "$((a * 4))"

2行目で評価する算術式はです1+2 * 4。乗算が加算より優先順位が高いため、これは1 +(2×4)に解析されます。算術評価が行われると、プラス記号が変数拡張から生じることが忘れられます。結果は数値9であるため、echoprintが最初に呼び出されます9

3行目の動作はシェルによって異なります。一部のシェル(ダッシュなど)は、a有効な数値が含まれていないと文句を言います。他のシェル(ksh、bash、zshなど)は、の値をaサブ式として扱います。これは、基本式で使用される値を取得するために評価されます。つまり、これらの他のシェルでは の値がaで評価3され算術式が 3 × 4 と評価されるため、結果は 12 です。

最後に、非推奨の$[…]非標準バリアントがあります$((…))。このexprユーティリティは、シェルに組み込まれた算術構文がなかった頃にさかのぼり、シェルスクリプトで算術計算を実行する古い方法です。expr "$num1" + "$num2"冗長性と同様に、7を印刷しますecho `expr "$num1" + "$num2"`(引用符の1つを誤って入力しました)。

おすすめ記事