2017-04-25 41 views
0

我知道有關於引號的指南和答案。我已經閱讀了他們(整天),但我仍然無法讓我的簡單腳本工作。從一個變量運行一個rsync命令 - 引用不受尊敬

我已經設置了script1.sh並嘗試運行一個命令。該命令必須讀取到一個變量,所以我可以回顯它,運行它,並可能以後做其他的東西。

我的命令是

rsync -vtirn -e ssh --exclude '._*' --exclude '[email protected]*' --exclude '.DS_Store' --progress /Path/ [email protected]:/Path 

它能正常工作,如果我從bash的運行它,如果我把它放在我的腳本。

如果我在中間放置了一個變量,則--excludes不再工作。

job='rsync -vtirn -e ssh --exclude '"'"'._*'"'"' --exclude '"'"'[email protected]*'"'"' --exclude '"'"'.DS_Store'"'"' --progress /Path/ [email protected]:/Path 
echo $job 
$job 

奇怪的是,回聲顯示正是我需要的命令。如果我複製echo輸出並將其粘貼到shell中,則該命令正常工作。但以$ job開頭的命令正在省略排除項。

我一直試圖用雙引號開頭和結尾,只用雙引號轉義單引號(/')......這麼多不同的選項,但沒有考慮到我 - 排除「過濾器」參數。唯一有效的工作是

job=$(rsync -vtirn -e ssh --exclude '._*' --exclude '[email protected]*' --exclude '.DS_Store' --progress /Path/ [email protected]:/Path) 

但隨着這個命令啓動,只要變量設置。

在此先感謝您的幫助

+1

這在[BashFAQ#50](http://mywiki.wooledge.org/BashFAQ/050)中詳細討論。 –

回答

3

不要使用普通的變量來存儲命令名稱。定義一個函數。

job() { 
    rsync -vtirn -e ssh --exclude '._*' --exclude '[email protected]*' --exclude '.DS_Store' --progress /Path/ [email protected]:/Path 
} 

如果你真的需要記錄和執行的單一形式,定義一個數組的參數存儲rsync

opts=(-vtrin 
     -e ssh 
     --exclude '._*' 
     --exclude '[email protected]*' 
     --exclude .DS_Store 
     --progress 
     /Path/ 
     [email protected]:/Path 
) 
echo "rsync ${opts[*]}" 
rsync "${opts[@]}" 

的日誌不能正好一樣的,你執行命令,但它並不需要是;您沒有將日誌消息傳遞給eval

+0

我認爲'printf'%q'「$ {opts [@]}」; echo'提供可以被複制和粘貼的日誌,其效果與實際運行該命令的效果相同;實際上,echo的輸出可能會產生誤導。 –

+0

謝謝你的(工作)例子,我會嘗試從這裏拿走它。我試圖找出'echo'rsync $ {opts [*]}「','echo」rsync $ {opts [@]}「'和'printf'%q'」$ {opts [ ]}「; echo'。我將它們全部三個添加到我的腳本中,所有打印都一樣(除了最後一個的rsync外) –

相關問題