2011-02-04 5 views
1

По какой-то причине этого кода создает проблемы:Вложенное if: слишком много аргументов?

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 

It ошибку с:

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

Я использовал вложенный если заявления в Баше перед без проблем, чем простой ошибки я с видом?

Спасибо!

+0

У меня была аналогичная проблема, и я не мог заставить if-инструкцию работать так, как должен использовать -z, -n или =. Решение моей проблемы было следующим: я использовал эхо и нашел, чтобы установить переменную. Я хотел посмотреть, нашел ли «находку» что-нибудь. Я повторил переменную и ничего не получил, поэтому предположил, что она пуста. Но затем я повторил длину строки, используя $ {# string_name}, и увидел, что она имеет длину 2. Значение содержало 2 символа пробела. Таким образом, я изменил, если проверить длину 2 (так как все мои правильные ответы будут длиннее). Вы также можете проверить наличие двух пробелов. Надеюсь, это поможет кому-то! – keyser

ответ

5

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

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

if [ -d "$destination" ]; then 

(я оставил бы адресат-каталог проверьте все равно, как Rsync создаст каталог, если его не хватает. Если скопировать на одном компьютере, а не по сети, я бы оставить -z параметр сжатия Rsync также)

Update:.

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

#!/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 
+0

Извините, человек, Микель был немного раньше. Спасибо за предложение! Мне все еще нужна помощь, так как теперь говорится, что папка не существует при обертке двойных кавычек. – FLX

+0

Нет, я был раньше ;-) - Тест: когда вы помещаете 'test -d '$ destination" || {echo "$ destination не существует"; exit} 'сразу после назначений пути, действительно ли он выходит? – initall

+0

Приносим извинения за initall, так как он упоминает его только в часах, он меня иногда путает. В любом случае, когда я добавляю эту строку только под назначением пути, я получаю строку 20: синтаксическая ошибка: неожиданный конец файла – FLX

4

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

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

+0

Очень приятно вывести :-) Я использую пробелы. Я изменил его, чтобы поместить в него двойные кавычки, но теперь он говорит, что папка не существует, хотя она и есть. – FLX

+0

Вам нужно поместить двойные кавычки вокруг '$ source' и' $ destination' везде, где они появляются в скрипте. – Mikel

Смежные вопросы