Bash

在內置測試中使用 -n 和 -z - Bash

  • June 23, 2017

在 bash 中考慮以下內容:

root@debian-lap:/tmp I=$(echo)
root@debian-lap:/tmp echo "$I"

root@debian-lap:/tmp [ -z "$I" ] && echo "TRUE" || echo "FALSE"
TRUE

這意味著變數 $I 是zero。我可以通過否定測試來實現相同的結果,以查看變數是否非零,!並使測試反轉,以便檢查變數zero

root@debian-lap:/tmp ! [ -n "$I" ] && echo "TRUE" || echo "FALSE"
TRUE
root@debian-lap:/tmp

所以,我的問題是,是否有任何特殊情況何時使用-zand ! -n,反之亦然! -z-n因為它們基本上是在做相同的測試?

謝謝

給你-nand-z的原因與其他測試套件給你==and !=, or ANDand的原因相同NOT。通過避免雙重否定,一些測試案例可以讓未來的維護者更清楚。此外,如上述評論中所述,sh與現代 POSIX 相比,(即 Bourne 和 Thompson 殼)的古代化身sh沒有!關鍵字來否定test表達式的真實性。

  1. [ -z "$var" ]

  2. [ ! -n "$var" ]

  3. ! [ -n "$var" ]

  4. [ ! "$var" ]

  5. [ "$var" = '' ]

  6. [ ! "$var" != '' ]

  7. [ '' = "$var" ]…²

在 POSIX 外殼中都具有相同的功能¹。Bourne shell¹ 沒有!關鍵字,因此不支持上面的 3,並且除了 7 之外,其他所有的 shell 中都存在具有特殊值$var(like =, -n, !…) 的各種錯誤(許多其他 shell 也有類似的錯誤)。

同樣,您可以(並且應該)使用[ "$a" = "$b" ] && [ "$x" = "$y" ]代替[ "$a" = "$b" -a "$x" = "$y" ],後者已被棄用且不可靠。

!of 3 是一個 POSIX shell 功能。對於可能想要使用它並否定條件的其他 shell 或非 shell 應用程序,test/[實用程序支持自己的運​​算符(如 2/6)仍然有意義。!

test實用程序由 Unix v7 引入。在此之前,有一個if實用程序有!, =, !=, -a/ -o,但沒有-n/ -z

我想-n/-z是為了方便而添加的(是為了保持一致性而添加的test -n "$var"縮寫形式)test "$var" != ''``-z


¹ 從技術上講,雖然test/[幾乎在所有類似 Bourne 的 shell 中都內置,但這不是 POSIX 強制要求的,並且 Bourne shell 的早期版本沒有內置它。雖然 Almquist shell 總是有一個test內置的,但一些 BSD 沒有啟用它,所以一些 BSD直到 2000 年代才內置[/ 。在任何情況下,無論特定的 shell 是否內置/ 命令,所有 POSIX 系統在文件系統上也會有/命令(其行為可能與系統)。test``sh``[``test``[``test``[``test

² 這並不是說這是唯一可用於測試變數是否為空字元串的命令。

case $var in
 "") ...
esac

是一種不涉及執行任何命令的方式。

expr "x$var" : 'x$' > /dev/null
${var:+"false"}
awk 'BEGIN{exit(ARGV[1] != "")}' "$var"
[ "${#var}" -eq 0 ]

有更多複雜方法的例子。

一些類似 Korn 的 shellbash也有一些內置的條件和算術結構,旨在替換[命令 ( [[ -z $var ]], ((${#var} == 0))…)。

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