【问题标题】:How to echo multi lined strings in a Bourne shell [duplicate]如何在 Bourne shell 中回显多行字符串 [重复]
【发布时间】:2012-05-21 22:17:21
【问题描述】:

我想创建一些脚本来填充一些模板并将它们插入到我的项目文件夹中。我想为此使用一个 shell 脚本,并且模板非常小,所以我想将它们嵌入到 shell 脚本中。问题是echo 似乎忽略了我的字符串中的换行符。要么,要么字符串不包含开头的换行符。这是一个例子:

MY_STRING="
Hello, world! This
Is
A
Multi lined
String."

echo -e $MY_STRING

这个输出:

你好,世界!这是一个多行字符串。

我假设echo 是这里的罪魁祸首。我怎样才能让它承认换行符?

【问题讨论】:

  • 这实际上是一个 Bourne shell 问题(不是特定于 bash)。您介意相应地编辑标题吗?
  • Jens:大胆一点,您可以自己进行这些编辑(就像我刚才所做的那样)。
  • @tripleee:只是想表现得很好,而不是踩到任何人的脚趾。我会去的。

标签: echo sh multiline


【解决方案1】:

变量插值需要双引号。

 echo -e "$MY_STRING"

这是一个非常常见的错误。您应该养成始终引用字符串的习惯,除非您特别需要拆分为空格分隔的标记或扩展通配符。

所以明确地说,shell 在解析你的命令行时会规范化空格。如果你编写一个简单的 C 程序打印出它的 argv 数组,你可以看到这一点。

argv[0]='Hello,'
argv[1]='world!'
argv[2]='This'
argv[3]='Is'
argv[4]='A'
argv[5]='Multi'
argv[6]='lined'
argv[7]='String.'

相比之下,使用引号,整个字符串在argv[0],换行符和所有。

对于它的价值,还可以考虑这里的文档(cat,而不是echo):

cat <<"HERE"
foo
Bar
HERE

您还可以在此处的文档中插入变量。

cat <<HERE
$MY_STRING
HERE

...虽然在这种特殊情况下,它几乎不是你想要的。

【讨论】:

  • 很酷,但是在我将您的答案标记为正确之前,您能解释一下为什么吗?编辑:哦,对了,我现在明白了。我忘记了 Bash 不像其他脚本语言那样传递字符串
  • 通知编辑。希望这会有所帮助。
【解决方案2】:

echo 真是九十年代了。 The new (POSIX) kid on the block is printf.

 printf '%s\n' "$MY_STRING"

没有-e 或 SYSV 与 BSD 回显的疯狂,以及完全控制打印内容的位置和宽度,以及 C 中的转义序列。每个人都请立即开始使用 printf,永远不要回头。

【讨论】:

  • +1,printf 有更多方便的格式
  • 我喜欢 bash 中的 printf 如何忠实于 C 语言中 printf 的精神。它功能丰富且健壮,令人惊讶。
  • @Yokai 更好的是,它不是 bash 的东西。任何 shell 都可以使用此实用程序(但 shell 可以将其实现为内置)。
【解决方案3】:

试试这个:

echo  "$MY_STRING"

【讨论】:

    猜你喜欢
    • 2010-09-16
    • 2015-12-21
    • 1970-01-01
    • 1970-01-01
    • 2017-01-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多