我有一个bash lopp
作为
#!/bin/bash
for (( c=0; c<=1000000; c++ ))
do
SOME STUFF HERE
done
我通过键盘输入中断长循环,Ctrl+C
但Ctrl+C
只是终止脚本。我正在寻找一种替代方案来继续当前循环并STUFF
在当前循环中完成运行后打破循环。
答案1
一种方法是使用trap
Control-C 信号并break
退出loop
,如下所示:
#!/bin/bash
trap break INT
for (( c=0; c<=1000000; c++ ))
do
SOME STUFF HERE
done
echo "I have broken out of the interminably long for loop"
trap - INT
sleep 1
echo "END."
有关其工作原理的更多详细信息,关键是:
trap break INT
并且
trap - INT
我们使用“break”告诉陷阱,当INT
(中断,又名SIGINT
)信号生成时(按 Ctrl+C 时发生),我们要运行break来中断循环。
我们可以将任意 shell 命令放在引号中,而不是“break”,并且当生成给定信号(在我们的例子中为 INT)时将执行该命令。
最后,我们再次运行 trap 将-
“INT”处理程序恢复为默认操作。
以下是一些可供进一步阅读的资源和示例:
- 关于 bash trap 命令的 Linuxjournal 文章给出了更多使用陷阱的示例以及不同选项之间的细微差别
- 关于陷阱的 MIT Confluence 页面涵盖 bash 和 tcsh shell
- 在 Shell 脚本中使用“trap”捕获信号和处理错误的初学者指南引用广泛显示键盘发送的其他信号,以及用于
kill -l
显示所有信号并kill -l SIGNALNAME
查找其数值的用法。