2016-11-05 77 views
0

在我的bash腳本,在好幾個地方,我需要運行命令Bash如何包含帶引號作爲變量的命令?

rsync [stuff] --exclude={"/mnt/*","/proc/*"} [source] [destination]

爲了避免打字了整個名單,我要打包選項--exclude={"/mnt/*","/proc/*"}到一個名爲EXCLUDES這樣我可以輸入變量在我的腳本:

rsync [stuff] "$EXCLUDES" [source] [destination]

什麼是實現這一目標的正確方法?

+0

[Bash pass變量作爲帶引號的參數可能重複](http://stackoverflow.com/questions/39583838/bash-pass-variable-as-argument-with-quotes) –

+0

'EXCLUDES =' - exclude = {「/ mnt/*」,「/ proc/*」}'' –

+0

沒有問題:'$ EXCLUDES'可以擴展爲包含引號的內容;這些不會與'「$ EXCLUDES」'周圍的引號有關。 '$ VAR'語法不能對周圍的語法進行「近似引用注入攻擊」。 – Kaz

回答

2

使用數組:

EXCLUDES=(
    --exclude="/mnt/*" 
    --exclude="/proc/*" 
) 
rsync [stuff] "${EXCLUDES[@]}" [source] [destination] 

或這裏-DOC與--exclude-from選項:

rsync [stuff] --exclude-from - [source] [destination] <<EOF 
/mnt/proc/* 
/proc/* 
EOF 

我會建議不要在腳本中使用括號擴展。你的文本編輯器應該很容易快速複製重複的字符串,並且生成的腳本將更具可讀性。 Brace擴展旨在用於交互式使用。

相關問題