在bash中运行以下命令:
stuff=`rpm -ql <some package> | grep dasdasdfd`
(软件包中不存在的文件,退出代码= 1,stdout为空)
if [ -f $stuff ]; then echo "whaaat"; fi
上面的命令检查文件是否存在...但是:
file $stuff
只需打印文件的使用信息...,然后
stat $stuff
缺少操作数...
有人可以解释为什么吗?这是一个错误吗?难道我做错了什么?我只想确保包中的文件存在于fs上
您可能需要$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
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句