截断变量的值

截断变量的值

我编写了一个简单的脚本,应该将文件中的 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 的行nand 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[@]}

相关内容