Linux Shell 中截取变量指定位置字符最常用高效的方式是 ${var:start:length} 语法,支持双向索引与动态计算,无需调用外部命令,速度快且可移植性强。

Linux Shell 中截取变量指定位置的字符,最常用、最高效的方式是使用 ${var:start:length} 语法,无需调用外部命令(如 cut、awk),纯 Bash 内置功能,速度快且可移植性强。
按索引位置截取(从左或从右)
Shell 支持双向索引:从左以 0 开始计数,从右以 0-1 表示最右一位。截取方向始终是从左到右,只改变起始点。
-
从左边第 n 位开始,取 m 个字符:${var:n:m}(n 从 0 起算)
例:url="https://example.com",echo ${url:7:7} → example -
从左边第 n 位开始,截取到末尾:${var:n}(省略 length)
例:echo ${url:8} → example.com -
从右边倒数第 n 位开始,取 m 个字符:${var:0-n:m}
例:echo ${url:0-3:3} → com(倒数第 3 位是 c,向右取 3 个) -
从右边倒数第 n 位开始,截取到末尾:${var:0-n}
例:echo ${url:0-11} → example.com
按常见需求快速定位
实际脚本中常需提取固定结构字段,可结合变量长度 ${#var} 动态计算:
Linux AI 服务器 — 将 Linux 服务器转换为本地 AI 推理集群。使用 systemd、NVIDIA CUDA 实现无头 Linux AI,零 GUI 开销。
- 取后缀(最后一个点之后):ext=${filename##*.}
- 取文件名(不含路径):name=${filepath##*/}
- 取路径(不含文件名):dir=${filepath%/*}
- 取前 10 位时间字符串:date_str=${timestamp:0:10}
- 取最后 8 位(如时间部分):time_part=${logline:0-8}
注意边界与空值安全
当 start 超出字符串长度时,结果为空;length 过大会自动截断至末尾。建议在关键逻辑中先判断长度:
- 安全截取前 5 位(不足则全取):[ ${#var} -ge 5 ] && echo ${var:0:5} || echo $var
- 避免负索引越界(如 ${var:0-100} 在字符串短于 100 时仍有效,但返回整个字符串)
不推荐依赖外部命令的替代写法
虽然 echo $var | cut -c3-7 或 expr substr "$var" 3 5 也能实现,但它们启动子进程、性能低、在 busybox 等精简环境可能缺失。内置参数扩展更可靠、更符合 Shell 编程习惯。

















