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
これは、望ましい副作用があり、行を節約し、非常に明確です。