2016-04-01 37 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