2016-04-01 36 views
0

我正在使用bash来制作一个使用irecovery的小程序,这是一款适用于iOS设备的工具,我试图自动化使用它的过程。未被程序接受的bash变量

我已经创建了在特定文件夹中搜索文件的变量,所以其他用户可以对不同文件使用相同的程序,但问题是变量不会被文件的名称替换,所以“irecovery “无法访问它们。

我的代码看起来像这样

#!/bin/bash 

dtree=$(find Downgrade -type f -iname device*) 
ramdisk=$(find Downgrade -type f -name *.dmg) 
kernel=$(find Downgrade -type f -iname kernel*) 

./irecovery -s <<EOF 

/send $dtree 
devicetree 
/send $ramdisk 
ramdisk 
/send $kernel 
bootx 
reboot 
EOF 

现在我怎么会得到的bash打印出变量它由irecovery之前,还是让irecovery使用bash中定义的变量?

+0

不能安全地存储文件名列表中的标量变量:一个文件名可以包含除NUL之外的任何字符,因此可以标量变量。无论如何, –

+1

- 这种形式的heredocs *做*展开变量;声称他们并不是完全错误的,*但是*由于名字没有适当的引用而通过扩展阶段就会出现大量的bug。 –

+0

引用'-iname'或'-name'后面的参数以避免你的bash扩展你的通配符('*')。 – Cyrus

回答

-2

我自己现在找到了解决办法。我删除从EOF的报价,所以有替代和各

/send 

后,我用echo命令来呼应我的文件和工作。所以现在例如,它看起来像:

./irecovery -s <<EOF 

/send `echo $dtree` 

EOF 
+2

这是[无用的'echo'](http://www.iki.fi/era/unix/award.html#echo),又是一个危险的引用错误。 – tripleee

+0

@tripleee有没有更好的方法来打印出变量? – TheOnlyGermanGuy

+1

'/ send $ dtree'应该可以正常工作,除非你特别*要求* shell破坏任何空格并且扩展$'$ dtree'的值中的任何通配符(在这种情况下,你的问题应该明确指出这个要求)。另请参阅http://stackoverflow.com/questions/10067266/when-to-wrap-quotes-around-a-variable – tripleee

0

您可以在./irecovery -s命令之前使用echo命令来查看通过irecovery传递的内容。
像这样:

echo dtree:$dtree 
echo ramdisk:$ramdisk 
echo kernel:$kernel 

可以传递变量,检查是这样的:
cat << EOF
$dtree
EOF

+0

我的文件位置正确,echo会打印正确的文件。我尝试了使用没有替换的命令,它的工作,虽然我不得不用实际的文件名替换变量,因为他们不能这样通过,或者他们可以吗? – TheOnlyGermanGuy

+0

是的,他们可以,我在回答中提到 – Arash

+0

我使用'echo $ dtree',并且在我从EOF中删除“”后工作得很好,谢谢你的回答。 – TheOnlyGermanGuy