Bash 中常用的字符串(变量)操作

处理变量值很方便

以下是 Bash 中常用的字符串操作汇总,以表格形式呈现,主要涵盖 参数扩展(Parameter Expansion) 语法。

操作分类操作语法描述示例 (str="Hello, World!")
获取长度${#var}返回字符串的字符长度echo ${#str}13
截取子串${var:offset}offset 开始截取到末尾(索引从 0 开始)echo ${str:7}World!
截取子串${var:offset:length}offset 开始截取指定长度的字符echo ${str:0:5}Hello
删除前缀${var#pattern}删除 最短 匹配的前缀(通配符匹配)echo ${str#*, }World!
删除前缀${var##pattern}删除 最长 匹配的前缀(贪婪匹配)path="/a/b/c"; echo ${path##*/}c
删除后缀${var%pattern}删除 最短 匹配的后缀echo ${str%,*}Hello
删除后缀${var%%pattern}删除 最长 匹配的后缀file="a.tar.gz"; echo ${file%%.*}a
替换(首次)${var/pattern/string}将第一个匹配 pattern 的内容替换为 stringecho ${str/o/O}HellO, World!
替换(全部)${var//pattern/string}所有 匹配的内容替换echo ${str//o/O}HellO, WOrld!
替换前缀${var/#pattern/string}仅当字符串 开头 匹配时才替换echo ${str/#Hello/Hi}Hi, World!
替换后缀${var/%pattern/string}仅当字符串 结尾 匹配时才替换echo ${str/%World!/Earth!}Hello, Earth!
大小写转换${var^}首字母 转为大写echo ${str^}Hello, world!
大小写转换${var^^}所有字母 转为大写echo ${str^^}HELLO, WORLD!
大小写转换${var,}首字母 转为小写str2="HELLO"; echo ${str2,}hELLO
大小写转换${var,,}所有字母 转为小写echo ${str,,}hello, world!
反转大小写${var~~}反转大小写(Bash 5.1+)echo ${str~~}hELLO, wORLD!
设置默认值${var:-default}若变量未定义或为空,返回默认值(不改变原变量)unset foo; echo ${foo:-"none"}none
赋值默认值${var:=default}若变量未定义或为空,则将默认值赋给变量并返回unset foo; echo ${foo:="none"}none (且 $foo 变为 none)
变量非空报错${var:?error_msg}若变量未定义或为空,打印错误信息并退出脚本unset foo; echo ${foo:?"Not set"}bash: foo: Not set
变量存在替代${var:+alternate}若变量已定义且非空,则返回 alternateecho ${str:+"Exists"}Exists
获取子串位置expr index "$str" chars查找字符集中任一字符首次出现的位置(1-based)expr index "$str" "o"5
字符串匹配索引expr match "$str" pattern返回正则匹配到的长度(或子串),非纯内置expr match "$str" "Hello"5

补充说明

  1. 通配符模式:上述 pattern 主要使用通配符(*, ?, [...]),不是正则表达式。
  2. 大小写转换:Bash 4.0+ 支持 ${var^} / ${var^^} / ${var,} / ${var,,}
  3. 反转大小写:Bash 5.1+ 才支持 ${var~~}
  4. 外部工具:更复杂的操作(如正则替换、反向引用)建议使用 sed, awk, tr${BASH_REMATCH}

发表回复