2013-07-13 113 views
1

實施例bash腳本演示我的問題:如何將變量傳遞給bash腳本中的命令參數?

#!/bin/bash 

function exclude 
{ 
    BACKUP_EXCLUDES="$BACKUP_EXCLUDES --exclude=\"$1\"" 
} 

exclude "/proc" 
exclude "/dev" 
exclude "/mnt" 
exclude "/media" 
exclude "/lost+found" 

echo $BACKUP_EXCLUDES 

輸出:

--exclude = 「/ PROC」 --exclude = 「/ dev的」 --exclude = 「/ MNT」 - exclude =「/ media」--exclude =「/ lost + found」

完美!但是當我嘗試添加時:

rsync -ruvz $BACKUP_EXCLUDES//some/backup/path 

$ BACKUP_EXCLUDES被完全忽略,沒有錯誤或警告......爲什麼?

+0

排除路徑需要是相對的,不是絕對的。您可能需要'-x'選項而不是排除項。 – jordanm

+0

我會推薦: --exclude-from = FILE –

+0

請參閱[BashFAQ#50:我試圖把一個命令放在一個變量中,但複雜的情況總是失敗!](http://mywiki.wooledge.org/BashFAQ/050) –

回答

3

你需要使用數組:

#!/usr/bin/env bash 

BACKUP_EXCLUDES=() 
function exclude 
{ 
    while 
    (($#)) 
    do 
    BACKUP_EXCLUDES+=(--exclude="$1") 
    shift 
    done 
} 
exclude /proc /dev /mnt /media 
exclude "/lost+found" 

rsync -ruvz "${BACKUP_EXCLUDES[@]}"//some/backup/path 

bash的解釋:請@janos回答

zsh的解釋(如果它是巖組):當你使用一個字符串變量這就像你通過--exclude="\"/proc\" --exclude=\"/media\" ..." - 所以它被視爲與空間長路徑 - 從來沒有匹配。

+1

它看起來像你在while循環中做了太多工作:'for arg;做BACKUP_EXCLUDES + =( - exclude =「$ arg」);完成' –

+0

我沒有使用'for $ arg',因爲在更大的腳本中會使用'arg'變量來避免環境混亂,並且爲了防止它需要'首先排版arg' - 最終會是相同的計數再次 – mpapis

+0

謝謝你的功能漂亮地工作。 bash中的 – Charlie

3

它不起作用,因爲報價包含在單個--exclude參數中。也就是說,rsync將忽略"/proc"而不是/proc。當然"/proc"(帶引號)不存在。

如果在命令前堅持一個eval它會工作,像這樣:

eval rsync -ruvz $BACKUP_EXCLUDES//some/backup/path 

在這種情況下,--exclude="/proc"(和所有其他人)將進行評估,以--exclude=/proc,這就是爲什麼它會奏效。

但我認爲你應該使用由@mpapis或--exclude-from=FILE提出的數組。兩者都是更好更清潔的解決方案。

+0

感謝您對陣列的解釋和建議。不幸的是,我不能使用-exclude-from,因爲它與重複不兼容,而--exclude似乎同時適用於rsync和duplicateity。 – Charlie

相關問題