在我的一个实验室教程中,有一个需要检查的命令。
test -z $LOGNAME || echo Logname is not defined
当我执行此命令时,输出为“Logname 未定义”。测试手册页显示
> -z STRING
> the length of STRING is zero
当我回显 $LOGNAME 时,它会打印出我的登录名。因此,$LOGNAME 有一个值。在上面的第一个命令中,由于执行了命令的右侧部分,因此意味着左侧部分返回了 false。为什么 $LOGNAME 有值时会返回 false?
答案1
线路
test -z $LOGNAME || echo Logname is not defined
是一个或列表,可以翻译为:
做 echo Logname is not defined
如果 test -z $LOGNAME
失败
正如您在问题中提到的,test -z $LOGNAME
测试是否$LOGNAME
为零长度...并且由于不是,测试失败。替换||
为&&
以下内容将为您提供所需的行为:
test -z $LOGNAME && echo Logname is not defined
编辑:根据下面 William Pursell 的评论,test -n
(测试非零长度字符串)||
可能更具概念意义,但在这种情况下需要引用$LOGNAME
(事实上,养成引用变量的习惯是个好主意):
test -n "$LOGNAME" || echo Logname is not defined
答案2
test 命令在当前文件夹中查找提到的文件,如果要从其他位置检查文件,请提供完整路径,不要使用 -z 选项或使用 -s 选项。您可以执行以下操作:
测试 /usr/bin/logname && echo $LOGNAME || echo Logname 未定义
或者
测试 -s /usr/bin/logname && echo $LOGNAME || echo Logname 未定义