• 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))
  • 相关阅读:
    Linux编程make命令(转)
    如何处理Global symbol * requires explicit package name编译错误,以及use strict用法
    6235与旧版本的区别
    Linux下动态链接库的使用
    MTK Socket学习——HTTP请求
    指针和指针的引用
    VC/MFC Combo Box控件的用法
    makefile教程
    常用数据类型使用转换详解
    Linux发送与接收信息
  • 原文地址:https://www.cnblogs.com/tijie/p/14442588.html
Copyright © 2020-2023  润新知