クマの手も借りたい
茶トラネコ(@kumanotemo)です。上場を控えたITベンチャーを2社も退職してフリーランスの道を選んだ放浪エンジニアです。
Linux

シェルスクリプトでファイルを1行ずつ読み込む

シェルスクリプトで、ファイルに書かれた内容を 1 行ずつ処理したいケースってたまにありますよね。

いくつか方法はあるのですが、ファイルの容量や書きやすさなど好みに応じて使い分けてみるのが良さそうです。

今回は 3 パターンの方法を紹介したいと思います。

ファイルからの標準入力を読み込む

以下のように、1 行ごとにアルファベットが書かれたファイルを作成します。

$ vi saratoga.txt

A
B
C
D
E

このアルファベットを 1 行ずつ画面に出力してみます。ファイルの内容を標準入力で while に受け渡します。

$ vi run.sh

#!/bin/sh

while read line; do
  echo "alphabet: $line"
done < saratoga.txt

実行してみます。

$ sh run.sh

alphabet: A
alphabet: B
alphabet: C
alphabet: D
alphabet: E

catした内容を標準入力として読み込む

ファイルの内容を cat で標準出力し、それを標準入力で while に受け渡します。

$ vi run.sh

#!/bin/sh

cat saratoga.txt | while read line; do
  echo "alphabet: $line"
done

実行してみます。

$ sh run.sh

alphabet: A
alphabet: B
alphabet: C
alphabet: D
alphabet: E

ファイルの内容を変数に格納して読み込む

ファイルの内容を変数に格納し、それを標準入力で while に受け渡します。

$ vi run.sh

#!/bin/sh

saratoga=`cat abc.txt`

while read line; do
  echo "alphabet: $line"
done << EOL
$saratoga
EOL

実行してみます。

$ sh run.sh

alphabet: A
alphabet: B
alphabet: C
alphabet: D
alphabet: E

ちなみに、ロジック内の「EOL」はヒアドキュメントの開始と終了に使っている文字列で、特に「EOL」である必要はありません。

今回は End Of Line のつもりで EOL としています。SQL なら EOQ(End Of Query)とか。

完全に個人の好みですので、ヒアドキュメントを使う際は好きな文字列を使ってください。

ある程度、意味が通りそうな範囲でね。

まとめ

今回は、ファイルを読み込む方法を 3 つ紹介しましたが、特に指定がない限りはどれを使っても問題ありません。

プロジェクトなどで、他のソースと統一しておいた方がいいなっと思う場合は既存のソースにあわせておきましょう。

どれが正解というわけではないのですが、「標準入力のリダイレクト」「パイプ」「ヒアドキュメント」など、それぞれがどのようなものか理解しておくのもいいですね。

昔、上辺の知識でファイルディスクリプタについて勉強会で発表して、ボコボコに叩かれた嫌な記憶が思い起こされますが・・・orz

現場のプロから学ぶSEO技術

SEO について詳しくないけどこれから学んでみたい方。

これまでの小手先の SEO に対する技術には詳しいけど、マーケティングやソーシャル要素を組み合わせた今時の SEO をもう一度勉強してみたい方にオススメです。

あなたにオススメ