2014-02-14 200 views
1

從中央Linux機器(RHEL 6.3)中,我試圖將一組zip文件推送到一系列其他Linux主機,然後在每個目標主機上解壓這些文件。我的中央主機是hpdb1。嵌套for循環的問題

#Push zip files to other hosts 
for i in {2..8}; do 
    scp -r /software/stage/*.zip [email protected]$i:/software/stage 
done 

#Unzip files to /software/stage 
for i in {2..8}; do 
    ssh hpdb$i "for f in /software/stage/*.zip; do unzip /software/stage/"$f" done"; 
done 

第一個for循環推送文件工作正常。但是,在運行嵌套的for循環時,我得到了以下錯誤:

[[email protected] ~]# for i in {2..8}; do ssh hpdb$i "for f in /software/stage/*.zip; do unzip /software/stage/"$f"; done"; done 
unzip: cannot find or open /software/stage/, /software/stage/.zip or /software/stage/.ZIP. 
unzip: cannot find or open /software/stage/, /software/stage/.zip or /software/stage/.ZIP. 

貌似$f變量是沒有得到解釋。有任何想法嗎?

更新時間:

此代碼適用。

for i in {2..7}; do 
    ssh hpdb$i 'for f in /software/stage/*.zip; do unzip "$f" -d /software/stage; done'; 
done 

回答

1

我的第一個,雖然是使用其他引號字符一樣,所以:

for i in {2..8}; do ssh hpdb$i 'for f in /software/stage/*.zip; do unzip /software/stage/「$f」; done'; done 
+0

我只是打算寫,這個是原來的問題的註釋。我認爲這是答案,試試吧! –

+0

羅布和DopeGhoti,你們大多是正確的,但讓我在正義的道路上... 單引號允許找到文件,但是當它運行時,我得到以下錯誤:unzip:無法找到或打開/software/stage/software/stage/p13390677_112040_Linux-x86-64_1of7.zip 因此,我將語法更改爲hpdb $ i'for f in /software/stage/*.zip;解壓縮「$ f」;完成「;完成 這工作,但它解壓到/根 一切進一步修改它進一步使用-d標誌解壓縮工作就像一個冠軍! hpdb $ i'for f in /software/stage/*.zip;解壓縮「$ f」-d/software/stage;完成「;完成 – user3311061

2

該問題可能是嵌套雙引號。您可能希望外部引號爲單引號,以便嵌入式$在發送到遠程服務器之前不會展開。

0

雖然您可以使用不同的引號,如其他答案所示,但這會改變變量擴展行爲,並且在某些情況下可能不合需要。

你可以簡單地逃離封閉引號代替,通過懸而未決預它們用反斜槓:

for i in {2..8}; do 
    ssh hpdb$i "for f in /software/stage/*.zip; do unzip /software/stage/\"$f\"; done"; 
done 
+0

「雖然您可以使用不同的引號作爲另一個答案的建議,但這會改變變量擴展行爲......」但這正是這裏所需要的。 – glglgl