はじめに
テキストファイルの中身を1行ずつ読み込んで処理するシェルスクリプトを書いたときに、意図しない動作になり解決に至ったので記事にします。
(めちゃくちゃ初歩的な内容です)
結論
/\/\/\/\/\/\/\/\/\/\/\/\
< >
< 読み込むファイルの改行コードをLF
にしよう! >
< >
\/\/\/\/\/\/\/\/\/\/\/\/
環境
Windows11
Git bash
VS Code(ファイルの作成、改行コードの確認、変更に使用)
再現
読み込んだ内容をそのまま表示
for id in $(cat ids.txt); do echo $id; done
ids.txt(CRLF)
1234
2345
3456
結果
1234
2345
3456
ここまでは問題ない
読み込んだ内容を文字列内に埋め込んで表示
for id in $(cat ids.txt); do echo "\"$id\""; done
ids.txt(CRLF)
1234
2345
3456
結果
"1234
"2345
"3456"
出力結果がおかしくなる
while read
に変えてみる
while read id; do echo "\"$id\""; done < ids.txt
ids.txt(CRLF)
1234
2345
3456
結果
"1234
"2345
"3456"
これでも変わらない
原因
特に調べたりしたわけではなく何となく思いついただけなのですが、原因はids.txt
の改行コードがCRLF
だったからでした。
for id in $(cat ids.txt); do echo "\"$id\""; done
ids.txt(LF)
1234
2345
3456
結果
"1234"
"2345"
"3456"
改行コードをLF
になおすとfor
でもwhile
でもうまくいきました。