2011-02-04 33 views
1

出於某種原因,該代碼創建問題:嵌套如果:參數太多?

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前發言沒有問題,我俯瞰什麼簡單的錯誤我用嵌套?

謝謝!

+0

我有一個類似的問題,並且無法使if語句正常工作,因爲它應該使用-z,-n或=。我的問題的解決方案如下:我已經使用回聲並找到設置變量。我想看看「找到」是否找到了什麼。我回應變量並沒有得到任何東西,所以我認爲它是空的。但是我使用$ {#string_name}回顯了字符串的長度,並且看到它的長度爲2,意思是它包含2個空白字符。所以我改變了我是否要檢查長度2(因爲我的正確答案會更長)。你也可以檢查2個空格。希望這可以幫助別人! – keyser 2012-03-01 11:16:51

回答

5

語法真的看起來正確。在破折號/ bash中工作。

您是否更改此示例的目標目錄的名稱?如果您的真實姓名包含例如空白你最好引用被測試的變量。

if [ -d "$destination" ]; then 

(我將離開反正目的地目錄檢查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 
+0

對不起,米克爾早一點。還是)感謝你的建議!我仍然需要幫助,因爲現在說包裝雙引號時該文件夾不存在。 – FLX 2011-02-04 12:56:38

+0

不,我以前是;-) - 測試:當您放置一個`測試-d「$目的地」||「。 {回聲「$目的地不存在」;退出}`在路徑分配之後,它真的退出了嗎? – initall 2011-02-04 14:07:03

4

我懷疑你的destination設置爲不同的東西比你向我們展示了上面,大概包含空格的東西。

你也應該在[ ]塊中加雙引號,例如: [ -d "$destination" ]