複数の算術関連コマンド、Dash、POSIX shell、sh、Increment

複数の算術関連コマンド、Dash、POSIX shell、sh、Increment

POSIXシェルで変数を事前/後に増分するときのこれら2つの例の違いは何ですか?同じ結果をもたらすように見えますが、使用方法は異なりますか?いつ他のものよりも1つを好むのですか?

X=$((X+1))

: $((X=X+1))

ベストアンサー1

最初の例では、$((X+1))X + 1式が評価​​され、結果として展開され、次の変数に割り当てられます。

2番目の例では、1だけ$((X=X+1))増加し(有効で短いがシェルで必ずしもサポートされているわけではありません)、最初の引数であるnullコマンドの新しい値に展開されます。 nullコマンドはその引数を無視し、結果は破棄されます(副作用を含む)。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

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

おすすめ記事