
我有一個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
尋找其數值的用法。