为了账号安全,请及时绑定邮箱和手机立即绑定

Bash检查是否显示文件不存在?

Bash检查是否显示文件不存在?

手掌心 2020-02-02 15:04:06
在bash中运行以下命令:   stuff=`rpm -ql <some package> | grep dasdasdfd`(软件包中不存在的文件,退出代码= 1,stdout为空)  if [ -f $stuff ]; then echo "whaaat"; fi上面的命令检查文件是否存在...但是:file $stuff只需打印文件的使用信息...,然后stat $stuff缺少操作数...有人可以解释为什么吗?这是一个错误吗?难道我做错了什么?我只想确保包中的文件存在于fs上
查看完整描述

3 回答

?
幕布斯6054654

TA贡献1876条经验 获得超7个赞

您可能需要$stuff用引号引起来


if [ -f "$stuff" ]; then

通常,您几乎总是希望在使用路径名的地方都加上引号。


我发现将壳脚本中的变量或变量视为“宏”会更有用,这些变量在首次使用时会扩展为它们的值。这与几乎所有其他编程语言中的变量都不同。


因此,如果$stuff包含hello world(请注意空格),则将与您键入的内容相同:


[ -f hello world ]

这显然是一个错误。


在这种情况下,您提到要处理的文件不存在,因此$stuff实际上是空的,就像键入:


[ -f ]

这实际上是有效的,但始终会成功。test从POSIX规范中可以看出,这有点晦涩难懂,test如果只有一个参数(在这种情况下,参数为-f),则总是成功:


1个参数:

如果$ 1不为null,则退出true(0);否则为0。否则,退出false。


这可能是为了便于编写:


[ $variable_that_may_or_may_not_be_defined ]

如果添加引号,则传递两个参数,然后发生更多理智的事情:


if [ -f "" ]; then


查看完整回答
反对 回复 2020-02-02
?
喵喵时光机

TA贡献1846条经验 获得超7个赞

$stuff正如Carpetsmoker所说,一种选择是加引号。


但是由于这被标记为bash,并且由于在文件名中包含空格是很痛苦的,所以您可以这样做:


if [[ -f $stuff ]]

相对于[,它的别名是test,该[[结构“知道”如何$stuff正确处理内容。


查看完整回答
反对 回复 2020-02-02
  • 3 回答
  • 0 关注
  • 529 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信