Bash 检查显示文件存在于不存在的文件?

标签 bash

在 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/

相关文章:

python - 特别是本地 Django 部署。织物?

bash - 条件语句中continue和冒号的区别

c - 如何在bash中使用程序A的输出作为B的输入?

linux - 如何在 Linux 中获取文件的最后一行前 2 个字符

mysql - 完全通过 FIFO 连接到 MySQL 客户端

java - bash 命令在 tomcat/java Runtime.getRuntime.exec() 中失败,但可以从命令行运行

regex - shell脚本中 "=~"运算符的含义

linux - 是否可以创建一个始终以 root 身份启动程序的 shell 脚本?不管是谁在运行它

bash - nginx在docker上的配置问题-对没有实例的docker进行故障排除

bash - Shell 函数字符串变量在 While 循环和 case 后结果为空?