我有一个bash脚本,它将文件作为输入,读取文件中的每一行并在该行上执行任务。在下面的示例中,我只打印出每一行。我想要做的是跟踪我在while循环中的位置,这样如果发生某些事情(例如计算机崩溃),我可以重新启动脚本并让它继续处于停止的while循环,而不是从开始。我目前正在将进度打印到日志文件(跟踪文件的哪一行),这将自动读取以获取最后完成的循环位置(如果没有日志文件则为0),但是我不确定如何从这一点开始我的while循环,而不是从头开始。任何帮助将不胜感激。
#!/bin/bash
while getopts ":l:" o; do
case "${o}" in
l)
l=${OPTARG} # input file
;;
esac
done
shift $((OPTIND-1))
if [ ! -f ./log.txt ]; then
position=0
printf "Starting from beginning of file\n";
else
position=$(head log.txt)
printf "Starting on line ${position}\n";
fi
while read line; do
printf "WORKING on line ${line}\n"
printf "$position\n" > log.txt
let position=position+1
done < ${l}
答案 0 :(得分:1)
我不相信你可以read
寻求,所以简单的解决办法就是在while
循环的顶部进行位置检查,然后通过继续修改已经看过的行做工作。
或者,对于已经处理了大部分数据的大型日志文件而言可能要便宜一点,就是使用进程替换而不是原始文件作为输入,并使用{{1}搜索到文件中}。
正如@rici指出的那样,你应该检查你的日志文件是否有内容而只有你想要的内容,而不是盲目地使用文件,因为文件可能有多种方式可能不符合你的期望。