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


17

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

X=$((X+1))

: $((X=X+1))

回答:


18

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

2番目の例では、1 $((X=X+1))ずつインクリメントXし(これ$((X++))も有効で短くなりますが、必ずしもシェルでサポートされる必要はありません)、$Xnullコマンドの最初の引数であるの新しい値に展開されます:。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行節約され、非常に明確です。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.