shell脚本编程进阶

前言:进入正题之前我们先来复习一下有关脚本编程的条件测试

条件1.png

条件2.png

一,流程控制

  1. 过程式编程语言

    a.顺序执行

    b.选择执行

    c.循环执行

  2. 顺序执行

    顾名思义,就是按照你脚本里所敲的内容顺序执行

  3. 选择执行

    fi

    a.条件选择if语句,可以嵌套

    b.格式

    单支

    if 判断条件;then

              条件为真

    fi

    双分支

    if 判断条件;then

              条件为真

    else

              条件为假

    fi

    多分支

    if 判断条件;then

             条件为真

    elif(相当于else if) 判断条件;then

             条件为真

    else

             上述条件都为假

    fi

    逐条进行判断,第一次遇到真条件时,执行分支,然后fi结束整个if语句


    看几个例子,了解一下具体在脚本里格式是什么样的

    if.png

    if1.png

    所有的脚本写完之后的操作都一样,就在这里演示一次后面就都不演示了


    case

    a.case支持glob风格的通配符

    *任意长度任意字符
    ?任意单个字符
    [ ]指定范围内的任意单个字符
    a|ba或者b

    b.格式

    case 变量引用 in

            pat1) 分支;;

            pat2) 分支;;

            ...

            *) 分支;;

    esac


    case.png


  4. 循环执行

    定义:将某代码段重复运行多次,有进入条件和退出条件

    for

    a.格式

    for 变量名 in 赋值列表;do

          循环体

    done

    b.执行机制:依次将列表的元素赋值给变量名,每次赋值后执行一次循环体,知道列表中耗尽,循环结束

    c.列表生成方式

       (1)直接给出列表 {1,2,3}

       (2)整数列表

                (a){1..10}

                (b)$(seq 1 10)

        (3)返回列表的命令 $(cmd)

        (4)变量引用 $@,$#


    for.png


    for1.png


    while

    a.格式

    while 循环控制条件;do

              循环体

    done

    $R9LH7MB.png

    b.循环控制条件是true,进入循环,否则退出循环

    c.特殊用法   遍历文件的每一行

    while read line;do

              循环体

    done < 文件名

    依次读取文件的每一行,并且赋值给$line


    readline.png



    until

    a.格式

    until 循环控制条件;do

            循环体

    done

    b.循环控制条件是false,进入循环,否则退出循环


    until.png



    continue

    用于循环体中,提前结束第N层的本轮循环,进入下一轮N+1层循环

    break

    用于循环体中,提前结束第N层本轮循环


    这俩个是在其他循环语句中应用,在其他示例的图片里一起讲了 



    shift

    shift n

    用于参量列表,左移指定次数,不指定为左移一次;一旦被移动,最左端的参数从列表中删除


    shift.png



    select        用于创建菜单

    a.格式

    select variable in list;do

             循环体命令

    done

    b.PS3提示符

    c.输入菜单的某个数字,执行相应的命令,是无线循环,需用break退出循环或者exit终止脚本


    menu.png


    menu1.png



  5. 特殊用法

    ((...)) 可以用于运算

    for ((变量初始化;条件判断表达式;控制变量的修正表达式));do

           循环体

    done

    每轮循环结束会先进行控制变量修正运算,然后再做条件判断


    (()).png



二,函数

  1. 函数介绍

    不是单独的进程,不能独立运行,是shell程序的一部分,在当前shell中运行

  2. 定义函数

    a.方式一

    函数名 () { 函数体;}    常用

    b.方式二

    function 函数名 { 函数体;}

    c.方式三

    function 函数名 () { 函数体;}

  3. 函数使用

    a.可在交互式环境下定义函数

    b.可将函数放在脚本文件中作为它的一部分

    c.可放在只包含函数的单独文件

    d.函数只有被调用才会执行

  4. 函数返回值

    return 从函数中返回,用最后状态命令决定返回值,是0,则是无错误返回;是1-255,则是有错误返回

  5. 定义及使用函数

    a.交互式环境

    定义函数后,将一直保留到用户从系统退出,或者执行unset   删除函数,取消函数赋值

    b.脚本中

    调用函数直接调用函数名即可

    调用函数.png

  6. 载入函数

    函数文件创建好后,用 . 或者source 接上文件名载入函数

  7. 执行shell函数

    直接输入函数名即可

  8. 函数参数

    可以接受调用$1,$2,...这些参数,还有特殊变量

    $@,$*  表示所有的参数

    $#  表示参数个数

  9. 函数变量

    a.环境变量

    当前shell和子shell有效

    b.本地变量

    只在当前函数运行期间有效

    c.全局函数

    对当前shell有效

  10. 函数递归

    函数直接或间接调用自身


    调用函数.png


    函数文件.png



三,数组

  1. 相关数组的含义

    a.变量

    存储单个元素的内存空间

    b.数组

    存储多个元素的连续的内存空间,相当于多个变量的集合

    c.索引

    从0开始,数值索引,declare -a 数组名  声明数字索引

    也可以自定义,为关联索引,declare -A 数组名  声明关联索引

  2. 数组赋值

    a.一次赋值一个元素

    title[1]=a

    b.一次赋值全部元素

    title=(a b c )    下标自动从0开始排

    c.指定下标数

    title=([0]=a [3]=b)

    d.交互式赋值

    read -a 数组名

    数组read.png

  3. 引用数组

    a.引用数组元素

    ${数组名[下标数]}

    b.引用数组所有元素

    ${数组名[@|*]}

    c.数组元素的个数

    ${#数组名[@|*]}

    c.删除数组或者元素

    unset 数组名[下标值]

  4. 数组数据处理

    a.引用数组中元素

    ${数组名[@] :i:j}

    i:为正数时是从左往右跳过i个元素;为负数时是从右往左取出i个元素

    j:为正数时是从左往右取出j个元素;为负数时是从右往左去掉j个元素



    数组引用.png



    b.追加元素

    数组名[${#数组名[@]}]=元素值

    c.关联数组

    关联数组必须先声明再调用

    d.显示字符串长度

    ${#数组名}

    字符.png



四,高级字符串操作

  1. 基于模式取字符串

    ${数组名#*字符串}   从左往右开始删除直到第一次出现匹配到字符串的所有字符

    ${数组名##*字符串}    从左往右开始删除直到最后一次出现匹配到字符串的所有字符

    ${数组名%字符串*}    跟#用法一样,但是是从右往左开始


    数组字符串删除.png



  2. 查找替换

    ${数组名/匹配的字符串/替换的字符串}  第一次被匹配到的字符串,替换

    ${数组名//匹配的字符串/替换的字符串}   所有被匹配的字符串,替换

    ${数组名/#匹配的字符串/替换的字符串}    行首被匹配的字符串,替换

    ${数组名/%匹配的字符串/替换的字符串}    行尾被匹配的字符串,替换


    数组查找替换.png



  3. 查找删除

    与替换用法一样,不输入替换的字符串即可

  4. 字符大小写转换

    ${数组名^^}   把数组中的所有小写字母换成大写

    ${数组名,,}   把数组中的所有大写字母换成小写


    数组脚本.png

    数组脚本结果.png

    数组关联脚本.png



五,高级变量

  1. declare

    有类型变量

    declare.png

    如果declare -a 和 declare -A 后面没有接变量名则表示显示索引数组和关联数组

  2. eval

    会先扫描所有的置换,然后执行命令;适用于一次扫描无法实现的变量;对变量进行俩次扫描

    eval.png

  3. mktemp

    创建并显示临时文件,可避免冲突

    mktemp.png

  4. install

    安装复制文件

    install.png

  5. expect

    a.介绍

    主要应用于自动化交互操作的场景,就是把交互式操作成自动完成

    expect.png





發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章