我正在尝试编写一个逐行运行文件的基本脚本,直到达到时间限制。有没有办法在x timelimit之后停止read -r line
?我尝试了-t 10
10秒的限制。我也尝试了一个while循环
man read -t
似乎仅与timeout
相关而非时间限制
file.txt
包含超过150000行由新行分隔的随机字符
代码尝试1:
#!/bin/bash
file="./file.txt"
while IFS='' read -r -t 10 line ; do
echo "$line"
done <"$file" #finished
代码尝试2:
#!/bin/bash
timelimit=10
file="./file.txt"
while [[ "$timelimit" -gt "0" ]] ; do
sleep 1
((--timelimit))
while IFS='' read -r line ; do
echo "$line"
done <"$file" #finished
done
代码尝试1失败,因为它没有限制器(只是一个超时设置)
代码尝试2失败,因为它运行递减然后下一个while循环并且不会重新进入,直到它完成一个完整的循环(15000行)
答案 0 :(得分:3)
使用date +%s
:
CURRENT_DATE=$( date +%s )
END_DATE=$(( CURRENT_DATE+10 ))
while [ $CURRENT_DATE -le $END_DATE ];
do
read -r LINE
if [ $? -ne 0 ];
then
break
#exit from loop if file is over...
fi
CURRENT_DATE=$( date +%s )
#update CURRENT_DATE...
done
上面提到的命令以epoch(1970年1月1日)为单位返回当前日期值。
答案 1 :(得分:1)
您可以使用内置变量SECONDS
进行粗略控制。
SECONDS=0 # reset the counter
file="./file.txt"
while ((SECONDS < 10) && IFS= read -r line ; do
echo "$line"
done <"$file" #finished
假设每个read
和循环体不会花费太长时间,循环将在开始后非常接近10秒后退出。