22
24

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 5 years have passed since last update.

| while read のwhileループ脱出にはbreakではなくexitを利用する(+それに関連するTips)

Last updated at Posted at 2017-05-13

| while readはbashプログラミングにおいてもっとも使われるイディオムのひとつですが、__このwhileループを脱出する際はbreakではなくexitを使います。__これはwhileがサブシェルになる影響――すなわちwhileから脱出するにはサブシェルを抜ける必要があります。

cat ${file} | while read line; do
    [[ "${line}" = "END" ]] && exit 0
done

シェルコマンドは終了ステータスを持ち、whileは通常0を返しますが、exitを明示した場合にはそのexitの引数が終了ステータスになります。以下のサンプルに示すように、この性質は多重ループの脱出などに利用すると便利です。ただし以下のサンプルでは-eオプション、つまり0以外の終了ステータスを検知するとシェル自体を終了してしまうオプションは利用できなくなります。

echo ${files[@]} | while read file; do
    cat ${file} | while read line; do
        [[ "${line}" = "END" ]] && exit 99
    done
    
    [[ $? -eq 99 ]] && exit 99
done

whileループ脱出にexitを利用するのは、パイプの流し込み先にwhileが指定されたときだけです。つまり単なるwhileループの脱出にはbreakを利用します。exitを利用すると、当然ですがシェル自体が終了してしまい、想定通りの動作を示しません。

while :; do
    do_something
    [[ $? - ne 0 ]] && break
done
22
24
1

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
22
24

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?