Bash基础语法学习(二)-字符串

1.字符串长度

mystring=akdjakdaldjadklja
echo ${#mystring}
17
//大括号{}是必需的,否则 Bash 会将$#理解成脚本的参数个数,将变量名理解成文本。
echo $#
0

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

${varname:offset:length}
count=frogfootman
echo ${count:4:4}
foot
echo ${count:0:4}
frog
//这种语法不能直接操作字符串,只能通过变量来读取字符串,并且不会改变原始字符串。
//如果省略length,则从位置offset开始,一直返回到字符串的结尾。
echo ${count:4}
footman
foot="abcdefghijk"
echo ${foot: -2} //从倒数第2个字符开始截取,即从j截取2个字符 注:负数前要空格
jk
echo ${foot: -5:3} //从倒数第5个字符开始截取,取3个字符 即:从g截取
ghi
echo ${foot: -5:-2} //从倒数第5个字符截取,截取后去掉末尾2个字符, 即:ghijk 去掉 jk
ghi
echo ${foot: -5:-1}  //从倒数第5个字符截取,截取后去掉末尾1个字符,
ghij

3.搜索与替换
(1)字符串头部的模式匹配。

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

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

# 如果 pattern 匹配变量 variable 的开头,
# 删除最长匹配(贪婪匹配)的部分,返回剩余部分
${variable##pattern}
mypath=/home/cam/book/long.file.name
echo ${mypath#/*/}
cam/book/long.file.name
echo ${mypath##/*/}
long.file.name
//匹配的模式是/*/,其中*可以匹配任意数量的字符,所以最短匹配是/home/,最长匹配是/home/cam/book/。
echo ${mypath##*/}    //*/会匹配目录部分,相当于删除文件路径
long.file.name
//例2
phone="555-456-1414"
echo ${phone#*-}   //这里的*-会匹配到 555-
456-1414
echo ${phone##*-} //这里的*-会匹配到 555-456-
1414
echo ${phone#333}  //这里匹配不成功会返回原字符串
555-456-1414

如果要将头部匹配的部分,替换成其他内容,采用下面的写法。

# 模式必须出现在字符串的开头
${variable/#pattern/string}
echo ${phone/#555/400}
400-456-1414

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

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

# 如果 pattern 匹配变量 variable 的结尾,
# 删除最长匹配(贪婪匹配)的部分,返回剩余部分
${variable%%pattern
mypath=/home/cam/book/long.file.name
echo ${mypath%.*}  //从尾部往前匹配,当找到第一个.时就返回
/home/cam/book/long.file
echo ${mypath%%.*}
/home/cam/book/long
//匹配模式是.*,其中*可以匹配任意数量的字符,所以最短匹配是.name,最长匹配是.file.name。
echo ${mypath%/*}
/home/cam/book
//后缀名替换
echo ${mypath%.name}.text
/home/cam/book/long.file.text

(3)任意位置的模式匹配。
以下两种语法可以检查字符串内部,是否匹配给定的模式。如果匹配成功,就删除匹配的部分,换成其他的字符串返回。原始变量不会发生变化

# 如果 pattern 匹配变量 variable 的一部分,
# 最长匹配(贪婪匹配)的那部分被 string 替换,但仅替换第一个匹配
${variable/pattern/string}

# 如果 pattern 匹配变量 variable 的一部分,
# 最长匹配(贪婪匹配)的那部分被 string 替换,所有匹配都替换
${variable//pattern/string}

4.改变大小写

# 转为大写
${varname^^}

# 转为小写
${varname,,}

你可能感兴趣的:(Bash基础语法学习(二)-字符串)