我编写了一个简单的脚本,应该将文件中的 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"
这设置IFS
为两个字符\
(反斜杠)和n
(小写字母 N)。这意味着稍后,read
将拆分它在其中任何一个上获得的输入。现在,示例中唯一带有 an 的行n
是and so on...
,但这足以查看结果。
你可能想使用
IFS=$'\n'
但正如评论中正确指出的那样,这也没有多大意义,因为read
只会读取以换行符结尾的一行,然后尝试使用换行符作为分隔符拆分为多个字段。后面的步骤就不会了。
如果要循环输入文件的行,请使用
while IFS= read -r line; do ...
或者如果您想将它们读入数组并循环遍历:
mapfile -t lines < ...
for line in "${lines[@]}"; do ...
但看为什么使用 shell 循环处理文本被认为是不好的做法?
另外,这有点可疑:
done <<< $(cat "./dl.txt")
一般来说,不带引号的扩展会将输出分割cat
成多个单词,但我认为单词分割不会发生在 的右侧<<<
。但它会发生在 a 的右侧<
(可能会因“不明确的重定向”而出错),所以我建议将其放在引号中。
或者仅使用流程替换:
... < <(cat "./dl.txt")
或者干脆把猫扔掉:
... < dl.txt
答案2
对于bash:
while read line; do
array+=(${line:10})
done < dl.txt
echo ${array[@]}