代码:
#! /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
输出缺乏稳健性的评论。)