while循环中的错误,用于仅在固定时间内检查文件是否存在

时间:2017-07-21 08:20:59

标签: shell unix ksh

我需要编写一个while循环来检查文件是否存在。

我的要求是:仅检查文件5分钟。如果文件在5分钟内进入该路径,则退出循环并继续执行脚本的其余部分,否则在5分钟后退出脚本,并找不到错误文件'。我写了这样的代码:

SOURCEFILE=/path/*file.csv    
StartTime=$(date +'%s')    
TimeSpan=300
EndTime=$((StartTime + TimeSpan))

while [[ ! -f ${SOURCEFILE} && $(date +'%s') < ${EndTime} ]]    
do

  echo "inside loop"    
  sleep 25

done    
echo "outside loop"

但是使用while while循环,即使文件存在于上述路径中,它也会进入循环内部并且仅在300秒后退出。我是shell脚本的初学者,我无法理解这个问题。我正在使用ksh。

我还可以告诉你,它仅适用于while [ ! -f {SOURCEFILE} ]。但每当我向while循环添加任何&&条件时,-f都无法正常工作。

2 个答案:

答案 0 :(得分:1)

SOURCEFILE=/path/*file.csv在您的情况下是错误的。无法使用-f标记对其进行评估。

一个简单的解决方案是使用findls并计算结果:

find /path/ -name "*file.csv" -type f
# then count the result...

现在我认为运营商优先级存在逻辑问题。要仅强制评估!的{​​{1}},请使用括号。以下是适用于我的内容,您必须稍微调整一下以匹配-f之前的*

file.csv

还有一些解释docs。 &#34;和&#34;运算符先于&#34; not&#34;,这就是您遇到问题的原因。

答案 1 :(得分:1)

您的主要问题是在正确的时间点#(<{p>)展开星号(*)。

[ ][[ ]]构造的行为方式不同,尤其是在是否/何时扩展星号时,这并没有帮助。 [您可以仔细阅读google search for 'ksh single bracket vs double bracket'了解更多详情。]

尝试运行以下内容以查看单/双括号和不带引号/单引号/双引号变量之间的差异:

SOURCEFILE=/path/*file.csv
set -x
[ ! -f ${SOURCEFILE} ] && echo 'missing'
[ ! -f '${SOURCEFILE}' ] && echo 'missing'
[ ! -f "${SOURCEFILE}" ] && echo 'missing'
[[ ! -f ${SOURCEFILE} ]] && echo 'missing'
[[ ! -f '${SOURCEFILE}' ]] && echo 'missing'
[[ ! -f "${SOURCEFILE}" ]] && echo 'missing'

注意:请注意哪些测试会扩展星号,哪些测试会在名称中查找(文字)星号。

注意:尝试在文件名中添加一个空格(例如*file XX.csv)并运行上述测试......棘手,棘手,棘手......

对于这个特殊情况......文件名中的星号/通配符,没有空格,ksh ......你可能会对以下内容感到满意:

while [[ ! -f ${SOURCEFILE} ]] && [[ $(date +'%s') < ${EndTime} ]]