在 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
這具有所需的副作用,節省一行,而且非常清晰。