使用任何特定键终止 BASH For 循环,该循环包含长时间的睡眠和其他内容

Kes*_*Kes 4 bash sleep shell-script

我有一个 bash 脚本

  • 有一个 for 循环,它会迭代很多次并在迭代之间休眠,可能会持续很长时间。那么它

  • 将结果写入文件,然后终止。

有时我会在许多循环迭代完成之前得到我需要的结果。

在这些情况下,我需要脚本break退出 for 循环,同时它是

  • 做事,或

  • 睡眠

以这样的方式,它将继续执行脚本的其余部分,在 for 循环之后,它正在编写迄今为止收集的数据报告文件。

我希望使用组合键(例如 CTRL+Q)break退出 for 循环。

脚本如下所示:

#!/bin/bash

for (( c=0; c<=$1; c++ ))
do  

# SOME STUFF HERE
#  data gathering into arrays and other commands here etc

# sleep potentially for a long time
sleep $2

done

#WRITE REPORT OUT TO SCREEN AND FILE HERE
Run Code Online (Sandbox Code Playgroud)

小智 6

我有一段时间没有接触过这种任务,但我记得曾经有过这样的事情:

#!/bin/bash

trap break INT

for (( c=0; c<=$1; c++ ))
do  

# SOME STUFF HERE
#  data gathering into arrays and other commands here etc

    echo loop "$c" before sleep

    # sleep potentially for a long time
    sleep "$2"

    echo loop "$c" after sleep

done

#WRITE REPORT OUT TO SCREEN AND FILE HERE

echo outside
Run Code Online (Sandbox Code Playgroud)

这个想法是使用Ctrl-C来打破循环。此信号 (SIGINT) 被陷阱捕获,它会中断循环并让脚本的其余部分跟随。

例子:

$ ./s 3 1
loop 0 before sleep
loop 0 after sleep
loop 1 before sleep
^Coutside
Run Code Online (Sandbox Code Playgroud)

如果您对此有任何问题,请告诉我。


ilk*_*chu 5

最简单的方法是使用Ctrl+C,因为默认情况下它会发出INT信号,这会导致大多数应用程序停止,您可以在 shell 中捕获它。

要立即中断整个循环,您可以在子shell 中运行它,并exit在中断时运行它。在这里,trap 只在子shell 中设置,并且只有它退出。

#!/bin/bash

(
trap "echo interrupted.; exit 0" INT
while true; do
        echo "running some task..."
        some heavy task 
        echo "running sleep..."
        sleep 5;
        echo "iteration end."
done
)

echo "script end."
Run Code Online (Sandbox Code Playgroud)