2013-07-13 54 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

相关问题