最常用方法是 bash 参数扩展 ${var:start:length},支持正负起始索引、省略 length 表示取到末尾,length 必须非负,空或越界时静默返回空。

在 Linux Shell 中,对字符串变量截取指定长度的子串,最常用、最直接的方法是使用 Bash 的 参数扩展(Parameter Expansion),无需调用外部命令,高效且可移植性强。
用 ${var:start:length} 截取固定起始位置和长度
这是最推荐的方式,语法简洁,支持负数偏移,适用于大多数 Bash 环境(需 Bash 3.0+):
- ${str:0:5}:从索引 0 开始,取前 5 个字符(左闭右开)
- ${str:2:3}:从第 3 个字符开始(索引为 2),取 3 个字符
- ${str:-4:2}:从倒数第 4 个字符开始,向后取 2 个(负起始位置表示从末尾算)
- 若 length 省略(如 ${str:3}),则取从位置 3 到末尾的全部
注意索引从 0 开始,且 length 不能为负
Bash 字符串索引严格从 0 起算,且 length 必须是非负整数。常见误区:
Linux系统管理专家,覆盖12大模块:用户权限、SSH、存储、网络、systemd、防火墙、日志监控、备份恢复、TLS证书、Ansible、容器、IaC。提供配置、验证、加固、监控、备份、自动化、故障排查、回滚闭环。关键词:useradd、sudo、sshd_config、chmod、SEL...
- ${str:0:-3} ❌ 会报错 —— Bash 不支持负 length;想“去掉末尾 3 个”,应改用 ${str:0:${#str}-3}
- ${#str} 是获取字符串长度的正确写法,不是 len($str) 或其他形式
- 空字符串或越界时,Bash 安静返回空值,不会报错(例如 ${str:100:5} 返回空)
兼容 POSIX shell 的替代方案(如 dash/sh)
如果脚本需在非 Bash 环境(如 Ubuntu 默认 /bin/sh)中运行,不能用上述语法,可用 cut 配合 echo:
- echo "$str" | cut -c1-5:取前 5 个字符(按字节,非 Unicode 字符)
- echo "$str" | cut -c3-5:取第 3 到第 5 个字符(含)
- 注意:cut -c 按字节计数,对 UTF-8 中文可能截断乱码;如需安全处理多字节字符,建议用 awk '{print substr($0,1,5)}'
实用小技巧:动态长度与边界保护
避免因字符串过短导致意外空结果,可结合长度判断做安全截取:
- 取最多前 10 个字符:${str:0:${#str}(Bash 4.3+ 支持三元运算)
- 更兼容写法:len=${#str}; [ $len -gt 10 ] && echo "${str:0:10}" || echo "$str"
- 提取文件名前缀(不含扩展名)再截取前 8 字符:${filename%.*:0:8}(注意:%.* 和 :0:8 可链式使用)










