10. bash 字符串操作

1.字符串长度

本章介绍 Bash 字符串常见的操作语法。

首先是获取字符串长度,方式其实和前面一章节获取数组长度类似,都是用的#号:

${#varname}

比如:

image.png

注意这里的大括号{}是必需的,因为$#的含义获取脚本参数个数,有特定含义,必须要使用大括号进行分割。

2.子字符串

字符串提取子串的语法如下。

${varname:offset:length}

上面语法的含义是返回变量$varname的子字符串,从位置offset开始(从0开始计算),长度为length

image.png

上面例子返回字符串www.kucoding.com从3号位置开始的长度为8的子字符串.kucodin

这种语法不能直接操作字符串,只能通过变量来读取字符串,并且不会改变原始字符串。

# 报错
echo ${"hello":2:3}

上面例子中,"hello"不是变量名,会导致 Bash 报错。

如果省略length,则从位置offset开始,一直返回到字符串的结尾:

image.png

上面例子是返回变量ku从4号位置一直到结尾的子字符串。

如果offset为负值,表示从字符串的末尾开始算起。

注意,负数前面必须有一个空格, 以防止与${variable:-word}的变量的设置默认值语法混淆。

这时还可以指定lengthlength可以是正值,也可以是负值(负值不能超过offset的长度)。

foo="This string is long."
echo ${foo: -5}
echo ${foo: -5:2}
echo ${foo: -5:-2}

上面例子中,offset-5,表示从倒数第5个字符开始截取,所以返回long.。如果指定长度length2,则返回lo;如果length-2,表示要排除从字符串末尾开始的2个字符,所以返回lon

image.png

3.搜索和替换

Bash 提供字符串搜索和替换的多种方法。

(1)字符串头部的模式匹配。

以下两种语法可以检查字符串开头,是否匹配给定的模式。如果匹配成功,就删除匹配的部分,返回剩下的部分。原始变量不会发生变化。

# 如果 pattern 匹配变量 variable 的开头,
# 删除最短匹配(非贪婪匹配)的部分,返回剩余部分
${variable#pattern}

# 如果 pattern 匹配变量 variable 的开头,
# 删除最长匹配(贪婪匹配)的部分,返回剩余部分
${variable##pattern}

上面两种语法会删除变量字符串开头的匹配部分(将其替换为空),返回剩下的部分。区别是一个是最短匹配(又称非贪婪匹配),另一个是最长匹配(又称贪婪匹配)。

匹配模式pattern可以使用*?[]等通配符。

myPath=/home/cam/book/long.file.name
echo ${myPath#/*/}
echo ${myPath##/*/}

上面例子中,匹配的模式是/*/,其中*可以匹配任意数量的字符,所以最短匹配是/home/,最长匹配是/home/cam/book/

image.png

下面写法可以删除文件路径的目录部分,只留下文件名。

path=/home/cam/book/long.file.name

echo ${path##*/}

上面例子中,模式*/匹配目录部分,所以只返回文件名:

image.png

作者:余识
全部文章:0
会员文章:0
总阅读量:0
c/c++pythonrustJavaScriptwindowslinux