我想写一些预定义的文本与以下文件:

text="this is line one\n
this is line two\n
this is line three"

echo -e $text > filename

我期待的是这样的:

this is line one
this is line two
this is line three

但我明白了:

this is line one
 this is line two
 this is line three

我确信在每个\n之后没有空间,但额外的空间是如何出来的?


当前回答

下面是我喜欢的方式来分配一个多行字符串的变量(我认为它看起来不错)。

read -r -d '' my_variable << \
_______________________________________________________________________________

String1
String2
String3
...
StringN
_______________________________________________________________________________

在这两种情况下,下划线的数量是相同的(这里是80)。

其他回答

对于这个目的,Heredoc听起来更方便。它用于向命令解释器程序(如ex或cat)发送多个命令

cat << EndOfMessage
This is line 1.
This is line 2.
Line 3.
EndOfMessage

<<后面的字符串表示停止的位置。

要将这些行发送到文件,请使用:

cat > $FILE <<- EOM
Line 1.
Line 2.
EOM

你也可以将这些行存储到一个变量中:

read -r -d '' VAR << EOM
This is line 1.
This is line 2.
Line 3.
EOM

这将行存储到名为VAR的变量中。

打印时,请记住变量周围的引号,否则将看不到换行符。

echo "$VAR"

更好的是,您可以使用缩进使它在代码中更加突出。这一次,只需在<<后添加一个-来阻止选项卡出现。

read -r -d '' VAR <<- EOM
    This is line 1.
    This is line 2.
    Line 3.
EOM

但是在代码中必须使用制表符而不是空格来缩进。

或者用空格保持文本缩进:

#!/bin/sh

sed 's/^[[:blank:]]*//' >filename <<EOF
    this is line one
    this is line two
    this is line three
EOF

相同但使用变量:

#!/bin/sh

text="$(sed 's/^[[:blank:]]*//' << whatever
    this is line one
    this is line two
    this is line three
)"

echo "$text" > filename

;-)

如果你把它放在下面,它就会工作:

AA='first line
\nsecond line 
\nthird line'
echo $AA
output:
first line
second line
third line

在bash脚本中,以下工作:

#!/bin/sh

text="this is line one\nthis is line two\nthis is line three"
echo -e $text > filename

另外:

text="this is line one
this is line two
this is line three"
echo "$text" > filename

Cat文件名给出:

this is line one
this is line two
this is line three

我听到这个答案,但也想把它输送到另一个命令。给出的答案是正确的,但如果有人想要管道它,您需要在像这样的多行字符串之前管道它

echo | tee /tmp/pipetest << EndOfMessage
This is line 1.
This is line 2.
Line 3.
EndOfMessage

这将允许您拥有多行字符串,但也可以将其放在后续命令的stdin中。