为什么wc <<<“ $ string”显示的长度比printf“ $ string”长一字节?厕所?


11

偶然地,我发现这wc取决于从bash获取输入的方式而有所不同:

$ s='hello'
$ wc -m <<<"$s"
6
$ wc -c <<<"$s"
6
$ printf '%s' "$s" | wc -m
5
$ printf '%s' "$s" | wc -c
5

这是-IMHO令人困惑的-行为记录在某处吗?wc在这里算什么-这是假定的换行符吗?


3
您总是可以通过管道来od -c查看自己所拥有的。
托尔比约恩Ravn的安徒生

或者,更好xxd -g1
罗斯兰

1
我希望printf "$s"这不是您的实际脚本...希望您的意思是printf "%s" "$s"
user541686 '18

由于对printf的评论太多,因此我编辑了帖子以反映最佳实践。
rexkogitans '18

Answers:


38

差异是由添加到此处字符串的换行符引起的。请参阅Bash手册

的结果被提供作为单个字符串,以换行附加到命令的标准输入(或文件描述符ñ如果Ñ指定)。

wc 以相同的方式计数,但其输入不同。


7
如果应注意,要在不添加任何换行符的情况下打印变量的(任意)内容,则应使用printf %s "$var"(或print -rn -- "$var"使用类似ksh的shell),printf "$var"对于$var包含%或反斜杠字符(或从-大多数实现开始)。
斯特凡Chazelas

请注意,Unix端口中的原始here-string实现rc未添加该换行符。
斯特凡Chazelas

26

这是here-string重定向器添加的后续换行符:

$ s="hello"
$ hexdump -C <<<"$s"
00000000  68 65 6c 6c 6f 0a                                 |hello.|
00000006
$ printf "$s" | hexdump -C
00000000  68 65 6c 6c 6f                                    |hello|
00000005
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.