LinuxBash脚本:如何以变量作为参数执行命令

LinuxBash脚本:如何以变量作为参数执行命令,bash,Bash,我正在尝试制作一个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\//}

我正在尝试制作一个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
i=1
对于d in/home/test/*
做
dirs[i++]=“${d%/}”
完成
echo“当前路径中有${#dirs[@]}个dir”

对于((i=1;i可能是),您可能希望在
tar
之前
echo${exclude}
以确保变量包含您期望的值。

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

        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=()

您可以这样使用它:

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

是否确定变量“exclude”是在这一点上设置的吗?也许使用-x运行或回显tar命令将有助于确保您实际使用该值调用它。是的,排除位置正确,当我在命令行中启动它时,它的位置不正确,我问它是否已设置-即已定义。啊-我明白了。问题是您正在传递两个参数(-exclude和“…”)作为一个单独的arumgin。tar希望它们作为单独的参数。请参阅下面的文章,了解一些应该有效的方法。是的!就是这样!谢谢;-)你是对的,变量必须在每个循环上重置。
exclude="aenlever/*"
tar -czf /backups/sites/$siteonly.tar.gz ${dirs[i]} --exclude "tmp/*" --exclude "temp/*" --exclude "cache/*" --exclude "$exclude"