Linux学习笔记 高级变量

高级变量分为三个主题,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))

 

posted @ 2021-02-24 17:15  阿十三  阅读(93)  评论(0编辑  收藏  举报