$( (((expression)) ) と $(((expression))) の違いは何ですか?

$( (((expression)) ) と $(((expression))) の違いは何ですか?

なぜ出力が違うのですか?

echo $( (( 5+5 )) )

echo $((( 5+5 )))
10

答え1

bash有効な状態でコマンドを実行しますset -x

$ set -x
$ echo $( (( 5+5 )) )
++ ((  5+5  ))
+ echo

$ echo $((( 5+5 )))
+ echo 10
10
$ echo $(( ( 5+5 ) ))
+ echo 10
10

ご覧のとおり、$(...)最初のコマンドのコマンドはコマンドの代替として扱われます。このコマンドは実行コマンドを置き換えます((5+5))。これは出力のない算術評価なので、引数を使用せずに改行echo文字のみを使用します。

他の場合(そして私が追加した追加ケース)は$((...))算術拡張として扱われます。この計算の値は、(5+5)その計算の結果に置き換えられます。

bash混乱を避けるために、上記の最後のコマンドで示したように、パーサーが使用する構文グループ化の種類を確認できるようにスペースを使用することをお勧めします。

答え2

$( (( 5+5 )) )5+5内部算術式です。算術複合命令 (( … ))内部に一つコマンドの置き換え $( … )。算術複合コマンドは出力を生成しないため、コマンド置換の結果は空です。算術複合コマンドは、割り当て(コマンドに割り当てがない)またはその戻り値(ここでは使用されません)にのみ役立ちます。

$((( 5 + 5 )))または内部$(( ( 5+5 ) ))算術式( 5 + 5 )算術拡張 $(( … ))。算術拡張の結果は数値です(10進形式で表示)。

関連情報