kanta's spike

シェルスクリプトで、URL一覧ファイルから各URL行を取得し処理を行いたい。

解決策

url.txtというテキストファイルにURL一覧が記載されている場合、 以下のように標準入力へリダイレクトさせることで、各行を取得できる。

while read url
do
    echo $rul
done < url.txt

例: ファイルの最終行に改行がある場合

url.txt の内容が以下の場合、

% cat url.txt
URL1
URL2
URL3
%

以下のシェルスクリプトで、各行を処理できる。

% while read url
while> do
while>    echo $url
while> done < url.txt
URL1
URL2
URL3
%

例: ファイルの最終行に改行がない場合

url_with_eol.txt の内容が以下のように 最終行に改行がない場合、

% cat url_with_eol.txt
URL1
URL2
URL3%

以下のシェルスクリプトを実行すると、最終行が処理されない。

% while read url
while> do
while>    echo $url
while> done < url_with_eol.txt
URL1
URL2
%

これは、readは行内にファイルの終端があるとFALSEを返すためらしい。

回避策は2つある。

  • ファイルの最終行に必ず改行を入れる
  • シェルスクリプトのwhile文の条件を変更する

回避策: シェルスクリプトのwhile文の条件を変更する

while文の条件に、|| [ -n "${url}"]を追加し、 readFALSEを返しても、urlに1文字以上あれば、処理を行うように修正する。

% while read url || [ -n "${url}"]
while> do
while>    echo $url
while> done < url_with_eol.txt
URL1
URL2
URL3
%

参考

作成日: 2023/02/08