
bash lopp
私は
#!/bin/bash
for (( c=0; c<=1000000; c++ ))
do
SOME STUFF HERE
done
キーボード入力で長いループを中断しましたCtrl+C
が、Ctrl+C
単にスクリプトを終了しました。現在のサイクルを続行し、現在のサイクルでの実行が終了した後にループを終了する代替手段を探していますSTUFF
。
答え1
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
INT
「break」を使用して、(割り込み、別名SIGINT
)信号が生成されたとき(Ctrl + C を押すと発生)にループを中断するために break を実行するようにトラップに指示します。
「break」の代わりに、任意のシェル コマンドを引用符で囲むと、指定されたシグナル (この場合は INT) が生成されたときにそれが実行されます。
最後に、trap を再度実行して、-
「INT」ハンドラーをデフォルトのアクションに戻します。
さらに詳しい情報や例については、以下のリソースをご覧ください。
- bash トラップコマンドに関する Linuxjournal の記事トラップの使用例とさまざまなオプション間のニュアンスをいくつか示します
- トラップに関する MIT Confluence ページbash および tcsh シェルをカバーします
- シェル スクリプトでシグナルをキャッチしてエラーを処理するための「trap」の使用に関する初心者向けガイドは、キーボードから送信される他の信号を表示するだけでなく、
kill -l
すべての信号を表示してkill -l SIGNALNAME
その数値を見つけるために使用するなど、広範囲にわたります。