Bash 嵌套if:参数太多?

Bash 嵌套if:参数太多?,bash,shell,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

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

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语句,没有问题,我忽略了什么简单的错误


谢谢

语法看起来确实正确。在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

语法看起来确实正确。在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
我怀疑您的目的地设置为与上面显示的不同的内容,可能是包含空格的内容

您也应该在[]块中用双引号括起来,例如,[-d$destination]。

我怀疑您的destination设置为与上面显示的不同的内容,可能是包含空格的内容


您也应该在[]块中用双引号括起来,例如,[-d$destination]。

非常好的推断:-我使用的是空格。我将其更改为在其周围加双引号,但现在它表示该文件夹不存在,即使它存在。您需要在脚本中出现的$source和$destination周围加双引号。非常好的推断:-我使用的是空格。我将其改为在其周围加双引号,但现在它表示该文件夹不存在,即使它确实存在。您需要在脚本中出现的$source和$destination周围加双引号。抱歉,Mikel稍早了一点。谢谢你的建议!我仍然需要帮助,因为它说现在在包装双引号时文件夹不存在。不,我以前是;--测试:当你放置一个测试-d$destination |{echo$destination不存在;exit}就在路径分配之后,它真的会退出吗?首先我道歉,因为它只在几个小时内提到它,有时让我感到困惑。不管怎样,当我在路径分配下面加上那一行时,我得到了第20行:语法错误:文件的意外结尾我认为initall打败了我。当我发布我的然后重新加载时,Intall说2分钟前已回复。我在手机上输入答案-对不起,伙计,米克尔早了一点。谢谢你的建议!我仍然需要帮助,因为它说现在在包装双引号时文件夹不存在。不,我以前是;--测试:当你放置一个测试-d$destination |{echo$destination不存在;exit}就在路径分配之后,它真的会退出吗?首先我道歉,因为它只在几个小时内提到它,有时让我感到困惑。不管怎样,当我在路径分配下面加上那一行时,我得到了第20行:语法错误:文件的意外结尾我认为initall打败了我。当我发布我的然后重新加载时,Intall说2分钟前已回复。我在手机上输入答案-我也遇到了类似的问题,无法使用-z、-n或=,使if语句正常工作。我的问题的解决方案如下:我使用echo和find设置了一个变量。我想看看find是否发现了什么。我回显了变量,但什么也没有得到,所以我假设它是空的。但是,我随后使用${string_name}回显了字符串的长度,发现它的长度为2。这意味着它包含2个空格字符。所以我把if改成了长度2,因为我所有的正确答案都会更长。您还可以检查2个空格。希望这对别人有帮助!我也遇到了类似的问题,无法使用-z、-n或=,使if语句正常工作。我的问题的解决方案如下:我使用echo和find设置了一个变量。我想看看find是否发现了什么。我回显了变量,但什么也没有得到,所以我假设它是空的。但是,我随后使用${string_name}回显了字符串的长度,发现它的长度为2。这意味着它包含2个空格字符。所以我把if改成了长度2,因为我所有的正确答案都会更长。您还可以检查2个空格。希望这对别人有帮助!