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


106

我在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命令本身的方式。

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


3
它们很好地保留在变量中(最后一个除外);是您的回音被破坏了。参见mywiki.wooledge.org/BashPitfalls条目#14
Charles Duffy

1
另外,don't存放commands在中variablesUse一个function替代
汉·索罗

Answers:


207

引用您的变量。原因如下:

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

$ echo $f
fafafda adffd adfadf adfafd afd

$ echo "$f"
fafafda
adffd
adfadf
adfafd
afd

不带引号的外壳将替换$TEMP为其包含的字符(其中之一是换行符)。然后,在调用echoshell之前,使用Internal Field Separator(IFS)将该字符串拆分为多个参数,然后将所得的参数列表传递给echo。默认情况下,IFS设置为空白(空格,制表符和换行符),因此Shell将您的$TEMP字符串切成参数,并且永远不会看到换行符,因为Shell会将其视为分隔符,就像空格一样。


xdotool type "$myVar"不起作用。它仍在键入变量的内容而没有

如果您想做类似的事情怎么办FOO="$(echo $VAR)"$VAR当它已经包含在引号中时,如何正确报价?
weberc2

@ weberc2您只需再次引用:"$(echo "$VAR")"。是的,解析起来很奇怪,但是对于Shell来说,显然比对我们来说更容易。
OJFord

3

我遇到了同样的问题,引用会有所帮助

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

2
在将近5年后回答一个问题而不在先前的回答中添加任何新的细节或提供新的解决方案并不是一个好主意;请避免发布此类答案。
MAChitgarha

1
喜欢您的“近5年”的精确度,@ MAChitgarha,:)
Neil Gatenby
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.