从最后一个位置重新启动bash脚本中的while循环



我有一个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 filen";
else
    position=$(head log.txt)
    printf "Starting on line ${position}n";
fi
while read line; do
    printf "WORKING on line ${line}n"
    printf "$positionn" > log.txt
    let position=position+1
done < ${l}

我不相信你能找到read,所以简单的解决方案是在while循环的顶部粘贴一个位置检查,并通过继续而不是工作来烧掉你已经看到的行。

或者,对于已经处理了大部分数据的大型日志文件来说,使用进程替换而不是原始文件作为输入并使用tail -+$position查找文件可能会便宜很多。

正如@rici所指出的,尽管你应该检查你的日志文件是否有内容,并且只包含你想要的内容,而不是盲目地使用该文件,因为有很多方法可能会使文件不符合你的期望。

最新更新