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

时间:2014-09-15 19:11:26

标签: bash while-loop

我有一个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}

1 个答案:

答案 0 :(得分:1)

我不相信你可以read寻求,所以简单的解决办法就是在while循环的顶部进行位置检查,然后通过继续修改已经看过的行做工作。

或者,对于已经处理了大部分数据的大型日志文件而言可能要便宜一点,就是使用进程替换而不是原始文件作为输入,并使用{{1}搜索到文件中}。

正如@rici指出的那样,你应该检查你的日志文件是否有内容而只有你想要的内容,而不是盲目地使用文件,因为文件可能有多种方式可能不符合你的期望。