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

uinbv5nw  于 2022-11-16  发布在  Shell
关注(0)|答案(3)|浏览(99)

我有一个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
0tdrvxhp

0tdrvxhp1#

设置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

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

gev0vcfq

gev0vcfq2#

你需要到添加这退出之后这sleep语句.你已经创建了一个新的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当前脚本中没有任何内容更新folder参数,因此语句的一部分将始终为true

p8ekf7hl

p8ekf7hl3#

你不需要在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

相关问题