遵循以下示例:
printf "abcder1"
1%
printf "abcder1n"
1bcde
我无法理解这种行为。。。我在想这些答案:
1bcde%
和
1bcde
输出中的字符%
不是printf命令输出的一部分。这只是shell中的一个指示,即最后一行输出不是由换行符完成的。这样的"%"被添加到该行的当前位置,并且该当前位置之后的每个字符都被擦除。
以下是字符%
不是printf:输出的一部分的证明
fenyo% printf "ab"
ab%
fenyo% printf "ab" | od -xa
0000000 6261
a b
0000002
fenyo%
如您所见,输出仅由与字符"相对应的2个字节组成;a";以及";b";。
因此,我们可以解释两种行为:
- 关于
printf "abcder1n"
的行为,以下是解释:
printf的最后一个参数是换行符(
n
(,因此shell不会添加%
;就在
1
之前有一个r
,因此1将在行首打印,擦除之前在同一位置打印的字符a
。这两个事实解释了为什么会得到输出
1bcde
- 关于
printf "abcder1"
的行为,以下是解释:
在
1
之前有一个r
,因此1将在行首打印,擦除之前在同一位置打印的字符a
。在该步骤中,输出为1bcde
,并且当前写入位置在b
上;printf的最后一个参数不是换行符(
n
(,因此shell将添加一个%
,并在同一行中删除其后的所有内容。由于当前位置在b
上,该字符被%
替换,并且剩余字符(cdef
(被擦除。这两个事实解释了为什么会得到输出
1%