在Bash中连接两个字符串变量并加入换行符

32

我有一个变量final_list,在循环中通过变量url追加其内容,代码如下:

while read url; do
    final_list="$final_list"$'\n'"$url"
done < file.txt

令我惊讶的是,\n 被添加为一个空格,因此结果如下:
url1 url2 url3

当我想要:

url1
url2
url3

出了什么问题?

3个回答

35

变量"$final_list"中有很多换行符。如果要使用双引号echo它,请像这样打印:

echo "$final_list"
url1
url2
url3

或者更好地使用printf

printf "%s\n" "$final_list"
url1
url2
url3

谢谢。你能解释一下正在发生什么吗? - Aman Deep Gautam
3
在Unix shell中,引号的使用非常重要。如果没有引号,shell不会应用任何扩展规则,并将换行符视为空格。 - anubhava
4
$final_list 展开后,任何空格(包括换行符)都被视为单词分隔符,而不是要打印的字面字符。echo 命令只接收 3 个参数,即实际的 URL。加上引号后,echo 收到的是一个参数,即包含 URL 和分隔它们的换行符的字符串。 - chepner

2

这可能取决于您尝试如何显示最终结果。请尝试在双引号内输出结果变量:

echo "$final_list"

1

如果有人想尝试,可以添加另一种可能的选项。

使用字符串值:

命令:echo "这是我想在下一行打印的字符串" | tr " " "\n"

输出:

This
is
the
string
I
want
to
print
in
next
line

使用变量:

finallist="url1 url2 url3"          
url="url4 url5"                     
echo "$finallist $url" | tr " " "\n"

输出:

url1
url2
url3
url4
url5

如果您想让一行中有几个单词,下一行有几个单词,请尝试使用不同的分隔符(例如-、:、;等)。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接