0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

Bashにおけるforループとwhileループの違いについて

Last updated at Posted at 2024-11-14

概要

forループで、下記のようにcsvファイルからリストを格納しようとすると、行が分割されてしまい上手く格納できなかったのでchatgptに聞いてみた。

for list in `cat list.csv`
do
 LINE=`echo $list |awk -F, ‘{print $2}’`
 echo $LINE
done

下記に回答を転載する。

for ループと while ループで異なる動作が起きる理由は、シェルの構造とテキストの処理方法の違いによります。

1. for ループの場合

for ループでは、次のように cat list.csv の出力全体が一度に読み込まれ、空白(改行も含む)で分割されます。そのため、各行を個別に扱うというより、各「単語」を処理してしまいます。

for item in `cat list.csv`
do
  echo $item
done

例えば、list.csv に改行が含まれていると、for ループが改行を区切り文字と解釈せず、各行を連続した単語として扱ってしまいます。その結果、1行ごとではなく、カンマやスペースなどで区切られたすべての単語が順に処理されてしまいます。

2. while ループと < file の使用

一方、while ループで < list.csv のようにファイルリダイレクトを使うと、シェルが list.csv の内容を行単位で読み込み、各行を順番に read コマンドに渡します。

while IFS=, read -r col1 col2 col3; do
  echo "$col2"
done < list.csv

この方法では、改行ごとに1行ずつ処理されるので、1行ずつ正しく読み取れるわけです。

まとめ

  • for ループ:単語単位で処理するため、行ごとに扱えない。
  • while ループ + read:行単位で処理できるため、CSVなどの行ごとのデータ処理に適している。
    このような理由から、行単位の処理が必要な場合は while ループを使うのが一般的です。
0
0
2

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
0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?