This
STR="Hello\nWorld"
echo $STR
作为输出产生
Hello\nWorld
而不是
Hello
World
我应该做什么有一个换行在字符串?
注意:此问题与echo无关。 我知道echo -e,但我正在寻找一种解决方案,允许传递一个字符串(其中包括换行符)作为参数到其他命令,没有类似的选项来解释\n的换行符。
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!