web-dev-qa-db-ja.com

いくつかの算術関連コマンド、ダッシュ、POSIXシェル、sh、インクリメント

変数を前後にインクリメントする場合、POSIXシェルでは、これら2つの例の違いは何ですか。それらは同じ結果をもたらすように見えますが、使用方法は異なりますか?どちらを優先しますか?

X=$((X+1))

: $((X=X+1))
17
J. M. Becker

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

2番目の例では、$((X=X+1))Xを1つインクリメントし($((X++))も有効で短くなりますが、必ずしもシェルでサポートされているわけではありません)、新しい値に展開します$X、nullコマンドの最初の引数、:。 nullコマンドはその引数を無視し、結果は(副作用と共に)破棄されます。

私は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行節約され、非常に明確です。

19
Alexios