我需要检查目录中是否有 12 个文件。当只有一个文件时,此循环工作正常,并且将使用“sleep 300”循环 4 次。但是当根本没有文件时,它会失败并且不会循环。我还能添加什么来使其循环,即使根本没有文件。简而言之,我想检查20分钟的文件传送时间。
retry() {
attempt_num=0
while [[ `ls -1 *File*${JulianDate}.* | wc -l` -lt 12 ]]
do
答案1
不解析ls
输出。将文件列表读入数组,并检查数组的大小。
retry() {
while true; do
files=( *File*${JulianDate}.* )
(( ${#files[@]} >= 12 )) && break
sleep for some amount
done
do stuff with 12 or more files ...
}
答案2
waitforfiles () {
n=0
while [ "$n" -lt 4 ]; do
set -- *File*$JulianDate.*
[ "$#" -ge 12 ] && return 0
sleep 300
n=$(( n + 1 ))
done
return 1
}
if ! waitforfiles; then
echo 'Not enough files arrived in time.' >&2
exit 1
fi
# Do something here.
不要解析 的输出ls
,它仅供您解析看在。相反,使用 shell 来匹配要匹配的名称,然后计算匹配的文件数。 shell 或多或少免费地为您提供此功能(与调用外部实用程序ls
和相比wc
)。
上面的函数将休眠 300 秒,然后重试,直到模式匹配 12 个或更多文件名,或者直到循环运行四次。它返回成功(零)或失败(非零),具体取决于文件是否及时到达。
有关的: