Arrays 使用bash数组作为参数

Arrays 使用bash数组作为参数,arrays,bash,Arrays,Bash,我有以下bash数组: IGNORED_DIRS=( "vendor" "node_modules" "bower_components" "tmp" "backup" ) 我需要以这样的方式输出: tar -cpzf /var/backups/ --exclude="vendor" --exclude="node_modules" --exclude="bower_components" --exclude="tmp" --exclude="backu

我有以下bash数组:

IGNORED_DIRS=(
    "vendor"
    "node_modules"
    "bower_components"
    "tmp"
    "backup"
)
我需要以这样的方式输出:

tar -cpzf /var/backups/ --exclude="vendor" --exclude="node_modules" --exclude="bower_components" --exclude="tmp" --exclude="backup"
到目前为止,我已经尝试了以下方法:

for dir in ${IGNORED_DIRS[@]}
do
    EXCLUDES=$EXCLUDES" --exclude=\""$dir"\""
done
因此,我将得到一个包含确切排除字符串的变量。我想我能做的很简单

tar -cpzf /var/backups/ $EXCLUDES

但这只是忽略了所有的排除标志。有人为我找到了解决方案吗?

中详细介绍了这一点。要总结解决方案,请执行以下操作:

extra_args=( )
for dir in "${IGNORED_DIRS[@]}"; do
    extra_args+=( --exclude="$dir" )
done

tar -cpz "${extra_args[@]}" -f /var/backups/

这将在中详细介绍。要总结解决方案,请执行以下操作:

extra_args=( )
for dir in "${IGNORED_DIRS[@]}"; do
    extra_args+=( --exclude="$dir" )
done

tar -cpz "${extra_args[@]}" -f /var/backups/

在修改@favoretti的响应时,使用
(..)
收集数组,并使用
${array[@]}
将数组扩展为项目,而不是合并为一个字符串

IGNORED_DIRS=(
    "vendor"
    "node_modules"
    "bower_components"
    "tmp"
    "backup"
)

for dir in "${IGNORED_DIRS[@]}"
do
    EXCLUDES=("${EXCLUDES[@]}" --exclude="$dir")
done

tar -cf /var/backup "${EXCLUDES[@]}"

在修改@favoretti的响应时,使用
(..)
收集数组,并使用
${array[@]}
将数组扩展为项目,而不是合并为一个字符串

IGNORED_DIRS=(
    "vendor"
    "node_modules"
    "bower_components"
    "tmp"
    "backup"
)

for dir in "${IGNORED_DIRS[@]}"
do
    EXCLUDES=("${EXCLUDES[@]}" --exclude="$dir")
done

tar -cf /var/backup "${EXCLUDES[@]}"

看来我找到了解决办法。将
EXCLUDES
行替换为
EXCLUDES=$EXCLUDES”--exclude=“$dir”“
似乎可以解决这个问题。所以现在排除目录周围不再有引号了。奇怪的是,他的方法确实有效……上述方法只适用于普通情况——尝试使用带有空格的目录名。顺便说一句——所有caps变量名都用于环境变量和shell内置,对操作系统或shell有意义,而小写名则保留给应用程序使用;因此,为您自己的shell变量使用小写名称意味着您不能错误地覆盖对操作系统有意义的变量——如果您希望您的代码与未来的操作系统和shell版本兼容,这一点尤为重要。看,看来我找到了解决办法。将
EXCLUDES
行替换为
EXCLUDES=$EXCLUDES”--exclude=“$dir”“
似乎可以解决这个问题。所以现在排除目录周围不再有引号了。奇怪的是,他的方法确实有效……上述方法只适用于普通情况——尝试使用带有空格的目录名。顺便说一句——所有caps变量名都用于环境变量和shell内置,对操作系统或shell有意义,而小写名则保留给应用程序使用;因此,为您自己的shell变量使用小写名称意味着您不能错误地覆盖对操作系统有意义的变量——如果您希望您的代码与未来的操作系统和shell版本兼容,这一点尤为重要。请参见。它主要需要
${EXCLUDES[@]}
位于
tar
命令本身的右侧位置。bash语法是否正确。非常感谢大家。学到了很多!GNU
tar
在这一点上是灵活的,但它在这方面超出了POSIX规范。(虽然必须承认,
--exclude
也不符合规范)。re:位置参数前的选项,请参阅,准则#9。@JoshuaGoldberg,您介意我进行必要的最少编辑来修复错误吗?主要是它需要
${EXCLUDES[@]}
tar
命令本身的正确位置。bash语法是否正确。非常感谢大家。学到了很多!GNU
tar
在这一点上是灵活的,但它在这方面超出了POSIX规范。(虽然必须承认,
--exclude
也不符合规范)。re:位置参数前的选项,请参阅,指南9。@JoshuaGoldberg,你介意我做最少必要的编辑来修复这些bug吗?回答很好。或者更简单,
tar-cpz“${忽略的_DIRS[@]/#/--exclude=}”-f/var/backups
。回答很好。或者更简单,
tar-cpz“${IGNORED_DIRS[@]/#/--exclude=}”-f/var/backups