嵌套if:参数太多了?

时间:2011-02-04 10:05:14

标签: bash shell

由于某些原因,此代码会产生问题:

source="/foo/bar/"
destination="/home/oni/"

if [ -d $source ]; then
        echo "Source directory exists"
        if [ -d $destination ]; then
                echo "Destination directory exists"
                rsync -raz --delete --ignore-existing --ignore-times --size-only --stats --progress $source $destination
                chmod -R 0755 $destination
        else
                echo "Destination directory does not exists"
        fi
else
        echo "Source directory does not exists"
fi

它出错:

Source directory exists
/usr/bin/copyfoo: line 7: [: too many arguments
Destination directory does not exists

我之前在bash中使用嵌套的if语句没有问题,我忽略了什么简单的错误?

谢谢!

2 个答案:

答案 0 :(得分:5)

语法看起来确实正确。在dash / bash中工作。

您是否更改了此示例的目标目录的名称?如果您的真实姓名包含例如你最好引用测试变量。

if [ -d "$destination" ]; then 

(无论如何,我会离开目标目录检查,因为如果丢失,rsync将创建目录。如果你在同一台计算机上而不是通过网络复制,我也会留下rsync的-z压缩参数。)

<强>更新

这对你有用吗? (你必须改变路径)

#!/bin/bash

source="/tmp/bar/"
destination="/tmp/baz/"

test -d "$source" || {
    echo "$source does not exist"
    exit
}

rsync -ra \
--delete \
--ignore-existing --ignore-times --size-only \
--stats --progress "$source" "$destination"

if [ "$?" -gt 0 ]; then
    echo "Failure exit value: $?"
fi

答案 1 :(得分:4)

我怀疑你的destination被设置为与上面显示的不同,可能包含空格。

你也应该在[ ]块中加上双引号,例如[ -d "$destination" ]