Вложено ли: слишком много аргументов? - PullRequest
1 голос
/ 04 февраля 2011

По какой-то причине этот код создает проблемы:

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

Раньше я использовал вложенные операторы if в bash без проблем, какую простую ошибку я пропускаю?

Спасибо!

Ответы [ 2 ]

5 голосов
/ 04 февраля 2011

Синтаксис действительно выглядит правильно.Работает в dash / bash.

Вы изменили имя каталога назначения для этого примера?Если ваше настоящее имя содержит, например, пробел, вам лучше заключить в кавычки протестированную переменную.

if [ -d "$destination" ]; then 

(Я бы все равно оставил target-directory-check-check, поскольку rsync создаст каталог, если его нет.на том же компьютере, а не по сети, я бы также оставил параметр сжатия -z в rsync.)

Обновление:

Это работает для вас?(Вам придется изменить пути)

#!/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
4 голосов
/ 04 февраля 2011

Я подозреваю, что ваш destination настроен на что-то отличное от того, что вы показали нам выше, возможно, что-то, содержащее пробелы.

Вы должны поместить двойные кавычки вокруг него в блоке [ ], например, [ -d "$destination" ].

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...