我正在写一个bash脚本,当我写这行时:
echo "l=l.split('\n')"
我希望输出实际上是l=l.split('\n')
,但得到:
l=l.split('
')
有关如何解决此问题的任何想法?我尝试在不同的地方使用引文并以不同的方式逃避字符,但似乎没有任何效果。感谢帮助!
**值得注意 - 如果我只是在终端中键入echo命令,我就得到了我想要的输出。不确定为什么脚本被区别对待。
答案 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可能提供bash
和sh
,但它们的行为也存在细微差别。如果您希望它的行为与终端中的行为相同,请务必使用#!/bin/bash
。
答案 1 :(得分:1)
<强> TL;博士强>
如果您的脚本确实是由bash
运行的,那么必须先启用默认的xpg_echo
shell选项 - 直接,或间接通过shell选项posix
当Bash被调用为posix
(sh
)时,/bin/sh
隐式启用,例如在macOS上发生。
如果您的脚本不由bash
运行,这是最有可能的解释,如FatalError's helpful answer中所述:< / p>
确保您的脚本的shebang行是
#!/bin/bash
或#!/usr/bin/env bash
。
或者,直接将其传递给bash
:bash <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')"