幾個與算術相關的指令,Dash、POSIX shell、sh、Increment

幾個與算術相關的指令,Dash、POSIX shell、sh、Increment

在 POSIX Shell 中前/後遞增變數時,這兩個範例之間有什麼區別。它們看起來會產生相同的後果,但它們的使用方式會有所不同嗎?什麼時候您更喜歡其中一種而不是另一種?

X=$((X+1))

: $((X=X+1))

答案1

在第一個範例中,$((X+1))計算表達式 X + 1 並擴展為結果,然後將其指派給變數。

在第二個範例中,$((X=X+1))遞增X一($((X++))也是有效且較短的,但 shell 不一定支援),然後擴展為 的新值$X,它是 null 指令 的第一個參數:。 null 指令忽略它的參數,並且結果被丟棄(有副作用)。

我個人比較喜歡第一種形式,因為有三個(相對主觀的)原因:

  • null 命令是晦澀難懂且容易被誤解的,正如它經常成為此處令人困惑的問題的主題所表明的那樣。
  • 第一種形式在整體 shell 語法方面似乎更自然,甚至有點像舊的評估風格。
  • 第一種形式更清晰、更簡潔,且不涉及命令。

如果您只修改一個命令的環境,例如

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

您必須使用第二種形式直接為參數新增求值:

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

這具有所需的副作用,節省一行,而且非常清晰。

相關內容