Bash,混淆不同文件测试的结果(test -f)

时间:2012-08-01 13:51:22

标签: file shell testing posix

我在bash中被这个表达混淆了:

$ var="" # empty var
$ test -f $var; echo $? # test if such file exists
0 # and this file exists, amazing!
$ test -f ""; echo $? # let's try doing it without var
1 # and all ok

我无法理解这种bash行为,也许任何人都可以解释一下?

2 个答案:

答案 0 :(得分:6)

这是因为在$var看到之前test的空展开已被删除。您实际上正在运行test -f,因此test只有一个arg,即-f。根据POSIX,像-f这样的单个arg是真的,因为它不是空的。

来自POSIX test(1) specification

1 argument:
Exit true (0) if `$1` is not null; otherwise, exit false.

永远不会测试具有空文件名的文件。现在有一个明确的test -f "",有两个args,-f被认为是“测试存在路径参数”的运算符。

答案 1 :(得分:3)

var为空时,如果引用或不引用,$var的行为会有所不同。

test -f $var          # <=> test -f       ==>   $? is 0
test -f "$var"        # <=> test -f ""    ==>   $? is 1

所以这个例子告诉我们:我们应该引用$var