This

STR="Hello\nWorld"
echo $STR

作为输出产生

Hello\nWorld

而不是

Hello
World

我应该做什么有一个换行在字符串?

注意:此问题与echo无关。 我知道echo -e,但我正在寻找一种解决方案,允许传递一个字符串(其中包括换行符)作为参数到其他命令,没有类似的选项来解释\n的换行符。


当前回答

问题不在于外壳。问题实际上出在echo命令本身,以及变量插值时缺少双引号。您可以尝试使用echo -e,但并非所有平台都支持它,这也是现在推荐使用printf的原因之一,因为它具有可移植性。

您还可以尝试直接在shell脚本中插入换行符(如果您正在编写脚本),因此它看起来像…

#!/bin/sh
echo "Hello
World"
#EOF

或者同样的

#!/bin/sh
string="Hello
World"
echo "$string"  # note double quotes!

其他回答

我不是bash专家,但这个对我来说很管用:

STR1="Hello"
STR2="World"
NEWSTR=$(cat << EOF
$STR1

$STR2
EOF
)
echo "$NEWSTR"

我发现这更容易格式化文本。

在单引号'…\n…,但是双引号不能用。

$ echo $'Hello\nWorld'
Hello
World
$ echo $"Hello\nWorld"
Hello\nWorld

在我的系统(Ubuntu 17.10)上,你的例子就像预期的那样工作,无论是从命令行输入(到sh)还是作为sh脚本执行:

[bash]§ sh
$ STR="Hello\nWorld"
$ echo $STR
Hello
World
$ exit
[bash]§ echo "STR=\"Hello\nWorld\"
> echo \$STR" > test-str.sh
[bash]§ cat test-str.sh 
STR="Hello\nWorld"
echo $STR
[bash]§ sh test-str.sh 
Hello
World

我想这回答了你的问题:它就是有效。(我没有试图弄清楚诸如在sh中换行符替换\n的具体时间)。

然而,我注意到这个脚本在使用bash执行时会表现不同,而是会打印出Hello\nWorld:

[bash]§ bash test-str.sh
Hello\nWorld

我已经设法获得所需的输出与bash如下:

[bash]§ STR="Hello
> World"
[bash]§ echo "$STR"

注意$STR周围的双引号。如果保存并作为bash脚本运行,则行为相同。

下面也给出了期望的输出:

[bash]§ echo "Hello
> World"

这并不理想,但我已经编写了大量代码,并以类似于问题中使用的方法定义了字符串。被接受的解决方案要求我重构大量代码,因此,我将每个\n替换为“$'\n'”,这对我来说很有效。

问题不在于外壳。问题实际上出在echo命令本身,以及变量插值时缺少双引号。您可以尝试使用echo -e,但并非所有平台都支持它,这也是现在推荐使用printf的原因之一,因为它具有可移植性。

您还可以尝试直接在shell脚本中插入换行符(如果您正在编写脚本),因此它看起来像…

#!/bin/sh
echo "Hello
World"
#EOF

或者同样的

#!/bin/sh
string="Hello
World"
echo "$string"  # note double quotes!