![在 Linux 中使用 do while 循环返回某些值](https://linux22.com/image/167037/%E5%9C%A8%20Linux%20%E4%B8%AD%E4%BD%BF%E7%94%A8%20do%20while%20%E5%BE%AA%E7%8E%AF%E8%BF%94%E5%9B%9E%E6%9F%90%E4%BA%9B%E5%80%BC.png)
我正在尝试创建一个脚本来检查文件是否正在更新。如果文件当时正在更新,则脚本不执行任何操作,但如果文件已停止更新,则脚本需要返回一些其他语句。
到目前为止我有以下脚本。
#!/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"
该解决方案使用grep
s-q
开关来抑制 grep 的通常输出,它只是测试find
空/非空条件的输出。while
只要find
命令输出至少一行文本,循环就会继续循环。一旦test.log
文件超过一分钟,find
就不再产生任何输出,并且grep
命令失败,导致循环终止。