Shell
幾個與算術相關的命令,Dash,POSIX shell,sh,Increment
在 POSIX Shell 中預/後遞增變數時,這兩個範例之間有什麼區別。它們似乎會產生相同的後果,但它們的使用方式會有所不同嗎?你什麼時候更喜歡其中之一?
X=$((X+1)) : $((X=X+1))
在您的第一個範例中,
$((X+1))
計算表達式 X + 1 並擴展為結果,然後將其分配給變數。在第二個範例中,
$((X=X+1))
遞增X
1($((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
這具有所需的副作用,節省了一行,並且非常清楚。