Go to the first, previous, next, last section, table of contents.

continue

continue文はbreakと似ていますが、forwhile、およびdo-whileループ内だけで使われます。これは、ループ本体の残りの部分をスキップし、ループの次の繰り返しを直ちに開始します。ループから完全に脱出してしまうbreakと比べてみてください。次に例を示します。

# print names that don't contain the string "ignore"

# first, save the text of each line
{ names[NR] = $0 }

# print what we're interested in
END {
   for (x in names) {
       if (names[x] ~ /ignore/)
           continue
       print names[x]
   }
}

この例は、入力レコードの1つに文字列`ignore'が含まれている場合、そのレコードについてはprint文をスキップし、ループの最初の文に戻って処理を続けます。

この例は、continueの良い例ではありません。このループは次のように簡単に書けるからです。

for (x in names)
  if (names[x] !~ /ignore/)
    print names[x]

forループ内でcontinue文を使うと、ループ本体の残りがスキップされ、for文のインクリメント式から実行が再開されます。次のプログラムでこれを説明します。

awk 'BEGIN {
     for (x = 0; x <= 20; x++) {
         if (x == 5)
             continue
         printf ("%d ", x)
     }
     print ""
}'

このプログラムは、5を除く0〜20までの数をすべて表示します。5の場合、printfをスキップします。インクリメントx++はスキップされないので、xは5のままではありません。上のforループと次のwhileループを比べてみましょう。

awk 'BEGIN {
     x = 0
     while (x <= 20) {
         if (x == 5)
             continue
         printf ("%d ", x)
         x++
     }
     print ""
}'

このプログラムは、xが5になると永久にループします。


Go to the first, previous, next, last section, table of contents.