本章介绍 Bash 字符串操作的语法。
获取字符串长度的语法如下。
1 | ${ #varname} # 大括号内无空格,此处为了避免md语法解析失败 |
下面是一个例子。
1 | $ myPath=/home/cam/book/long.file.name |
字符串提取子串的语法如下
1 | ${varname:index:length} |
上面语法的含义是返回变量$varname
的子字符串,从位置index
开始(从0
开始计算),长度为length
。
1 | $ count=frogfootman |
注意:从前往后的索引是从0
开始计数的,从后往前的索引是从-1
开始计数的。
下面的语法可以改变变量的大小写。注意,不改变原变量的值,只是以大小写的形式输出。
1 | # 转为大写 |
下面是一个例子。
1 | $ foo=heLLo |
Bash 提供字符串搜索和替换的多种方法。
贪婪匹配:尽可能长地匹配字符串,也称为最长匹配。
非贪婪匹配:匹配最短的字符串,也称为最短匹配。
以下两种语法可以匹配字符串开头。如果匹配成功,就删除匹配的部分,返回剩下的部分。如果匹配不成功,则返回原始字符串。
1 | # 如果 pattern 匹配变量 variable 的开头,则删除最短匹配的部分(将其替换为空),返回剩余部分 |
匹配模式pattern
可以使用*
、?
、[]
等通配符。
下面是一个返回路径中的文件名的例子。
1 | $ path=/home/cam/book/long.file.name |
下面是返回号码中后几位的例子
1 | $ phone="176-3355-4278" |
如果要将头部匹配的部分,替换成其他内容,采用下面的写法。
1 | # 模式必须出现在字符串的开头 |
以下两种语法可以匹配字符串的结尾。如果匹配成功,就删除匹配的部分,返回剩下的部分。如果匹配不成功,则返回原始字符串。
1 | # 如果 pattern 匹配变量 variable 的结尾,则删除最短匹配的部分(将其替换为空),返回剩余部分 |
下面是一个返回路径中的目录部分的例子。
1 | $ path=/home/cam/book/long.file.name |
下面是返回号码中前几位的例子
1 | $ phone="555-456-1414" |
如果要将尾部匹配的部分,替换成其他内容,采用下面的写法。
1 | # 模式必须出现在字符串的结尾 |
以下两种语法匹配字符串的任意位置。如果匹配成功,就删除匹配的部分,换成其他的字符串返回。如果匹配不成功,则返回原始字符串。
1 | # 如果 pattern 匹配变量 variable 的一部分,最长匹配的那部分被 string 替换,但仅替换第一个匹配 |
上面两种语法都是最长匹配(贪婪匹配)下的替换,区别是前一个语法仅仅替换第一个匹配,后一个语法替换所有匹配。如下:
1 | $ path=/home/cam/foo/foo.name |
下面的例子将分隔符从:
换成换行符。
1 | # `echo`命令的`-e`参数,表示将替换后的字符串的`\n`字符,解释为换行符 |
模式部分可以使用通配符。
1 | $ phone="555-456-1414" |
如果省略了string
部分,那么就相当于匹配的部分替换成空字符串,即删除匹配的部分。
1 | $ path=/home/cam/foo/foo.name |
前面提到过,这个语法还有两种扩展形式。
1 | # 模式必须出现在字符串的开头 |