第十二单元 shell脚本高级编程:函数、数组实战

shell脚本高级编程:函数、数组实战

case语句的语法格式:

read -p "Enter you option:" option

case $option in
pat1)
    分支1;;
pat2)
    分支2;;
*)
    分支n;;
esac

函数:function

    过程式编程:代码重用
    把一段独立功能的代码当做一个整体,并为之一个名字;命名的代码段,此即为函数;

    注意:定义函数的代码段不会自动执行,在调用时执行;所谓调用函数,在代码中给定函数名即可;
         函数名出现的任何位置,在代码执行时,都会被自动替换为函数代码

    语法一:
        function f_name {
            ...函数体...
        }
    语法二:
        f_name(){
            ...函数体...
        }
    函数的生命周期:每次被调用时创建,返回时终止;
        其状态返回结果为函数体中运行的最后一条命令的状态结果;
        自定义状态返回值,需要使用:return
            return[0-255]
                0:成功
                1-255: 失败


    函数返回值:
        函数的执行结果返回值:
            1、使用echo或print命令进行输出
            2、函数体中调用的命令的执行结果
        函数的推出状态码
            1、默认取决于函数体中执行的最后一条命令的退出状态码
            2、自定义:return

    函数可以接受参数:
        传递参数给函数:
            在函数体中当中,可以使用$1,$2...引用传递给函数的参数;还可以函数中使用$*或$@引用所有参数,$#引用传递的参数的个数;
            在调用函数时,在函数名后面以空白字符分隔给定参数列表即可,例如,testfunc arg1 arg2 arg3 ...

数组

    declare命令:
        -a:将变量声明为数组型。
        -i:将变量声明为整数型(integer)。

    数组中元素的赋值方式:
        1、一次只赋值一个元素:
            ARRAY_NAME[INDEX]=value
        2、一次赋值全部元素:
            ARRAY_NAME=("VAL1","VAL2","VAL3")
        3、只赋值特定元素
            ARRAY_NAME=([0]="VAL1",[3]="VAL4")

        注意:bash支持稀疏格式的数组
        4、read -a ARRAY_NAME

    引用数组中的元素:${ARRAY_NAME[INDEX]}
        注意:引用时,只给数组名,表示引用下标为0的元素
    
    数组的长度(数组中元素的个数):
        ${#ARRAY_NAME[*]}
        ${#ARRAY_NAME[@]}

    数组元素切片:
        ${ARRAY_NAME[@]:offset:number}
            offset:要跳过的元素个数
            number:要取出的元素个数;省略number时,表示取偏移量的所有元素
    向数组中追加元素:
        ARRAY_NAME[${ARRAY_NAME[*]}]=
    删除数组中的某元素:
        unset ARRAY_NAME[INDEX]
    管理数组:
        declare -A ARRAY_NAME
            ARRAY_NAME=([index_name1]="value1" index_name2="value2")

bash的内置字符串处理工具:

字符串切片:

        $(var:offset:number)

基于模式取子串

        ${var#*word}:其中word是指定的分隔符;功能自左而右,查找var变量所存储的字符串中,第一次出现的word分隔符,删除字符串开头至此分隔符之间的所有字符。
        ${var##*work}:其中word是指定的分隔符;功能自左而右,查找var变量所存储的字符串中,最后一次出现的word分隔符,删除字符串开头至此分隔符之间的所有字符。
            mypath="/etc/init.d/functions"
            ${mypath#*/}结果为:etc/init.d/functions
            ${mypath##*/}结果为:functions
        ${var%word*}:其中word是指定的分隔符;功能自右而左,查找var变量所存储的字符串中,第一次出现的word分隔符,删除此字符串至此分隔符之间的所有字符。
        ${var%%word*}:其中word是指定的分隔符;功能自右而左,查找var变量所存储的字符串中,最后一次出现的word分隔符,删除此字符串至此分隔符之间的所有字符。
            mypath="/etc/init.d/functions"
            ${mypath%/*}结果为:/etc/init.d
            url=http://www.magedu.com:80
                ${url##*:}结果为80
                ${url%%:*}结果为http

查找替换:

    ${var/PATTERN/SUBSTI}:查找var所表示的字符串中,第一次被PATTERN所匹配到的字符串,将其替换为SUBSTI所表示的字符串
    ${var//PATTERN/SUBSTI}:查找var所表示的字符串中,所有被PATTERN所匹配到的字符串,将其全部替换为SUBSTI所表示的字符串
    ${var/#PATTERN/SUBSTI}:查找var所表示的字符串中,行首被PATTERN所匹配到的字符串,将其替换为SUBSTI所表示的字符串
    ${var/%PATTERN/SUBSTI}:查找var所表示的字符串中,行尾被PATTERN所匹配到的字符串,将其替换为SUBSTI所表示的字符串

    注意:PATTERN中使用glob风格和通配符

查找删除:

    ${var/PATTERN}:以PATTERN为模式查找var字符串中第一次的匹配,并删除之
    ${var/PATTERN}:以PATTERN为模式查找var字符串中所有匹配的,并删除之
    ${var/#PATTERN}:以PATTERN为模式查找var字符串中行首匹配的,并删除之
    ${var/%PATTERN}:以PATTERN为模式查找var字符串中行尾匹配的,并删除之

字符大小写转换

    ${var^^}:把var中所有的小写字符转换为大写
    ${var,,}:把var中所有的小写字符转换为大写

变量赋值:

    ${var:-VALUE}:如果var变量为空,或未设置,那么返回VALUE;否则,返回var变量的值
    ${var:=VALUE}:如果var变量为空,或未设置,那么返回VALUE;并将VALUE赋值给var变量,否则,则返回变量的值
    ${var:+VALUE}:如果var不空,则返回VALUE
    ${var:?ERROR_INFO}:如果var为空,或未设置,那么返回ERROR_INFO为错误提示;否则,返回var值
    





















posted @ 2022-10-31 21:05  摩天居士-谢烟客  阅读(110)  评论(0编辑  收藏  举报