Bash编程中的字符串处理
Posted 数据库最佳实践
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Bash编程中的字符串处理相关的知识,希望对你有一定的参考价值。
名词定义
parameter:变量名,若有值,其为字符串,如abcxyz;不表示位置参数和数组的情况。
name:由字母数字和下划线组成,且以字母或下划线开头的字符串。
word:由若干字符组成的字符串(没有name定义中约束的一个字符串)。
pattern:模式,由特殊模式字符和其它字符组成。在pattern中,除了特殊模式字符,出现在模式中的其它字符代表其本身含义;特殊模式字符若要表示本身,需使用反斜杠\转义。
特殊模式字符,及其含义如下:
*,代表任何字符串,也包括空字符串。
?,代表任何单个字符。
[...],代表一组特定字符(字符类)。若左中括号[后紧跟感叹号!或尖号^,代表不在该组特定字符中。
变量赋值(字符串)
基本形式如下:
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
每天进步一点点
以上是关于Bash编程中的字符串处理的主要内容,如果未能解决你的问题,请参考以下文章