如果没有生成任何文件,并且发生了睡眠,则退出bash脚本中的循环



我有一个bash脚本,它可以处理GUI输出的文件。我让它睡了一段时间,如果它找到了文件,它就会回到循环中。但是,如果在睡眠期之后没有找到任何文件,我希望脚本退出,但如果文件是在睡眠期生成的,则返回循环。但是,如果脚本没有检测到任何文件,它就会被困在循环中以保持睡眠。我的脚本如下:

#!/bin/bash
current_directory=$(pwd)
folder=1
while [ $folder -le 100 ]; do
fast5files=$(ls $current_directory/fast5/ | grep ".fast5" | wc -l)      
if [ $fast5files -ge 1 ]    
then
mkdir $current_directory/fast5/$folder
mv $current_directory/fast5/*.fast5 $current_directory/fast5/$folder/
program does something to fast5files here
another program does something to fast5files here
sleep $1         #variable set by user
((folder++))
elif [ $fast5files -eq 0 ]
then
echo "Couldn't find enough fast5 files. Waiting for 15 seconds"
sleep 15
elif [ $fast5files -eq 0 ]
then
echo "Exiting script due to not enough fast5 files"
exit 1
fi
done

您设置了folder并检查它,但从不修改它。

folder=1
while [ $folder -le 100 ]; do ...

如果它从未被修改,那么如果没有手动breakexit或类似的东西,循环将永远不会结束。

也许像

countFiles() { local lst=( fast5/*.fast5* );
if [[ -e $lst ]]; then cnt=${#lst[@]}; else return 1; fi;
return $((!cnt)); 
}
while true; do
if countFiles
then echo doing stuff :$cnt:
flag=0
elif (( flag > 0 ))
then echo "Exiting script due to not enough fast5 files"
exit 1
else ((++flag))
echo "Couldn't find enough fast5 files. Waiting for 15 seconds"
sleep 15
fi
done

这是快速而草率的,从函数内部设置全局,等等,但应该会给你一些想法。

您需要在睡眠状态之后添加出口。你已经创建了一个新的elif分支,它永远不会匹配,因为它已经匹配了早期的

#/bin/bash
current_directory=$(pwd)
folder=1
while [ $folder -le 100 ]; do
fast5files=$(ls $current_directory/fast5/ | grep ".fast5" | wc -l)      
if [ $fast5files -ge 1 ]    
then
# do something here
return 1
elif [ $fast5files -eq 0 ]
then
echo "Couldn't find enough fast5 files. Waiting for 15 seconds"
sleep 15
echo "now exiting"
exit 1
fi

也就是说,我不知道为什么你仍然想睡觉,而不仅仅是退出,当fast5files为0时,你也可以更新循环语句以退出,即

#/bin/bash
current_directory=$(pwd)
folder=1
fast5files=1
while [ $folder -le 100 -o $fast5files -ge 0 ]; do
# do stuff
sleep 15
fast5files=$(find -type f -printf '.' -name '*.fast5' | wc -l)
done

fyi当前脚本中没有任何内容更新文件夹参数,因此语句的一部分将始终为true

mv处理*.fast5文件之前,不需要检查它们是否存在。只需尝试mv并检查mv的退出状态即可。也许这就是你想要的:

#!/bin/bash
slept=0
n=1
while ((n <= 100))
do
mkdir -p fast5/$n || exit
if mv fast5/*.fast5 fast5/$n 2>/dev/null
then
((++n))
slept=0
elif ((!slept))
then
sleep 15
slept=1
else
break
fi
done

最新更新