2014-01-15 162 views
2

我有一個關於在Bash腳本中使用變量作爲命令輸入的簡單問題。我想編寫一個腳本,它自動將目錄foo的某些內容複製到通過ssh連接到另一個目錄bar的嵌入式計算機。在變量中使用變量作爲函數參數

換句話說,我希望把下面的命令到一個更容易維護腳本:

ssh -r /foo/{file1,file2,dir1,*.h,*.hpp,*.c,*.cpp} [email protected]:~/bar 

到目前爲止,我有以下幾點:

#!/bin/bash 

SOURCE='/foo'; 
FILES='{file1,file2,dir1,*.h,*.hpp,*.c,*.cpp}'; 
DESTINATION='[email protected]:~/bar'; 

set -x 
scp -r $SOURCE/$FILES $DESTINATION 
set +x 

然而,這被作爲執行:

ssh -r '/foo/{file1,file2,dir1,*.h,*.hpp,*.c,*.cpp}' '[email protected]:~/bar' 

我確定我在某處使用了錯誤的引號或括號,但我收費我喜歡我嘗試過的一切。感謝任何能夠幫助新手的人。 :)

回答

2

manual會告訴你,括號擴展是任何其他擴展之前進行的...

我不認爲你有任何選項,但如果你想利用在這裏使用eval變量的命令:

SOURCE='/foo'; 
FILES='{file1,file2,dir1,*.h,*.hpp,*.c,*.cpp}'; 
FILELIST="$(eval echo "${SOURCE}"/"${FILES}")" 

後來說:

scp -r "$FILELIST" $DESTINATION 
+0

那麼你肯定讓我更接近解決方案。在你的方法中,FILELIST得到了擴展,但scp的參數仍然出現在單引號內,所以在我的情況下(其中'/ foo'是當前目錄'.','DESTINATION'是引用主目錄''' ,那些符號沒有得到解析,我不得不修改你的解決方案來閱讀'scp -r $(eval echo「$ FILELIST」)$(eval echo $ DESTINATION)''來工作,謝謝你的幫助! –

1

如果將大括號或* s放在引號內,它們將不會被shell擴展。因此,使用方法:

scp -r "$SOURCE/"{file1,file2,dir1,*.h,*.hpp,*.c,*.cpp} $DESTINATION 

如果你真的要定義文件列表調用scp前,然後用一個bash數組:

filelist=("$SOURCE/"{file1,file2,dir1,*.h,*.hpp,*.c,*.cpp}) 

scp -r "${filelist[@]}" $DESTINATION 

這裏,filelist是一個數組,"${filelist[@]}"是bash的特殊咒語返回列表中的每個文件名作爲scp的單獨參數。

+0

我結束了使用更接近devnull的方法,但感謝您的幫助,並教我一些關於bash數組的新東西!=) –