在 bash 中运行以下命令:
stuff=`rpm -ql <some package> | grep dasdasdfd`
(包中不存在文件,退出代码 = 1,标准输出为空)
if [ -f $stuff ]; then echo "whaaat"; fi
以上命令检查文件是否存在...但是:
file $stuff
只打印文件的使用信息...和
stat $stuff
缺少操作数...
谁能解释一下为什么?这是一个错误吗?难道我做错了什么?我只想确保包中的文件存在于 fs 上
最佳答案
您可能需要用引号将 $stuff
括起来
if [ -f "$stuff" ]; then
作为一般规则,您几乎总是希望在您使用路径名的任何地方添加引号。
我发现将 shell 脚本中的变量或变量视为“宏”更有用,它们在首次使用时会扩展为它们的值。这与几乎所有其他编程语言中的变量都不同。
因此,如果 $stuff
包含 hello world
(注意空格),它与您键入的内容相同:
[ -f hello world ]
这显然是一个错误。
在这种情况下,您提到您正在处理一个不存在的文件,所以 $stuff
实际上是空的,这就像键入:
[ -f ]
这实际上是有效的,但总是成功。这是来自 POSIX spec 的一些模糊的 test
行为我们读到如果只有一个参数(在本例中,参数是 -f
),test
总是成功:
1 argument:
Exit true (0) if $1 is not null; otherwise, exit false.
这大概是为了方便写:
[ $variable_that_may_or_may_not_be_defined ]
如果您添加引号,您将传递 2 个参数,并且会发生更理智的事情:
if [ -f "" ]; then
关于Bash 检查显示文件存在于不存在的文件?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29303669/