sh
在 Debian 上链接到dash
.以下命令会生成两个空行:
sh -c 'echo "\n"'
为什么有两个空行?为什么没有一个呢?为什么\n
要解释呢?
然而,在 busybox 上,sh
相同的命令会生成以下行:
\n
sh
不同平台上的反斜杠处理是否有统一性?是否有任何标准规定必须处理反斜杠?
答案1
当使用 as 参数调用时,符合 POSIX+XSI 的echo
实现会输出 2 个换行符,\n
因为它要求它扩展\n
为换行符。echo
您的内置功能似乎sh
在这方面是兼容的。
即使 POSIX 要求输出 ,其他一些echo
实现也需要一个选项来实现这一点。 (这将在 POSIX 规范的未来版本中发生变化,其中行为将被未指定(除了那些实现 XSI 选项的系统))。-e
echo -e
-e
出于这些原因以及更多原因,最好避免echo
并使用printf
。看为什么 printf 比 echo 更好?了解详情。
无论如何,在所有类似 Bourne 的 shell 中,双引号内的\
字符仅在\
、$
和字符(其特殊含义被删除)和换行符(导致其被删除,"
是一个`
\<NL>
续行), 不是n
。所以在:
echo '\n'
echo "\n"
echo \\n
echo $'\\n'
它是由两个字符组成的字符串\
,并且n
被传递到echo
(至少当该代码不在`...`
最后两个字符内时)。
对于要传递的由一个换行符组成的字符串,您需要:
echo $'\n'
这就是 ksh93 语法,现在许多其他类似 Bourne 的 shell 都支持这种语法。可移植(在类似 Bourne 的 shell 中):
echo '
'
echo "
"
尽管你可能想要做到这一点:
# at the top of the script:
NL='
'
# or (with the Bourne shell, use `...` instead):
eval "$(printf 'NL="\n" CR="\r" TAB="\t"')"
# and then:
echo "$NL"
提高易读性。
请注意,在非 Bourne-like shell 中情况会有所不同。看如何像普通字符一样使用特殊字符?详细信息。