在 Linux 中使用 do while 循环返回某些值

在 Linux 中使用 do while 循环返回某些值

我正在尝试创建一个脚本来检查文件是否正在更新。如果文件当时正在更新,则脚本不执行任何操作,但如果文件已停止更新,则脚本需要返回一些其他语句。

到目前为止我有以下脚本。

#!/bin/bash

DIR=/home/

cd $DIR

FILE=$(find . -maxdepth 1 -type f -mmin -1 -name 'test.log' | wc -l)

while [ ${FILE} -eq 1 ]
do
    echo "Now sleeping for 20 seconds"
    sleep 20
done
if [ ${FILE} -eq 0 ]
then
    echo "Job is finished"
fi

基本上,我在我的主目录中查找一个名为 test.log 的文件,该文件已在 1 分钟内更新。我正在使用 wc -l 来显示该文件存在。如果 test.log 文件存在,我想使用 while 循环返回语句“现在睡眠 20 秒”。一旦文件不再更新,我希望脚本继续前进并返回“作业已完成”。

至此,当test.log文件不存在时运行脚本时,会返回Job is finish。但是,当 test.log 文件存在且仅“1 分钟前”或更少时,脚本会返回“现在休眠 20 秒”,并且即使文件早于 1 分钟且未更新,也会继续返回此信息不再了。脚本永远不会继续返回“作业已完成”

答案1

您没有修改FILE循环内的变量(因此它保持不变),因此要么立即完成,要么进入无限循环。

假设你的linux系统有这个stat命令,尝试

while (( ( $(printf "%(%s)T") - $(stat -c"%Y" test.log) ) < 60 ))
  do    echo "Now sleeping for 20 seconds"
        sleep 20
  done

它利用 的bash功能%()T((...))以及stat纪元格式来轻松减去两个时间值。如果文件在一分钟内发生变化,它将继续循环,直到文件超过一分钟。

答案2

您可以使用永远循环的 while 循环以及break找不到文件时的循环。您需要将find命令移动到循环内以进行重复检查:

#!/bin/bash

while true; do
    logfile=$(find /home -maxdepth 1 -type f -mmin -1 -name 'test.log')

    if [ -z "$logfile" ]; then
      break # no file found, break while-loop
    fi
    echo "Now sleeping for 20 seconds"
    sleep 20
done
echo "Job is finished"

答案3

FILE=$(find . -maxdepth 1 -type f -mmin -1 -name 'test.log' | wc -l)

find当进行分配时,命令替换将在此处展开​​并启动。您不会更改FILE其他任何地方,因此它将保留在脚本开始时获得的值。将命令替换和赋值移到循环内。

答案4

稍微提炼@Freddy的解决方案:

#!/bin/bash

while find /home -maxdepth 1 -type f -mmin -1 -name 'test.log' | grep -q .
do
    echo "Now sleeping for 20 seconds"
    sleep 20
done
echo "Job is finished"

该解决方案使用greps-q开关来抑制 grep 的通常输出,它只是测试find空/非空条件的输出。while只要find命令输出至少一行文本,循环就会继续循环。一旦test.log文件超过一分钟,find就不再产生任何输出,并且grep命令失败,导致循环终止。

相关内容