私はファイルのURL文字列のリストを変数として読み、将来の処理のために準備する簡単なスクリプトを書いています。
dl.txtファイルの内容:
https://some-url.com/site1
https://some-url.com/site2
and so on...
スクリプト:
#!/bin/bash
IFS="\n"
while read -a line; do
rl=.${line}
echo -e "\n"
echo $rl
echo -e "\n"
# for a in ${line}; do
# echo -e $a
# done
done <<< $(cat "./dl.txt")
その結果、読み取った文字列の各文字は最初から正確に10文字に切り捨てられます。
問題を解決する方法をご存知ですか?
答え1
IFS="\n"
これはバックスラッシュと(小文字のN)のIFS
2文字に設定されます。これは、後でそのうちの1つへの入力が分割されることを意味します。これで、例にある唯一の行はありますが、結果を見るのに十分です。\
n
read
n
and so on...
使いたいかもしれません
IFS=$'\n'
しかし、コメントで正しく指摘したように、これはread
改行文字で終わる1行だけを読み、改行文字を区切り文字として複数のフィールドに分割しようとするので意味がありません。次のステップは機能しません。
入力ファイルの行を繰り返すには、次のようにします。
while IFS= read -r line; do ...
または配列として読んで繰り返したい場合:
mapfile -t lines < ...
for line in "${lines[@]}"; do ...
しかし見てくださいシェルループを使用してテキストを処理するのはなぜ悪い習慣と見なされますか?
また、これは少し受賞しています。
done <<< $(cat "./dl.txt")
通常、引用符なしで拡張すると、出力は単語cat
に分割されますが、右側では単語分割が発生しないようです<<<
。ただし、これはa(「あいまいなリダイレクト」によってエラーが発生する可能性があります)の右側で発生するため、引用符で<
囲むことをお勧めします。
または、単にプロセス置換を使用してください。
... < <(cat "./dl.txt")
またはちょうど猫を捨ててください:
... < dl.txt
答え2
バッシュの場合:
while read line; do
array+=(${line:10})
done < dl.txt
echo ${array[@]}