将多行字符串在bash中输出到文件

15

我想在我的Bash脚本中将带有换行符的文本输出到文件中。 我可以只做 echo -e "line1 \n line2 \n" 但是当文本变得非常长时,它会变得难以阅读。 相反,我尝试使用换行符执行以下操作:

echo -e "[general]\
    state_file = /var/lib/awslogs/agent-state\
    [/var/log/messages]\
    file = /var/log/messages\
    log_group_name = /var/log/messages\
    log_stream_name = {ip_address}\
    datetime_format = %b %d %H:%M:%S\

然而,在插入文本时,没有换行符,因此整个文本都在同一行上。是否有办法在保持可读性的同时使用换行符回显文本?


1
移除行末的反斜杠 - anubhava
1个回答

27

如果你想使用 echo,只需要这样做:

echo '[general]
state_file = /var/lib/awslogs/agent-state
[/var/log/messages]
file = /var/log/messages
log_group_name = /var/log/messages
log_stream_name = {ip_address}
datetime_format = %b %d %H:%M:%S'

即将整个字符串用引号括起来,不要尝试转义换行符。看起来你不想在字符串中扩展任何shell参数,所以使用单引号。

另一种常见的方法是使用heredoc:

cat <<EOF
[general]
state_file = /var/lib/awslogs/agent-state
[/var/log/messages]
file = /var/log/messages
log_group_name = /var/log/messages
log_stream_name = {ip_address}
datetime_format = %b %d %H:%M:%S
EOF

请注意,在此情况下将展开shell参数。使用bash,您可以在第一行使用<<'EOF'而不是<<EOF来避免这种情况。


请注意:在双引号内,shell参数也会被扩展。 - YakovL
2
那个有用!<<'EOF' 谢谢! - f b

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