高级变量分为三个主题,1、变量扩展,2、命令替换,3、算术扩展
1、变量扩展
变量扩展基本型:${变量名称}
变量扩展是一种简易的条件判断,对不同的条件赋予变量不同的替换值
变量扩展是对基本型加上条件判断,如若条件符合,则进行变量替换,不符合则进行另一个操作。
与变量扩展相关的极大的是变量存在,变量存在的定义是:如果一个变量曾被设值则该变量存在;反之不曾设值过,或者曾使用unset
取消变量,则这个变量不存在或未定义。
比如
mysql='thirteen' 此时变量为非空 mysql= 此时变量为空,值为null
1.1 测试变量与存在与否的基本用法
语法:${待测变量-默认值} 判断条件:若变量不存在则满足条件,就传回默认值,不满足则传回变量的值 用例: unset mysql r=${mysql-'thirteen'} echo $r 因为unset了mysql所以变量不存在,因此echo $r的时候就会直接返回thirteen
1.2 测试变量“不存在”或其值为空:传回默认值
语法:${待测变量:-默认值} 判断条件:若变量不存在或值为空则满足条件,就传回默认值,不满足则传回变量的值 用例: mysql= r=${mysql-'thirteen'} echo $r 因为mysql的值为空,因此echo $r的时候就会直接返回thirteen
1.3 测试变量的存在性
语法:${待测变量:+真值} 判断条件:若变量存在且值为非空则满足条件,就传回真值,不满足则传回空值 用例: mysql='exist' r=${mysql-true} echo $r 因为mysql存在且值为非空,因此echo $r的时候就会直接返回true
2、变量扩展:取字符串切片、字符串长度
去字符串切片的语法有两种:
1、语法:${变量:位置起点} 释义:从位置起点取字符串,知道字符串结束 用例 mysql="hanbimysql" substr=${mysql:5} echo $substr 从第六个字符开始截取字符串,结果为mysql
2、
语法:${变量:位置起点:长度}
释义:从位置起点取字符串,截取指定长度的字符串
用例
mysql="hanbimysql"
substr=${mysql:5:1}
echo $substr
从第六个字符开始截取字符串长度为1的字符串
计算字符串长度
语法:${#变量} 释义:传回变量值的字符串长度 用例 mysql="hanbimysql" echo ${#substr} 直接返回mysql的字符串长度为10
这个方法与取数组元素个数有些类似,取数组元素个数方法如下
1、${#数组名[@]} 2、${#数组名[*]}
3、变量扩展:对比样式
这里的对比样式的意思是截取字符串的某一部分:做法是将其删除或替换
3.1、由字符串前面对比,删除相符者
从左开始匹配的语法如下
语法:${变量#样式} 释义:从字符串左边开始匹配,然后删除“最短相符合的字符串” 用例: filename="/usr/sbin/ntpdate" r=${filename#/*/} echo $r 说明:对比的样式为/*/,/*/的意思为凡是碰到双斜线内有字符串(空字符串也算)的,则对比符合。因为最后匹配到的最短的为/usr/,
echo $r返回的则为sbin/ntpdate
如果filename为//usr/sbin/ntpdate,则最后返回的是usr/sbin/ntpdate
上面为删除最短如果要删除最长的则用以下语法
语法:${变量##样式}
释义:从字符串左边开始匹配,然后删除“最长相符合的字符串”
用例:
filename="/usr/sbin/ntpdate"
r=${filename##/*/}
echo $r
说明:对比的样式为/*/,/*/的意思为凡是碰到双斜线内有字符串(空字符串也算)的,则对比符合。因为最后匹配到的最短的为/usr/sbin/,
echo $r返回的则为ntpdate
从右开始匹配的语法如下
语法:${变量%样式} 释义:从字符串右边开始匹配,然后删除“最短相符合的字符串” 用例: filename="/usr/sbin/ntpdate" r=${filename%/*} echo $r 说明:对比的样式为/*,/*/的意思为凡是碰到斜线后有字符串(空字符串也算)的,则对比符合。因为最后匹配到的最短的为/ntpdate, echo $r返回的则为usr/sbin 上面为删除最短如果要删除最长的则用以下语法 语法:${变量%%样式} 释义:从字符串右边开始匹配,然后删除“最长相符合的字符串” 用例: filename="/usr/sbin/ntpdate" r=${filename%%/*} echo $r 说明:因为最后匹配到的最长的为/usr/sbin/ntpdate, echo $r返回的则为空
上述为删除,如果要取代字符串则用如下语法,举个栗子
语法:${变量/样式/替代字符串} 释义:从字符串中匹配样式,如果有匹配的样式则取最长的子字符串然后用替换字符串替代 用例: filename="13.13.13.13:131" r=${filename/:/.} echo $r 说明::会被替代为.,则输出的结果为13.13.13.13.131 如果要全部替代则语法为${变量//样式/替代字符串} 如果要把替换的字符串删掉(只删第一个)则语法为${变量/样式/} 删除全部则为${变量//样式/} 如果要求样式在句首或句尾:句首${变量/#样式/},句尾${变量/%样式/}
4、变量扩展:取变量名称列表、数组索引列表
取变量名称列表
语法:${!开头字符串@}或${!开头字符串*} 释义:把所有变量名符合开头字符串的变量打印出来,各变量之间用$IFS定义的第一个分隔符隔开 用例: filename= dir= dir2= echo ${!di@} 说明:打印了di开头的变量名,dir 和dir2
取数组索引列表
语法:${!数组变量[@]}或${!数组变量[*]}
释义:把数组变量的所有索引列出来,各索引值之间用$IFS定义的第一个分隔符隔开
用例: arr=(1 2 3 4 5) r=${!arr[@]} echo $r 说明:打印值为0 1 2 3 4
如果扩展式使用@符号,并且出现在双引号中,如for i in "${!arr[@]}",name这里面返回的不是一个整的字符串,
每个索引值返回的都是单独的字符串
2、命令替换
所谓命令替换就是将命令执行后的标准输出放入变量当中。比如使用ls命令之后,如何将打印出来的文件名放入变量当中以便后续的使用。
语法: 新式写法:变量名称=$(命令) 旧式写法:变量名称=`命令` “`"这个不是单引号! BASH会在执行命令后产生的标准输出,赋值给指定的变量。这个过程中,会默认删除换行字符
3、算术扩展
因为BASH的变量默认是没有数据型,全部以字符串视之。因此在赋值变量的需要一个算术扩展
比如: I=1+1 这个时候如果你进行ech $I 那么他输出的是1+1而不是2 如果要在进行赋值的时候进行算术操作则使用以下语法 I=$((1+1))