echo换行符字符输出

时间:2014-03-26 21:44:29

标签: bash shell echo newline

我正在写一个bash脚本,当我写这行时:

echo "l=l.split('\n')"

我希望输出实际上是l=l.split('\n'),但得到:

l=l.split(' ')

有关如何解决此问题的任何想法?我尝试在不同的地方使用引文并以不同的方式逃避字符,但似乎没有任何效果。感谢帮助!

**值得注意 - 如果我只是在终端中键入echo命令,我就得到了我想要的输出。不确定为什么脚本被区别对待。

3 个答案:

答案 0 :(得分:2)

听起来好像你得到了shebang错误(对于bash脚本,无论如何)。举个例子:

$ cat test.sh
#!/bin/sh

echo "l=l.split('\n')"
$ ./test.sh
l=l.split('
')
$ cat test.bash
#!/bin/bash

echo "l=l.split('\n')"
$ ./test.bash
l=l.split('\n')

即使某些系统上的同一个shell可能提供bashsh,但它们的行为也存在细微差别。如果您希望它的行为与终端中的行为相同,请务必使用#!/bin/bash

答案 1 :(得分:1)

<强> TL;博士

  • 如果您的脚本确实是由bash 运行的,那么必须先启用默认的xpg_echo shell选项 - 直接,或间接通过shell选项posix 当Bash被调用为posixsh)时,/bin/sh 隐式启用,例如在macOS上发生。

  • 如果您的脚本bash 运行,这是最有可能的解释,如FatalError's helpful answer中所述:< / p>

    • 确保您的脚本的shebang行是
      #!/bin/bash#!/usr/bin/env bash

    • 或者,直接将其传递给bashbash <script>

  • 可移植解决方案,可以保护您免受变量echo行为的影响,使用printf,如下所示:

    printf '%s\n' "l=l.split('\n')"
    

可选背景信息

bash中,\n的{​​{1}}转义序列的解释默认为关闭。

必须启用选项echo才能让xpg_echo 识别转义序列。

如果您在POSIX兼容模式下运行echo (与bash验证),则此选项隐含也会发生如果您将Bash作为shopt -o posix 运行,例如 macOS ,则sh为Bash。

请注意,无论/bin/sh本身的状态如何,您都可以选择xpg_echo ad-hoc进行转义序列解释,然后选择退出echo -e

但是,在POSIX兼容模式(echo -E中运行时 无法正常工作,其中 - 符合POSIX - {{1根本不支持任何选项

换句话说:以下情况仅在(a)您的脚本真正由shopt -o posix执行且(b)选项echo 关闭时才有效:

bash

同样, posix可移植POSIX-compliant alternative 在所有与POSIX兼容的shell中一致运行,无论状态如何shell选项

echo -E "l=l.split('\n')"

答案 2 :(得分:0)

这解决了这个问题。

echo "l=l.split('\\\n')"