如何将变量传递给bash脚本中的命令参数?

时间:2013-07-13 03:29:41

标签: linux bash variables parameters rsync

示例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完全被忽略,没有错误或警告......为什么?

2 个答案:

答案 0 :(得分: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解释(如果它是Zsh):当你使用字符串变量时,就像你传递了--exclude="\"/proc\" --exclude=\"/media\" ..." - 所以它被视为带有空格的长路径 - 从未匹配

答案 1 :(得分:3)

它不起作用,因为引号包含在各个--exclude参数中。也就是说,rsync将忽略"/proc"而不是/proc。当然"/proc"(带引号)不存在。

如果你在命令前面贴上一个eval它会起作用,如下所示:

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

在这种情况下,--exclude="/proc"(和所有其他人)将被评估为--exclude=/proc,这就是为什么它会起作用。

但我认为你应该使用@mpapis提出的数组,或者注释提出的--exclude-from=FILE。两者都是更好,更清洁的解决方案。