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

在bash中运行以下命令:


   stuff=`rpm -ql <some package> | grep dasdasdfd`

(软件包中不存在的文件,退出代码= 1,stdout为空)


  if [ -f $stuff ]; then echo "whaaat"; fi

上面的命令检查文件是否存在...但是:


file $stuff

只需打印文件的使用信息...,然后


stat $stuff

缺少操作数...


有人可以解释为什么吗?这是一个错误吗?难道我做错了什么?我只想确保包中的文件存在于fs上


手掌心
浏览 530回答 3
3回答

幕布斯6054654

您可能需要$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

喵喵时光机

$stuff正如Carpetsmoker所说,一种选择是加引号。但是由于这被标记为bash,并且由于在文件名中包含空格是很痛苦的,所以您可以这样做:if [[ -f $stuff ]]相对于[,它的别名是test,该[[结构“知道”如何$stuff正确处理内容。
打开App,查看更多内容
随时随地看视频慕课网APP