在內置測試中使用 -n 和 -z - Bash
在 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
所以,我的問題是,是否有任何特殊情況何時使用
-z
and! -n
,反之亦然! -z
,-n
因為它們基本上是在做相同的測試?謝謝
給你
-n
and-z
的原因與其他測試套件給你==
and!=
, orAND
and的原因相同NOT
。通過避免雙重否定,一些測試案例可以讓未來的維護者更清楚。此外,如上述評論中所述,sh
與現代 POSIX 相比,(即 Bourne 和 Thompson 殼)的古代化身sh
沒有!
關鍵字來否定test
表達式的真實性。
[ -z "$var" ]
[ ! -n "$var" ]
! [ -n "$var" ]
[ ! "$var" ]
[ "$var" = '' ]
[ ! "$var" != '' ]
[ '' = "$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 的 shell
bash
也有一些內置的條件和算術結構,旨在替換[
命令 ([[ -z $var ]]
,((${#var} == 0))
…)。