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:语法错误:"done"意外(应为"do")

您的第二个while循环缺少do关键字。

看起来您没有关闭while条件([没有匹配项]),并且您的循环没有正文。

不能像那样比较整个文件。不管怎样,您似乎在将文件与自身进行比较。

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

(我将shebang更改为/bin/sh,主要是为了表明它不再包含任何抨击。主要更改是使用${HOME}而不是~。)

一种更稳健的方法是找到自上次复制以来出现的所有文件,并将其复制一遍。然后,您可以稍微不那么激进地运行它(比如,可能每5分钟运行一次,而不是这里的旋转锁,在迭代之间根本没有sleep)。您可以使用watch目录中的sentinel文件来跟踪上次复制某些文件的时间,或者只在ls -t1输出上运行for循环,直到您看到以前看到的文件。(不过,请注意关于解析ls输出缺乏稳健性的评论。)

最新更新