bash脚本嵌套循环错误

问题描述:

代码: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

你的第二个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

你不能比较这样的整个文件。无论如何,你似乎在比较一个文件本身。

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