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)
如果您对此有任何问题,请告诉我。
最简单的方法是使用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)