在Linux中,当我统计字符数量时,wc -c和${#}有什么不同?

3
echo $SHELL
/bin/bash

echo $SHELL | wc -c
10

echo ${#SHELL}
9 
< p >变量$SHELL中包含9个字符(例如/bin/bash),那么使用wc -c命令为什么结果是10呢?< /p >

实际上它可以,而且由于问题已关闭,我将在评论中进行演示。 - Ben Whaley
2
细微之处在于${#SHELL}是一个shell扩展。该扩展执行字符计数,但不包括换行符,因为echo尚未实际运行。因此,echo ${#SHELL}实际上转换为带有尾随换行符的echo 9 - Ben Whaley
1
@BenWhaley 同意。这个问题比链接的那个好多了。随便加上答案。 - Inian
感谢@Inian! - Ben Whaley
1
@disney82231:你可以通过将 wc -c 替换为 xxd 来找到这个。 - user1934428
显示剩余4条评论
2个回答

5
由于echo添加了换行符,这就是为什么会出现这种情况。当你输入以下命令时:
$ echo $SHELL
/bin/bash
$

echo 命令输出一个换行符,该换行符在 wc 字符计数中被计算。

另一方面, ${#SHELL} 是一个shell 扩展。Shell 使用扩展执行字符计数,没有额外的换行符,因为 echo 实际上还没有运行。所以,echo ${#SHELL} 实际上转换成了 echo 9。数字 9 带有由 echo 添加的尾随换行符进行打印。


1
我强烈建议使用shell扩展。这里是${#SHELL}
警告使用wc -c计算字节,而不是字符。
如果想要计算字符数,请使用wc -m
当您不仅使用ASCII字符表和UTF-8终端(或任何多字节字符集),或处于I18N上下文中时,这非常重要。
试试这个:
$ x="/x/♤/é/"
$ echo ${#x}
$ echo -n "$x" | wc -c
$ echo -n "$x" | wc -m

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接