在我的一个实验教程中,有一个命令需要检查。
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)