Bash 字符串截取与模式删除

Bash 参数展开可以截取字符串,或按通配符模式删除变量开头、结尾的内容。

示例变量:

value='https://www.example.com/path/file.html'

从开头删除匹配内容

# 删除最短匹配:移除协议前缀
printf '%s\n' "${value#*//}"
# www.example.com/path/file.html
 
# 删除最长匹配:只保留最后一个斜杠后的内容
printf '%s\n' "${value##*/}"
# file.html
  • ${parameter#pattern}:删除开头最短匹配。
  • ${parameter##pattern}:删除开头最长匹配。

从结尾删除匹配内容

# 删除结尾最短匹配:移除最后一段路径
printf '%s\n' "${value%/*}"
# https://www.example.com/path
 
# 删除结尾最长匹配
printf '%s\n' "${valuepattern}`:删除结尾最长匹配。
 
## 按位置截取
 
```bash
text='HelloWorld'
 
# 从索引 3 开始直到末尾
printf '%s\n' "${text:3}"
# loWorld
 
# 从索引 3 开始截取 4 个字符
printf '%s\n' "${text:3:4}"
# loWo
 
# 截取最后 3 个字符;负数前应保留空格
printf '%s\n' "${text: -3}"
# rld

索引从 0 开始。${parameter: offset:length} 是 Bash 扩展,并非所有 POSIX Shell 都支持。

常用默认值展开

# 未设置或为空时使用默认值
result=${value:-default}
 
# 未设置或为空时赋值并返回该值
result=${value:=default}
 
# 已设置且非空时使用替代值
result=${value:+alternative}
 
# 未设置或为空时报错
result=${value:?'value is required'}

不带冒号的 ${value-default} 只检查变量是否未设置;带冒号的 ${value:-default} 同时把空字符串视为需要使用默认值。

参考资料