什么是测试命令中的 -z 选项(linux)

Des*_*PRG 9 linux unix shell

在我的一个实验教程中,有一个命令需要检查。

test -z $LOGNAME || echo Logname is not defined
Run Code Online (Sandbox Code Playgroud)

当我执行此命令时,输出是“未定义日志名”。测试手册页说

> -z STRING
>               the length of STRING is zero
Run Code Online (Sandbox Code Playgroud)

当我回显 $LOGNAME 时,它会打印出我的登录名。所以 $LOGNAME 有一个值。在上面的第一个命令中,由于执行了命令的右侧部分,这意味着左侧部分已返回 false。当 $LOGNAME 有值时,为什么它返回 false?

小智 7

线

test -z $LOGNAME || echo Logname is not defined
Run Code Online (Sandbox Code Playgroud)

是一个OR 列表,可以翻译为:

DO echo Logname is not defined IF test -z $LOGNAME 失败

正如您在问题中提到的,test -z $LOGNAME测试$LOGNAME长度是否为零……如果不是,则测试失败。更换||&&如下会给你你想要的行为:

test -z $LOGNAME && echo Logname is not defined
Run Code Online (Sandbox Code Playgroud)

编辑:根据下面的 William Pursell 的评论,test -n(测试非零长度的字符串)并且||可能更具有概念意义,但$LOGNAME在这种情况下您需要引用(实际上,养成引用的习惯是个好主意一般变量):

test -n "$LOGNAME" || echo Logname is not defined
Run Code Online (Sandbox Code Playgroud)

  • 你必须小心引用。`test -n $foo` 是一场等待发生的灾难,因为如果 foo 未定义它会成功,但如果 foo 长度为零则不会成功。`test -z $foo` 按预期工作(即,它在 `foo` 未定义和 `foo` 长度为零时都成功),但使用 `test -z "$foo"` 是个好主意并避免病理情况。(当 foo 未定义时,`test -z $foo` 会成功,因为字符串 `-z` 是非空的。) (2认同)