wc -c 和 ${#} 的区别?

unn*_*337 4 bash special-characters shell-script base64 wc

我创建了脚本,在那里我用 base64 编码了 28 次字符串。然后我想在输出的字符串中回显字符数。

首先我使用${#var}它给了我 34070。

然后我尝试了相同的字符串

script.sh | wc -c
Run Code Online (Sandbox Code Playgroud)

这给了我 34071。

#!/bin/bash
var="9M"
for i in {1..28};do
var=$(echo $var | base64)
done
echo ${#var}
Run Code Online (Sandbox Code Playgroud)

究竟是什么使这两个输出不同?

sch*_*ity 5

正如您在此示例中使用od显示字节的命令所看到的,它打印换行符:

$ echo foo | od -c -b
0000000 foo   \n
        146 157 157 012
0000004

所以在这种情况下,wc -c以及wc -m计算换行符。

没有换行符:

$ echo foo | od -c -b
0000000   f   o   o  \n
        146 157 157 012
0000004

因此,如果您使用echo,请添加该-n选项,使其不打印换行符,或者printf

$ echo -n foo | od -c -b
0000000   f   o   o
        146 157 157
0000003
Run Code Online (Sandbox Code Playgroud)