zoukankan      html  css  js  c++  java
  • bash脚本编程之一 变量、变量类型等

    变量的内容

    1、变量命名:

               1、只能包含字母、数字和下划线,并且不能以数字开头,
        2、不应该跟系统中已有的环境变量重名
        3、最好能见名知意

    2、变量赋值:

    设置变量:
    变量名称=值

    fld_name=value 等号两边不能有空格

    注意:用echo 显示变量名的值时,需要用$符号。 

     

    针对数字,你可以可以这样为变量赋值,定义一个变量的类型:

     

    3、变量类型:

    环境变量:
        本地变量(局部变量):
        位置变量:
        特殊变量(系统变量):

    本地变量:作用域为整个bash进程
        varname=value
    局部变量:作用域只对当前代码段有效
        local varname=value

    环境变量:作用域为当前shell进程及其子进程
        export varname=value "导出“

    任意脚本在执行时会启动一个子shell进程,
            命令行中启动的脚本会继承当前shell的环境变量
            系统自动执行的脚本(跟命令行无关)就需要自我定义需要的各环境变量
    位置变量:
        $1,$2,....

    特殊变量:保持某些特殊数据
            $? 上一个命令执行状态返回值
            $# 参数的个数
            $* 参数列表
            $@ 参数列表
            $0  命令本身  脚本本身

        执行脚本时的脚本路径及名称

    程序执行一般有两类返回值  
        程序执行结果;
        执行状态返回代码(0-255)
                0表示正确
                1-255:错误执行 1,2,127 系统预留 有特殊意义

    4、变量取消:

    unset   varname

    撤销fld_name域的值 

     查看当前shell中的变量

     set  不带任何参数和选

     

    如果查看当前shell中的环境变量
            env
            export
            printenv
    字符串变量添加新的变量
     PATH添加新的路径
    export PATH=$PATH:/usr/local/apsch/bin

     

    5、取得变量值:

    $变量名称
    ${变量名称}  $(x) 这个可以用来当做命令调用

    如果变量在语句当中被引用,必须要使用${x}才可以,取得数组的变量值时候也需要使用${}来调用

     

     关于变量和引号的关系:

        单引号:所见即所得
        双引号:使特殊符号生效

     


    6、调整变量的属性:

    1、readonly 命令 :定义只读变量
            -p:显示目前具有只读属性的变量列表
            -f:设定函数不可修改
            -a:定义数组不可修改

     count环境变量readonly之前可以修改,之后变成只读变量,不可以在修改。

     readonly  -p 读取只读变量,显示在终端。

     

     2、declare 命令 

            -r:设定只读变量
            -p:显示变量的属性
            -a:变量是一个数组
            -f:搜寻命令时,只找函数
            -i:变量是一个整数
            -F:显示所有的函数式名称及其属性
            -t:设立变量具有trace属性
            -x:设定环境变量

    7、数组:  

     是一种数据结构,有相关的数据项组成,每个数据项,称为数组的元素,且可采用索引的方式取得个元素的值
    数组赋值:

    1、单个赋值,以index作为索引号,索引号从0开始

    # 为数组赋值

     

     #显示数组中所有值方法一

    $echo  ${a[*]} 

     

     #显示数组中所有值方法二

    $echo  ${a[@]} 

    #为数组添加数据项

     

    2、使用小括号为数组赋值

        a=(1000 2000 3000) 默认空格隔开

     #为数组b赋值  记住是小括号,不是大括号

     

    #打印出第一个和第4个数据项

     

    3、为数组中的某一个数据项赋值,默认是从0开始,如果中间出现未比标示的索引项,则从前一个索引项开始计算

        a={51 [3]=5  cto  [6]=8}

    #为数组赋值  #打印出数组中所有值   

     

    #验证中间出现的数值是从哪个索引项开始算起的

     

     数组d[7]测试:

     

     显示赋值:

        echo ${a[1]}
    取出数组中所有的值:
        echo ${a[@]}  或者echo ${a[*]}
    取得数组元素的个数:
        echo ${#a[@]} 或者 echo ${#a[*]}

     

     数组元素及个数:

     

     8.高级变量

    ${变量名称}  变量扩展
    $(命令)      命令替换
    $((算术式))  算术扩展

     

    $(命令) 命令替换:
     测试变量存在与否:
        ${countor:-'num'} 判断条件,如果countor存在,就返回值,如果countor不存在,就把-后接的字符串当做整个变量扩展的结果,并传回

     

     测试变量不存在或为空,传回一个默认值

     ${myname:-'nick'} 如果待测变量不存在或为空,传回-后的值,存在则传回变量的

    赋值给变量chen: 

     

    测试变量不存在或为空,给变量设定一个默认值
        ${count:=100} 若变量coutn没有值或为空,则把待测变量设定为默认值,

    测试变量不存在或为空,传回错误信息
        ${myname:?"your input error"}

     

    测试变量的存在性:
        ${myname:+Ture} 若变量存在且值非空,则符合判断

         :  空              测空置
        -   负向                 测不存在
        +   正向                 测存在
        ?  有问题            检查是否完备后再来执行吧
        =   设值                 给控值变量设定一个默认值

    $(命令) 命令替换  此命令等同于·· (esc下的按键,不是单引号)这个在编写脚本的时候很有用

     

    $((算术式))算术扩展:

     


     ----借鉴:

    字符串切片是从0开始的 在使用${}的时候 大括号内的变量引用前面的$可以不写
            ${变量:位置起点}   ${myname:3}
            ${变量:位置起点:长度}

    1
    2
    3
    4
    5
    6
    7
    8
    #定义变量
    [root@lovelace 51cto]# myname=lovelace
    #取得变量字符串从第三个字符开始到字符串结尾的所有字符
    [root@lovelace 51cto]# echo ${myname:3}
    elace
    #取得变量字符串中从第四个字符开始,长度为2的字符
    [root@lovelace 51cto]# echo ${myname:4:2}
    la

        

    取部分参数:
            命令行参数是从$1开始的依次类推,$@代表所有参数,命令本身使用$0来表示
            ${@:起点}:由点开始,取得后面的所有的位置参数
            ${@:起点:个数}:由起点开始,取得指定个数的位置参数
    示例脚本

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    #!/bin/bash
    #Verson:0.1
    #Auther:lovelace
    #Pragram:test argument
    #取得程序名
    echo $0
    #取得变量的所有值
    echo ${@:1}
    #取得变量的个数
    echo $#

     

    执行结果:

    1
    2
    3
    4
    [root@lovelace 51cto]# ./argument.sh 12 32 45
    ./argument.sh
    12 32 45
    3

     

    计算字符串长度:
        ${#变量名称}:传回变量值的字符串长度
        expr:也可以统计字符串的长度
            1、str="here you are."
               len$(expr length "$str")
               echo "str 字符串长度是:$len"
            2、expr "字符串“:‘。*’
                str="here you are."
                len=$(expr "$str":'.*')
                echo "str字符串长度是:$len"

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    [root@lovelace 51cto]# echo $myname
    lovelace
    #使用${#变量名}取得字符串长度  比较常用
    [root@lovelace 51cto]# echo ${#myname}
    8
    #使用${expr length “$变量名”}取得字符串长度
    [root@lovelace 51cto]# len=$(expr length "$myname")
    [root@lovelace 51cto]# echo $len
    8
    #使用${expr “$变量名” : '.*'}取得字符串长度
    [root@lovelace 51cto]# len=$(expr "$myname" : '.*')
    [root@lovelace 51cto]# echo $len
    8

     

    变量扩展:对比样式
        由字符串前面对比,删除最短的
             ${变量#样式}
        由字符串前面对比,删除最长的
             ${变量##样式}

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    #定义一个变量
    [root@lovelace 51cto]# path=$(pwd)
    #查看变量值
    [root@lovelace 51cto]# echo $path
    /home/scripts/51cto
    #使用对比样式
    [root@lovelace 51cto]# echo ${path#*/}
    home/scripts/51cto
    #此对比样式可以取得目录名
    [root@lovelace 51cto]# echo ${path##/*/}
    51cto


        由字符串后面对比,删除最短的
             ${变量%样式}
        由字符串后面对比,删除最长的
              ${变量%%样式}

    1
    2
    3
    4
    5
    #使用此对比样式可以取得路径名
    [root@lovelace 51cto]# echo ${path%/*}
    /home/scripts
    #使用此对比样式没有任何数据输出
    [root@lovelace 51cto]# echo ${path%%/*}

     

    至于对比样式可以根据自己的思考来获得,这个没有固定的格式

     


    取代或删除部分字符串:
        只替换第一个对比符合的字符串
            ${变量/样式/替换字符串}
        替换所有符合的字符串
            ${变量//样式/替换字符串}

    1
    2
    3
    4
    5
    6
    7
    8
    9
    #定义一个变量
    [root@lovelace 51cto]# echo $myname
    lovelace
    #替换第一次出现的l为F
    [root@lovelace 51cto]# echo ${myname/l/F}
    Fovelace
    #替换字符串中所有l为F
    [root@lovelace 51cto]# echo ${myname//l/F}
    FoveFace

     


    删除对比符合的字符串
        只删一个
            ${变量/样式/}
        删除全部
            ${变量//样式/}
        #T  行首位置
        %LE  最后面
       

    1
    2
    3
    4
    5
    6
    7
    8
    9
    #定义一个变量获取IP地址相关的信息
    [root@lovelace 51cto]# tmp=$(ifconfig eth0 | grep 'inet addr')
    #删除对比样式成功的字符串 然后赋值给变量r
    [root@lovelace 51cto]# r=${tmp/inet addr:/}
    #删除对比样式成功的字符串 然后赋值给变量ip
    [root@lovelace 51cto]# ip=${r/ Bcast*/}
    #打印出变量ip 查看是不是我们想要的结果
    [root@lovelace 51cto]# echo $ip
    192.168.2.54


    变量扩展:取变量名称列表、数组索引列表
    取变量名称列表:
            ${!开头字符串@}或${!开头字符串*}

    1
    2
    3
    4
    5
    [root@lovelace 51cto]# myname=lovelace;mytest=51cto
    [root@lovelace 51cto]# echo ${!my@}
    myname mytest
    [root@lovelace 51cto]# echo ${!my*}
    myname mytest

    取数组索引列表:
            ${!数组变量[@]}或${!数组变量[*]}

    1
    2
    3
    4
    5
    6
    #取得数组a的所有值
    [root@lovelace 51cto]# echo ${a[@]}
    hello 2 3 nick
    #取得数组a的索引项
    [root@lovelace 51cto]# echo ${!a[@]}
    0 1 2 3

     

  • 相关阅读:
    numpy数组中round, around, rint, ceil, floor, modf, trunc, fix
    基于KNN算法实现手写数字识别
    PM2.5预测(李宏毅机器学习hw_1)
    numpy的array和asarray
    iOS socket
    UIScrollView
    ios读取文件
    CGContext绘图
    UINavigationController和UITabBarController合用
    window下svn开机自动启动
  • 原文地址:https://www.cnblogs.com/client-server/p/5519935.html
Copyright © 2011-2022 走看看