sh 如何解释双引号中的反斜杠?

sh 如何解释双引号中的反斜杠?

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 选项的系统))。-eecho -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 中情况会有所不同。看如何像普通字符一样使用特殊字符?详细信息。

相关内容