私bash lopp
にはASがあります。
#!/bin/bash
for (( c=0; c<=1000000; c++ ))
do
SOME STUFF HERE
done
キーボード入力で長いループを中断しましたが、Ctrl+C
スクリプトCtrl+C
は終了しました。現在のループを続行し、STUFF
現在のループで実行が完了した後にループを中断するための代替案を探しています。
答え1
1つの方法は、次のようにControl-Cを使用してtrap
信号を送信して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
INT
「break」を使用して(break、別名SIGINT
)信号が生成されたとき(Ctrl + Cを押すと発生します)、breakを実行してループを中断したいとトラップに通知します。
"break"の代わりに引用符でシェルコマンドを置くことができ、与えられた信号(私たちの場合はINT)が生成されたときに実行されます。
最後に、トラップを再実行して-
「INT」ハンドラをデフォルトのジョブに復元します。
以下は、追加資料のためのいくつかのリソースと例です。
- bashトラップコマンドに関するLinuxjournal記事トラップの使用に関するより多くの例と、さまざまなオプションとの間のニュアンスを提供します。
- トラップに関するMIT Confluenceページbash と tcsh シェルを扱います。
- シェルスクリプトで信号を捕捉し、エラーを処理するために「トラップ」を使用する初心者ガイド参考文献には、キーボードから送信されたその他の信号だけでなく、すべての信号を表示し、その値を
kill -l
見つけるkill -l SIGNALNAME
ための使い方が広く表示されます。