いくつかの算術関連のコマンド、Dash、POSIXシェル、sh、Increment

いくつかの算術関連のコマンド、Dash、POSIXシェル、sh、Increment

POSIX シェルで変数を前/後に増分する場合、次の 2 つの例の違いは何ですか。結果は同じように見えますが、使用方法は異なりますか? どちらか一方を他方よりも好むのはどのような場合ですか?

X=$((X+1))

: $((X=X+1))

答え1

最初の例では、$((X+1))式 X + 1 を評価して結果に展開し、その結果を変数に代入します。

2 番目の例では、は 1 ずつ$((X=X+1))増加しX($((X++))も有効で短いですが、必ずしもシェルでサポートされているわけではありません)、 の新しい値に拡張されます。$Xこの値は、ヌル コマンド の最初の引数です。:ヌル コマンドは引数を無視し、結果は破棄されます (副作用あり)。

私は個人的に、次の 3 つの理由 (比較的主観的) から最初の形式を好みます。

  • null コマンドはわかりにくく、誤解されていることが多く、ここでよく混乱した質問の対象になっていることがそれを示しています。
  • 最初の形式は、全体的なシェルの文法の観点から見るとより自然であり、古い評価スタイルに少し似ています。
  • 最初の形式はより明確かつ簡潔で、コマンドを含みません。

次のような1つのコマンドの環境を変更する場合は、最初のバージョンを使用する必要があります。

X=$((X+1)) /usr/local/bin/something

引数に直接評価を追加するには、2 番目の形式を使用する必要があります。

ls -la "file-$((X++))"   # or ...
ls -la "file-$((X=X+1))" # for better compatibility

これには望ましい副作用があり、1 行を節約でき、非常に明確です。

関連情報