空字符串是文件吗?(如果 [ ! -f "" ] )

Sol*_*Kyo 0 string files test

该脚本名为isFile.sh,如下所示:

#!/bin/sh

回声 $1
回声 $2

如果 [ !-f $1 ]; 然后
  echo "$1 (arg1) 不是文件"
菲

如果 [ !-f $2 ]; 然后
  echo "$2 (arg2) 不是文件"
菲

首先,我通过执行touch file.exist.

我跑了bash isFile.sh file.exist file.notexist 输出是:

文件存在

文件不存在

file.notexist (arg2) 不是文件


然后我跑了bash isFile.sh "" file.notexist 输出是:

(#空行)

文件不存在

file.notexist (arg2) 不是文件

预期输出为:

(#空行)

文件不存在

(arg1) 不是文件

file.notexist (arg2) 不是文件

有人可以解释为什么吗?

nxn*_*nev 5

问题是扩展后[ ! -f $1 ]变成了[ ! -f ](而不是[ ! -f "" ]你想的那样!),所以如果检查给定文件是否存在,[检查-f字符串是否为空。它不是空的,但由于!最终的退出代码是1,因此echo不会执行该命令。

这就是为什么您需要在 POSIX shell 中引用变量的原因。

相关问题: