5

我在 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 行为,也许有人可以解释一下吗?

4

2 回答 2

7

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

来自POSIX test(1) 规范

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

永远不会对具有空文件名的文件进行测试。现在有了明确test -f ""的两个参数,-f并被识别为“测试路径参数是否存在”的运算符。

于 2012-08-01T13:59:29.293 回答
3

var为空$var时,无论是否引用都会表现不同。

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

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

于 2012-08-01T13:59:40.360 回答