linux shell中计算字符串长度分字符数(${#var})和字节数(echo -n "$str" | wc -c):前者统计unicode字符个数,后者统计utf-8字节长度;中文“你好”字符数为2、字节数为6;数组需注意${#arr[0]}与${#arr[@]}区别。

在 Linux Shell 中,计算字符串变量的长度分两种需求:字符数(即 Unicode 字符个数)和字节数(即底层存储占用的字节数)。两者在处理中文、emoji 或其他 UTF-8 多字节字符时结果常不同,需按需选择。
获取字符数(推荐用 ${#var})
这是最常用、最可靠的方式,统计的是“字符数量”,对 UTF-8 编码友好:
- ${#str} 直接返回变量 str 的字符数,空字符串或未定义变量都返回 0
- 支持命令替换:${#$(date)} 统计命令输出的字符数
- 拼接字符串时必须加双引号:${#"Hello $USER"};不加引号会语法错误
- 中文算一个字符:s="你好" → ${#s} 输出 2;s="??"(emoji)→ ${#s} 输出 1
获取字节数(用 echo -n | wc -c)
当需要知道实际存储大小(如网络传输、文件写入、内存估算),应统计字节数:
Linux系统管理专家,覆盖12大模块:用户权限、SSH、存储、网络、systemd、防火墙、日志监控、备份恢复、TLS证书、Ansible、容器、IaC。提供配置、验证、加固、监控、备份、自动化、故障排查、回滚闭环。关键词:useradd、sudo、sshd_config、chmod、SEL...
- echo -n "$str" | wc -c 是标准做法,“-n”避免 echo 自动添加换行符导致多算 1 字节
- 例如 s="你好":${#s} 是 2(字符数),但
echo -n "$s" | wc -c输出 6(UTF-8 下每个汉字占 3 字节) - 注意:不能用
echo "$str" | wc -c,它会把换行符计入,结果偏大
数组元素与特殊场景
若变量是数组,注意区分不同含义:
- ${#arr[0]} 获取第一个元素的字符长度
- ${#arr[@]} 获取的是数组元素个数,不是字符串长度
- 想批量获取所有元素长度,需循环:
for i in "${arr[@]}"; do echo ${#i}; done
不推荐的替代方法
这些方式要么过时、低效,要么易出错,日常应避免:
- expr length "$str":已过时,依赖外部命令,且必须严格加引号
- echo "$str" | wc -m:虽能统计字符数,但部分旧版 wc 对宽字符支持不稳定
- echo "$str" | wc -L:仅取最长行长度,单行字符串可用,但语义不直观,不具通用性










