1

我正在尝试制作一个 bash 脚本来启动一个 tar 命令。我需要 tar 有一个可变参数,但我不能让它工作......这是:

i=1
for d in /home/test/*
do
    dirs[i++]="${d%/}"
done
echo "There are ${#dirs[@]} dirs in the current path"
for((i=1;i<=${#dirs[@]};i++))
do
        siteonly=${dirs[i]/\/home\/test\//}
        if [[ $siteonly == "choubijoux" ]]
            then
            exclude='--exclude "aenlever/*"';
        fi
    tar -czf /backups/sites/$siteonly.tar.gz ${dirs[i]} --exclude "tmp/*" --exclude "temp/*" --exclude "cache/*" $exclude
done

tar 命令执行,但没有参数--exclude "aenlever/*"所以我想变量没有被考虑在内......有没有办法让它接受变量作为参数?

4

3 回答 3

2

更好的解决方案是使用数组:

        exclude=(--exclude "aenlever/*")
    fi
tar -czf /backups/sites/$siteonly.tar.gz ${dirs[i]} --exclude "tmp/*" --exclude "temp/*" --exclude "cache/*" "${exclude[@]}"

另外我认为您需要为每个循环重置变量,但这取决于您的意图。

for((i=1;i<=${#dirs[@]};i++))
do
    exclude=()

我建议将这种简化的格式作为一个整体:

#!/bin/bash

dirs=(/home/test/*)

# Verify that they are directories. Remove those that aren't.
for i in "${!dirs[@]}"; do
    [[ ! -d ${dirs[i]} ]] && unset 'dirs[i]'
done

echo "There are ${#dirs[@]} dirs in the current path."

for d in "${dirs[@]}"; do
    exclude=()
    siteonly=${d##*/}
    [[ $siteonly == choubijoux ]] && exclude=(--exclude "aenlever/*")
    tar -czf "/backups/sites/$siteonly.tar.gz" "$d" --exclude "tmp/*" --exclude "temp/*" --exclude "cache/*" "${exclude[@]}"
done
于 2013-09-10T17:47:40.737 回答
0

你可以像这样使用它:

exclude="aenlever/*"
tar -czf /backups/sites/$siteonly.tar.gz ${dirs[i]} --exclude "tmp/*" --exclude "temp/*" --exclude "cache/*" --exclude "$exclude"
于 2013-09-10T17:50:35.867 回答
0

可能您echo _${exclude}_之前tar想要确保变量包含您期望的值。

于 2013-09-10T17:43:48.417 回答