2012-02-02 122 views
-2

代碼:bash腳本嵌套循環錯誤

#! /bin/bash 
while [ 1 -eq 1 ] 
do 
while [ $(cat ~/Genel/$(ls -t1 ~/Genel | head -n1)) != $(cat ~/Genel/$(ls -t1 ~/Genel | head -n1)) ] 
$(cat ~/Genel/$(ls -t1 ~/Genel | head -n1)) > /tmp/cmdb;obexftp -b $1 -B 6 -p /tmp/cmdb 
done 
done 

此代碼給我這個錯誤:

btcmdserver: 6: Syntax error: "done" unexpected (expecting "do")

+0

McAfee Web Gateway不允許我讀取您的代碼:-( 請您可以在stackoverflow.com上發佈您的代碼的相關部分? – olibre 2012-02-02 18:58:12

+0

你的腳本的一部分沒有做到嗎?我沒有看到第二個'do'或第二個'do'的終止']' – AlG 2012-02-02 19:01:29

+1

以'$'結尾的行看起來不完整。 ?還解析'ls'的結果是一個腳本是非常脆弱的 – Johnsyweb 2012-02-02 19:02:21

回答

5

你的第二個while循環缺少做關鍵字。

看起來你並沒有關閉你的while條件([沒有匹配]),並且你的循環沒有body。

+0

我編輯了代碼我很抱歉代碼錯誤:( – 2012-02-02 19:03:39

+0

非常感謝@blueberryfields :) – 2012-02-02 19:07:31

+1

您仍然沒有第二個while循環的正文。我期待看到:WHILE [CONDITION] DO WHILE [condition] ** DO [body] ** DONE DONE。大膽的部分是missi NG。 – blueberryfields 2012-02-02 19:52:22

1

你不能比較這樣的整個文件。無論如何,你似乎在比較一個文件本身。

#!/bin/bash 
while true 
do 
    newest=~/Gene1/$(ls -t1 ~/Gene1 | head -n 1) 
    while ! cmp "$newest" "$newest" # huh? you are comparing a file to itself 
    do 
    # huh? do you mean this: 
    cat "$newest" > /tmp/cmdb 
    obexftp -b $1 -B 6 -p /tmp/cmdb 
    done 
done 

這是最麻煩的語法錯誤和反模式修復,但幾乎保證不做任何有用的事情。希望這足以讓你更接近你的目標。 (在這個問題中說明它可能也有幫助。)

編輯:如果您試圖在每次當您正在觀看的目錄中出現新文件時嘗試複製最新文件,請嘗試此操作。仍然存在競賽狀況;如果在複製過程中出現多個新文件,則會錯過除一個之外的所有文件。

#!/bin/sh 
genedir=$HOME/Gene1 
previous=randomvalue_wehavenobananas 
while true; do 
    newest=$(ls -t1 "$genedir" | head -n 1) 
    case $newest in 
    $previous) ;; # perhaps you should add a sleep here 
    *) obexftp -b $1 -B 6 -p "$genedir"/"$newest" 
     previous="$newest" ;; 
    esac 
done 

(我改變了家當爲/ bin/sh的主要是表明該不再包含任何bash化,主要的變化是使用${HOME}而不是~。)

更健壯的方法是找到自上次複製以來出現的所有文件,並將其複製。然後你可以稍微不積極地運行一下(比如說,每5分鐘一次,也許是這樣,而不是你在這裏的旋轉鎖定,在迭代之間根本沒有sleep)。您可以在watch目錄中使用sentinel文件來跟蹤上次複製某些文件的時間,或者在ls -t1輸出上運行for循環,直到看到之前看到的文件。 (請注意,關於解析ls輸出缺乏穩健性的評論,儘管如此。)

+1

如需查找最新的文件,請參閱[BashFAQ/003](http://mywiki.wooledge.org/BashFAQ/003)。 – 2012-02-02 21:00:04