Shell
邏輯或 POSIX sh 條件評估的意外結果
假設我們有一個 if 語句如下:
if [ $(false) ]; then echo "?" fi
然後 ”?” 未列印(條件為假)。但是,在以下情況下,“?!” 列印出來了,為什麼?
if [ $(false) -o $(false) ]; then echo "?!" fi
$(false)
不評估為假,它產生一個空字元串。所以if [ $(false) ]; then
評估為
if [ ]; then
這是錯誤的,因為
[
沒有參數是錯誤的。if [ $(false) -o $(false) ]; then
評估為
if [ -o ]; then
這不使用
-o
運算符,它評估-o
為單個字元串參數;[
具有單個非空參數的為真,因此該語句的then
一部分執行。if
請參閱POSIX 規範
test
,尤其是:用於確定運算符優先級和應生成的返回值的算法基於提供給測試的參數數量。(但是,當使用“
$$ … $$" 形式,<right-square-bracket> 最後的參數不計入該算法。) 在下面的列表中, $ 1, $ 2、 $ 3, and $ 4 代表送出給測試的參數:
0 個參數:
錯誤退出 (1)。
1 個參數:
如果 $1 不為空,則退出 true (0);否則,退出 false。
test
僅在給定至少兩個參數時才考慮運算符。如果您想使用命令的退出狀態作為條件,請不要將其放在命令替換中或
[ ]
:if false; then
和
if false || false; then
另請注意,
test
’s-a
和-o
運算符已被棄用且不可靠;你應該改用 shell 的&&
和||
運算符,例如if [ "$a" = b ] || [ "$a" = c ]; then