📢 Webサイト閉鎖と移転のお知らせ
このWebサイトは2026年9月に閉鎖いたします。
新しい記事は移転先で追加しております。(旧サイトでは記事を追加しておりません)
細 Wiki がページ「繰り返し文(シェルスクリプト)」を「シェルスクリプトの基礎 - 繰り返し文」に、リダイレクトを残さずに移動しました |
|||
| 201行目: | 201行目: | ||
条件にNULLコマンドである:(コロン)を指定すると、無限ループになる。<br> | 条件にNULLコマンドである:(コロン)を指定すると、無限ループになる。<br> | ||
NULLコマンド:は、何もせずに終了コード0(真)を返すので、条件が常に真となるため、無限ループになる。<br> | NULLコマンド:は、何もせずに終了コード0(真)を返すので、条件が常に真となるため、無限ループになる。<br> | ||
<br> | |||
無限ループを終了させるには、Ctrlキー + Cキーで強制的に終了させるか、<br> | 無限ループを終了させるには、Ctrlキー + Cキーで強制的に終了させるか、<br> | ||
処理部分でif文またはcase文などの条件分岐で、<code>break</code>、<code>return</code>、<code>exit</code>コマンドを実行する。<br> | |||
<source lang="sh"> | <source lang="sh"> | ||
while : | while : | ||
| 210行目: | 211行目: | ||
</source> | </source> | ||
<br> | <br> | ||
以下の例では、無限ループにcase文(条件分岐)を組み込んでいる。<br> | |||
<br> | <br> | ||
<code>Repeat? (y/n) :</code>を表示した後、[y]キーを入力すると"Repeat!"と表示して処理が繰り返され、<br> | |||
[n]キーを入力すると、<code>Repeat end.</code>と表示して処理を終了させる。<br> | |||
<br> | <br> | ||
[y]キーまたは[n]キー以外のキーを入力すると、<code>Push y or n key.</code>と表示する。<br> | |||
その後、[y]キーまたは[n]キーのいずれかを入力するように促すメッセージを表示して、処理を繰り返す。<br> | |||
<source lang="sh"> | <source lang="sh"> | ||
#!/bin/bash | #!/bin/bash | ||
| 239行目: | 240行目: | ||
Repat? (y/n) :n ← nキーを入力 | Repat? (y/n) :n ← nキーを入力 | ||
Repeat end. | Repeat end. | ||
<br><br> | |||
== continueコマンド == | |||
continueコマンドを実行することにより、以降の処理をスキップして、ループの先頭に移動することができる。<br> | |||
また、breakコマンドと同様に、引数を指定することにより、ネストされたループ処理を一気にスキップすることも可能である。<br> | |||
<source lang="sh"> | |||
while 条件式 | |||
do | |||
… | |||
continue | |||
… | |||
done | |||
</source> | |||
<br> | |||
以下の例では、continueコマンドに引数を渡して、ネストされたループを一気にスキップしている。<br> | |||
<source lang="sh"> | |||
#!/bin/bash | |||
# 最初のexitコマンド回避用フラグ | |||
SKIP="ON" | |||
while : | |||
do | |||
if [ "$SKIP" != "ON" ]; then | |||
echo "continue 2 が実行されました." | |||
exit 0 | |||
fi | |||
# 以降のループでは上の処理をスキップしない | |||
SKIP="" | |||
while : | |||
do | |||
if [ "$CNT" = "ON" ]; then | |||
echo "continue が実行されました." | |||
continue 2 | |||
fi | |||
# continue フラグを立てる | |||
CNT="ON" | |||
continue | |||
# continue フラグをオフにする | |||
CNT="" | |||
done | |||
done | |||
</source> | |||
<br> | |||
上記の例の実行結果は、以下の通りである。<br> | |||
<br> | |||
最初のメッセージは、変数CNTにフラグを立てた後、continueコマンドを実行するために出力している。<br> | |||
次に、continue 2が実行されて、処理が1つ上のwhile文の先頭に移動する。<br> | |||
変数SKIPは、2段目の繰り返し処理に入る直前でオフにするので、continue 2コマンドを実行した後、メッセージを出力して終了する。<br> | |||
continue が実行されました. | |||
continue 2 が実行されました. | |||
<br><br> | |||
== 多重ループの制御 == | |||
<code>break</code>コマンドおよび<code>continue</code>コマンドは、数値を指定することにより、ネストされた多重ループを越えた移動ができる。<br> | |||
つまり、指定した数値の分だけ、上の階層のループを対象に実行される。<br> | |||
引数を省略した場合は、1を指定した場合と同じ動作になる。<br> | |||
break <数値> | |||
continue <数値> | |||
<br> | |||
以下の例では、<code>break</code>コマンドに2を指定して実行することにより、2重ループを一気に抜けている。<br> | |||
同様に、2重ループの先頭(1つ目のwhile文の先頭)に戻る場合は、<code>continue</code>コマンドの引数に2を指定して実行する。<br> | |||
<source lang="sh"> | |||
while : # 1つ目のループ | |||
do | |||
... | |||
while : # 2つ目のループ | |||
do | |||
... | |||
# 1つ目のwhile文の先頭に戻る | |||
continue 2 | |||
... | |||
# 1つ目のwhile文から抜ける | |||
break 2 | |||
... | |||
done | |||
done | |||
</source> | |||
<br><br> | <br><br> | ||
__FORCETOC__ | __FORCETOC__ | ||
[[カテゴリ:シェルスクリプト]] | [[カテゴリ:シェルスクリプト]] | ||