使用bash数组作为参数

时间:2017-02-21 20:42:10

标签: 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="backup"

到目前为止,我尝试了以下内容:

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

这样我最终会得到一个包含确切排除字符串的变量。我以为我可以干脆做到

tar -cpzf /var/backups/ $EXCLUDES

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

2 个答案:

答案 0 :(得分:4)

BashFAQ #50详细介绍了这一点。总结一个解决方案:

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

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

答案 1 :(得分:1)

修改@ 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[@]}"