鉴于此驱动程序功能仅在给定输入的情况下产生输出:
function driver -a arg
test $arg = 1; and echo OK
return 0
end
Run Code Online (Sandbox Code Playgroud)
当函数发出输出时,事情正常工作:
$ driver 1 | od -c
0000000 O K \n
0000003
$ test -z (driver 1); and echo no output; or echo some output
some output
$ test -n (driver 1); and echo some output; or echo no output
some output
Run Code Online (Sandbox Code Playgroud)
但在无输出的情况下:
$ driver 0 | od -c
0000000
$ test -z (driver 0); and echo no output; or echo some output
no output
$ test -n (driver 0); and echo some output; or echo no output
some output
Run Code Online (Sandbox Code Playgroud)
这是一个错误吗?
这不是一个错误!
命令替换(driver X)执行驱动程序函数,然后将每个输出行转换为参数.在(驱动程序0)的情况下,没有输出,因此您获得零参数.因此,无输出情况等同于运行test -z和test -n.
好的旧IEEE 1003.1 告诉我们在这种情况下必须做什么测试:
1参数:如果$ 1不为null,则退出true(0); 否则,退出false
因此,当-n是唯一的参数时,它会失去其作为标志的状态,并且您最终会测试'-n'是否为非null(当然它会通过).
你可以在bash中看到相同的行为:
> test -n `echo -n` ; echo $?
0
Run Code Online (Sandbox Code Playgroud)
在fish中,如果要检查字符串是否为非空,则可以使用count:
if count (driver 0) > /dev/null
# output!
end
Run Code Online (Sandbox Code Playgroud)
您还可以使用带有test的中间变量:
set -l tmp (driver 0)
test -n "$tmp" ; and echo some output; or echo no output
Run Code Online (Sandbox Code Playgroud)
引号确保$ tmp始终成为一个参数(可能为空).