Shell

邏輯或 POSIX sh 條件評估的意外結果

  • November 26, 2022

假設我們有一個 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

引用自:https://unix.stackexchange.com/questions/726261