linux bash脚本:如何使用变量作为参数执行命令

时间:2013-09-10 17:39:18

标签: 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\//}
        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/*"所以我认为不考虑变量...有没有办法让它接受变量作为参数?

3 个答案:

答案 0 :(得分: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

答案 1 :(得分:0)

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

答案 2 :(得分:0)

你可以像这样使用它:

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