在将命令输出存储到变量时如何保留换行符?

How to preserve line breaks when storing command output to a variable?

提问人:Dave 提问时间:3/1/2014 最后编辑:ivanleonczDave 更新时间:8/10/2023 访问量:124101

问:

我在 Linux 上使用 bash shell。我有这个简单的脚本......

#!/bin/bash

TEMP=`sed -n '/'"Starting deployment of"'/,/'"Failed to start context"'/p' "/usr/java/jboss/standalone/log/server.log" | tac | awk '/'"Starting deployment of"'/ {print;exit} 1' | tac`
echo $TEMP

但是,当我运行此脚本时

./temp.sh

打印的所有输出均不带回车符/换行符。不确定这是我将输出存储到$TEMP的方式,还是 echo 命令本身。

如何将命令的输出存储到变量中并保留换行符/回车符?

Linux Bash Shell 换行符

评论

9赞 Charles Duffy 3/1/2014
它们很好地保留在变量中(最后一个除外);是你的回声坏了。请参阅 mywiki.wooledge.org/BashPitfalls 条目 #14
1赞 han solo 8/26/2019
此外,请存储在 . 而是don'tcommandsvariablesUsefunction

答:

496赞 jaypal singh 3/1/2014 #1

使用 shell 脚本时,需要始终引用变量,尤其是在处理字符串时。

下面是该问题的示例:

示例变量:

$ f="fafafda
> adffd
> adfadf
> adfafd
> afd"

不带引号变量的输出:

$ echo $f
fafafda adffd adfadf adfafd afd

输出 WITH 引用变量:

$ echo "$f"
fafafda
adffd
adfadf
adfafd
afd

说明:

如果不带引号,shell 将替换为其包含的字符(其中一个是换行符)。然后,在调用 shell 之前,使用 (IFS) 将该字符串拆分为多个参数,并将生成的参数列表传递给 。默认情况下,the 设置为空格(空格、制表符和换行符),因此 shell 将字符串切成参数,并且永远不会看到换行符,因为 shell 将其视为分隔符,就像空格一样。$TEMPechoInternal Field SeparatorechoIFS$TEMP

评论

0赞 azerafati 4/27/2017
xdotool type "$myVar"不起作用。它仍在键入变量的内容,而不带换行符
0赞 weberc2 1/6/2019
如果你想做这样的事情怎么办?当它已经在引号内时,你如何正确引用?FOO="$(echo $VAR)"$VAR
2赞 OJFord 6/7/2019
@weberc2 你只需再引用一遍:.是的,解析起来很奇怪,但显然对 shell 来说比对我们来说更容易。"$(echo "$VAR")"
11赞 Bob 2/14/2019 #2

我遇到了同样的问题,报价会有所帮助

ubuntu@host:~/apps$ apps="abc
> def"
ubuntu@host:~/apps$ echo $apps
abc def
ubuntu@host:~/apps$ echo "$apps"
abc
def

评论

23赞 MAChitgarha 8/9/2020
将近 5 年后回答一个问题,而不在以前的答案中添加任何新的细节或提供新的解决方案不是一个好主意;请避免发布此类答案。
6赞 Neil Gatenby 11/10/2020
喜欢你“将近 5 年”的精确度,@MAChitgarha,:)