繁体   English   中英

回声换行符输出

[英]echo newline character output

我正在编写bash脚本,并且在编写该行时:

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

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

l=l.split(' ')

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

**值得一提-如果我只是在终端中键入echo命令,我将得到所需的输出。。不确定为什么要对脚本进行不同的处理。

听起来好像您把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')

即使在某些系统上bashsh可以由同一shell提供,它们的行为也存在细微的差异。 如果您希望它的行为像在终端机中一样,请确保使用#!/bin/bash

TL;博士

  • 如果您的脚本实际上是由bash运行的 ,则必须打开默认关闭的xpg_echo shell选项-直接或通过shell选项posix xpg_echo
    当Bash作为sh/bin/sh )调用时, posix隐式打开的,例如在macOS上。

  • 如果您的脚本不是bash运行 ,这是最可能的解释,如FatalError的有用答案中所建议:

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

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

  • 可移植的解决方案可以使您免受可变的echo行为的影响,它可以按以下方式使用printf

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

可选背景信息

bash ,默认情况下将关闭echo对转义序列(例如\\n的解释。

必须打开选项xpg_echo才能使echo识别转义序列

如果以POSIX兼容模式运行bash (使用shopt -o posix验证), 选项隐式启用,如果 sh身份运行Bash ,例如在macOS上 ,例如/bin/sh是Bash,则也会发生这种情况。

请注意,无论xpg_echo本身是什么状态, 都可以使用echo -e临时选择转义序列解释,并使用echo -E选择退出

然而, 在POSIX兼容模式(运行时,这不起作用 shopt -o posix符合POSIX - - ),其中echo支持没有任何选项

换句话说:仅当(a) bash确实在执行您的脚本并且(b) posix选项为off时,以下内容才有效

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

同样, printf可移植的 ,与POSIX兼容的替代方案可在所有与POSIX兼容的shell中一致地工作,而与shell选项的状态无关

# '%s\n': *without* escape-sequence interpretation
$ printf '%s\n' "l=l.split('\n')"
l=l.split('\n')

# '%b\n': *with* escape-sequence interpretation
$ printf '%b\n' "l=l.split('\n')"
l=l.split('
')

这样就解决了问题。

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM