我想澄清一下,我并不是在谈论如何在 shell 解释级别上转义字符。
据我所知,只有两个字符需要转义:%
和\
要打印文字%
,您必须使用前面的转义符%
:
printf '%%'
要打印文字,\
您必须使用前面的转义\
:
printf '\\'
是否还有其他情况需要转义字符才能按字面解释?
答案1
在 的格式参数中printf
,只有%
和\
字符是特殊的(不,"
不是特殊的并且\"
根据 POSIX 未指定)。
但是,两个重要的笔记。
在大多数实现中,和
printf
的字节值是特殊的,POSIX 规范甚至可以解释为需要它,因为它要求实用程序成为C 函数的接口,而不是例如(例如\
%
printf
printf(3)
wprintf(3)
它需要%.3s
截断为 3 个字节而不是 3 个字符)。在BIG5、GB18030等一些字符编码中,有数百个字符包含反斜杠的编码,逃脱对于那些
printf
,您需要在这些字符的编码中的\
每个字节之前插入 !0x5c
例如,在 BIG5-HKSCS 中,如在
zh_HK.big5hkscs
(香港)语言环境中使用的,所有Ěαжふ㘘㙡䓀䨵䪤么佢俞偅傜兝功吒吭园坼垥塿墦声娉娖娫嫹嬞孀尐岤崤幋廄惝愧揊擺暝枯柦槙檝歿汻沔涂淚滜潿瀙瀵焮燡牾狖獦珢珮琵璞疱癧礒稞穀笋箤糭綅縷罡胐胬脪苒茻莍蓋蔌蕚螏螰許豹贕赨跚踊蹾躡鄃酀酅醆鈾鎪閱鞸餐餤駹騱髏髢髿鱋鱭黠﹏
答案2
从手册中:
$ man printf
...
printf FORMAT [ARGUMENT]...
...
FORMAT controls the output as in C printf. Interpreted sequences are:
这列出了几个解释的序列。以下是字符本身需要转义的内容。
\" double quote
\\ backslash
%% a single %
我在 中测试了这三个bash
,它们的行为符合预期。根据man bash
,此实现printf
使用上述“标准 printf(1) 格式规范”,此外还有一些与此处不相关的规范。
然而,其他 shell 的zsh
实现printf
略有不同。在这里,双引号不应该被转义。
$ printf '"'
"
$ printf '\"'
\"