在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
喵喵时光机
TA贡献1846条经验 获得超7个赞
$stuff正如Carpetsmoker所说,一种选择是加引号。
但是由于这被标记为bash,并且由于在文件名中包含空格是很痛苦的,所以您可以这样做:
if [[ -f $stuff ]]
相对于[,它的别名是test,该[[结构“知道”如何$stuff正确处理内容。
- 3 回答
- 0 关注
- 529 浏览
添加回答
举报
0/150
提交
取消