Bash编程中的字符串处理

名词定义


parameter:变量名,若有值,其为字符串,如abcxyz;不表示位置参数和数组的情况。


name:由字母数字和下划线组成,且以字母或下划线开头的字符串。


word:由若干字符组成的字符串(没有name定义中约束的一个字符串)。

        

pattern:模式,由特殊模式字符和其它字符组成。在pattern中,除了特殊模式字符,出现在模式中的其它字符代表其本身含义;特殊模式字符若要表示本身,需使用反斜杠\转义。


特殊模式字符,及其含义如下:

扫描二维码关注公众号,回复: 4217479 查看本文章

*,代表任何字符串,也包括空字符串。

?,代表任何单个字符。

[...],代表一组特定字符(字符类)。若左中括号[后紧跟感叹号!或尖号^,代表不在该组特定字符中。



变量赋值(字符串)


基本形式如下:

name=[value],若未提供value,变量名name表示的变量值为空字符串。


Bash中提供的变量扩展(Parameter Expansion),基本形式为${...},也可实现变量赋值,还能获取字符串长度,进行字符串截取,字符串替换,大小写转换。接下来逐一说明。


${...}会针对变量的未设置(unset),空值(空字符串),非空值3种状态进行处理。


基本形式如下(4种):

${parameter:-word}:若变量parameter未设置或是空值,就返回word(变量parameter状态不变);否则返回变量parameter的非空值。


示例如下:

$ unset parameter

$ echo ${parameter:-word}

word

$ echo $parameter


$ parameter=""

$ echo ${parameter:-word}

word

$ echo $parameter


$        


$ parameter="testing"

$ echo ${parameter:-word}

testing

$ echo $parameter        

testing


${parameter:=word}:若变量parameter未设置或是空值,就将word赋值给变量parameter,然后返回变量parameter的值(变量parameter状态发生改变,常用于设置默认值)。否则返回变量parameter的非空值。


示例如下: 

$ unset parameter

$ echo ${parameter:=word}

word

$ echo $parameter

word


$ parameter=""

$ echo ${parameter:=word}

word

$ echo $parameter

word


$ parameter="testing"    

$ echo ${parameter:=word}

testing

$ echo $parameter        

testing


${parameter:?word}:若变量parameter未设置或是空值,就输出word至STDERR(变量parameter状态不变);否则返回变量parameter的非空值。


示例如下:

$ unset parameter

$ echo ${parameter:?word}

-bash: parameter: word

$ echo $parameter



$ parameter=""

$ echo ${parameter:?word}

-bash: parameter: word

$ echo $parameter        



$ parameter="testing"    

$ echo ${parameter:?word}

testing

$ echo $parameter        

testing


${parameter:+word}:若变量parameter是非空值,就返回word(变量parameter原值不变);否则返回变量parameter原状态值。


示例如下:

$ unset parameter   

$ echo ${parameter:+word}


$ echo $parameter



$ parameter=""           

$ echo ${parameter:+word}


$ echo $parameter        



$ parameter="testing"    

$ echo ${parameter:+word}

word

$ echo $parameter        

testing



字符串长度


基本形式如下:

${#parameter}


示例如下:

$ parameter="abcxyz"

$ echo ${#parameter}

6



两种字符串截取


1. 字符串位置截取


基本形式如下(2种):

${parameter:offset}

${parameter:offset:length}


其中offset,length为整数,且length要大于或等于0;当offset为负数时,:后面要有空格,区别于${parameter:-word}形式。


示例如下:

$ parameter="abcxyz"

$ echo ${parameter:2}     

cxyz

$ echo ${parameter:2:3}   

cxy


$ echo ${parameter: -4:4} 

cxyz


2. 字符串前后缀模式删除截取


基本形式如下(4种):

${parameter#pattern}:将变量的头部和模式进行最小匹配,将匹配到的部分删除。

${parameter##pattern}:将变量的头部和模式进行最大匹配,将匹配到的部分删除。


示例如下:

$ parameter="/etc/rc.d/init.d/functions"


$ echo ${parameter#/etc}                

/rc.d/init.d/functions


$ echo ${parameter##*/} 

functions


${parameter%pattern}:将变量的尾部和模式进行最小匹配,将匹配到的部分删除。

${parameter%%pattern}:将变量的尾部和模式进行最大匹配,将匹配到的部分删除。


示例如下:

$ parameter="/usr/local/mysql/bin/mysql"

$ echo ${parameter%/mysql*}

/usr/local/mysql/bin


$ echo ${parameter%%/mysql*}

/usr/local


实现dirname,和basename的功能。

$ parameter="/etc/rc.d/init.d/functions"  


$ dirname /etc/rc.d/init.d/functions

/etc/rc.d/init.d


$ echo ${parameter%/*}

/etc/rc.d/init.d

$ basename /etc/rc.d/init.d/functions

functions


$ echo ${parameter##*/}

functions



字符串替换


基本形式如下(4种):

${parameter/pattern/string}:将parameter中首次匹配到pattern的子串替换为string。

${parameter//pattern/string}:将parameter中所有匹配到pattern的子串替换为string。


示例如下:

$ parameter="/usr/local/mysql/bin/mysql"


$ echo ${parameter/mysql/basedir}

/usr/local/basedir/bin/mysql


$ echo ${parameter//mysql/basedir}

/usr/local/basedir/bin/basedir


${parameter/#pattern/string}:将parameter开头匹配到pattern的子串替换为string。

${parameter/%pattern/string}:将parameter结尾匹配到pattern的子串替换为string。


注,若string为空字符串(null string),将parameter中匹配到pattern的子串删除,pattern后的斜杠/可省略。


示例如下:

$ parameter="/usr/local/mysql/bin/mysql"


$ echo ${parameter/#\/usr\/local//opt}

/opt/mysql/bin/mysql


$ echo ${parameter/%\/bin\/mysql}       

/usr/local/mysql


大小写转换


基本形式如下(4种):

${parameter^pattern}:将parameter中首次匹配到pattern的小写字母转换为大写字母。

${parameter^^pattern}:将parameter中所有匹配到pattern的小写字母转换为大写字母。


示例如下:

$ parameter="abcXYZ_246"


$ echo ${parameter^[a-z]}

AbcXYZ_246


$ echo ${parameter^^[a-z]}

ABCXYZ_246


${parameter,pattern}:将parameter中首次匹配到pattern的大写字母转换为小写字母。

${parameter,,pattern}:将parameter中所有匹配到pattern的大写字母转换为小写字母。


示例如下:

$ parameter="ABCxyz_135"  


$ echo ${parameter,[A-Z]}

aBCxyz_135


$ echo ${parameter,,[A-Z]}

abcxyz_135


若感兴趣可关注订阅号”数据库最佳实践”(DBBestPractice).

qrcode_for_gh_54ffa7e55478_258.jpg

猜你喜欢

转载自blog.51cto.com/coveringindex/2321604