我需要编写一个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
都无法正常工作。
答案 0 :(得分:1)
SOURCEFILE=/path/*file.csv
在您的情况下是错误的。无法使用-f
标记对其进行评估。
一个简单的解决方案是使用find
或ls
并计算结果:
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} ]]