Bash数组和字符切片(高级用法)

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Bash数组和字符切片(高级用法)相关的知识,希望对你有一定的参考价值。

一、case和function
二、数组
三、数组切片
四.bash内置的字符串处理工具
五.测试脚本

 
一、case和function
函数、case语句
    case语句:
        case $VAR in  
        PAT1)
            分支1
            ;;
        PAT2)
            分支2
            ;;
        *)
            分支n
            ;;
        esac
        PATTERN:GLOB
函数;结构化编程、代码重用
    function f_name {
        函数体
    }
    f_name() {
        函数体
    }
    
    函数定义
    函数调用:给定函数名 AcoRG1 ARG2 //
    
    局部变量:local VAR=VALUE
    
二、数组:
    程序=指令+数据
        指令:PATH中的指令
        数据:变量、文件
    变量:命名的内存空间
 
    变量:存储单个元素的内存空间
    数组:存储多个元素的连续的内存空间
        数组名:整个数组只有一个名字
        数组索引:编号从0开始
            数组名[索引]
            ${ARRAR_NAME[INDEX]} //对于{}来说是必须的
                //$a[0] //会把“a[0]”当做一个变量来使用
    bash支持稀疏格式
        
    注意:bash-4版本以后的版本,支持自定义索引格式,而不仅仅是0,1,2,...格式
        此类数组称之为“关联数组”
        
    declare
        -a  index数组,索引号为0,1,2,...
        -A  关联数组,自定义索引,类似于字典
    
    赋值:
        1.单个赋值
            a[0]=dog
            a[1]=pig
        2.一次赋值多个 //空格作为分隔符
            a=("va1","va2","va3","va4",..) //这样直接赋值是赋值给a[0]
            a=("va1" "va2" "va3" "va4" . .)  //这样是可以的
        3.只赋值特定元素 //稀疏格式的数组
            a=([0]="VA1" [3]="VA3" ...) //
            b=([0]=2 [3]=5 [6]=8) //字符的话,要使用" "
            b=("1" "2" "3" "54")  //中间用空格
        4.read -a ARRAY_name //
            world[us]="ameriacan" //关联数组
            world[cn]="china"
            ...
            echo ${wold[us]}
            
            注意:引用时,只给数组名,表示引用下表为0的元素
        数组的长度(数组中元素的个数)
            declare -A wolf //关联数组需要单独声明
            echo ${#a[@]} //所有元素的个数
            echo ${#a[*]} //所有元素的个数
            echo ${#a} //第一个元素中字符的个数
            echo ${a[*]} //引用所有元素
            echo ${a[@]} //引用所有元素
            echo ${a[2]} //a[2]所占用的字符个数
        [[email protected] ~]# declare -a files
        [[email protected] ~]# files=("/var/log/*.log")    //可以这样玩
    
三、数组切片
    数组元素切片:
        ${ARRAR_NAME[@]:offset:uumber} //
            offset:要路过的元素个数,前几个不要
            number:要取出的元素个数;省略number时,表示取
        declare -a files
        files=(/etc/[pP]*)
        echo ${files[@]:2:3} //第2个开始(包括),向后拿出来3个元素
        echo ${aa[1]:2:2}  //字符,前两个不要,取出后两个
        echo ${aa[1]: -4} //从右往左,取出4个,注:空白不能少
    数组中追加元素:
        ARRAY_NAME[${#ARRAR_NAME[*]}=value
            //当前数组元素个数的下一个
        files[${#files[*]}]="wolf"
    删除数组中的某元素
        unset ARRAY[index]    
    关联数组:declare -A ARRAY_NAME
        ab=([a]="wolf" [b]="tom" [c]="com")
        ab=([a]="wolf" [b]="tom" [c]="com")
    数组下标查看:
        根据指定字符
 
四.bash内置的字符串处理工具
    1.字符串变量切片:
        ${var:offset:number}
            取字符串的子串
        name=jerry
        echo ${name:2} //前2个不要  
        echo ${name:2:2} //前2个不要,拿出来2个
        echo ${name: -4} //从右往左,取出4个,注:空白不能少
    2.查找删除:
        1.自左往右:
             #{var#*word} :其中word是指定的分隔符;功能:自左向右,查找var变量所存储的字符串中,第一次出现的word分隔符,删除字符串开头至此分隔符之间的所有字符
                //开头到word不要
             #{var##*word} :其中word是指定的分隔符;功能:自左向右,查找var变量所存储的字符串中,最后次出现的word分隔符,删除字符串开头至此分隔符之间的所有字符
                //只要最后word之后。最后一个word之前都删除
            [[email protected] scripts]# path="/etc/init.d/fucntion/sdf"
            [[email protected] scripts]# echo ${path#*/}
                etc/init.d/fucntion/sdf
            [[email protected] scripts]# echo ${path##*/}
                sdf
            注意:分隔符为“/"
        2.自右往左 //*在word的左还是右,取决于从哪里开始匹配
             #{var%word*} :其中word是指定的分隔符;功能:自右向左,查找var变量所存储的字符串中,第一次出现的word分隔符,删除字符串开头至此分隔符之间的所有字符
                //尾部到word不要
             #{var%%*word*} :其中word是指定的分隔符;功能:自右向左,查找var变量所存储的字符串中,最后次出现的word分隔符,删除字符串开头至此分隔符之间的所有字符
                //只要最后word之后
            [[email protected] scripts]#  path="/etc/init.d/fucntion/sdf"
            [[email protected] scripts]# echo ${path%/*}
                /etc/init.d/fucntion
            [[email protected] scripts]# echo ${path%%/*}
                //为空,什么都没有
        3.小结
            ##*word
            %%word* //记录这两种用法即可
            
            #:自左向右*在word前
            %:自右往左*在word后
            //:全部替换
            #行首
            %行尾
                        
    3.查找替换:
 

       ${var/PATTERN/SUBSTI}: 查找var所表示的字符串,第一次被pattern所匹配到的字符创,替换为SUBSTI所表示的字符串 
            //仅替换第一次出现 
        ${var//PATTERN/SUBSTI}: //全部替换 
        ${var/#PATTERN/SUBSTI}: //行首匹配则替换 
        ${var/%PATTERN/SUBSTI}: //行尾匹配则替换 
        支持glob 
            ?:单个字符 
         echo ${a/%[^[:digit:]]/N}     
        [[email protected] scripts]# echo $path 
            /etc/init.d/fucntion/sdf 
        [[email protected] scripts]# b=${path/etc/mmm} 
        [[email protected] scripts]# echo $b 
            /mmm/init.d/fucntion/sdf 
        [[email protected] scripts]# echo  $path 
            /etc/init.d/fucntion/sdf 
        [[email protected] scripts]# b=${path/#etc/mmm} //必须是行首,否则不会替换 
        [[email protected] scripts]# echo $b 
            /etc/init.d/fucntion/sdf 
        [[email protected] scripts]# b=${path/#\/etc/mmm} //转义 
        [[email protected] scripts]# echo $b 
            mmm/init.d/fucntion/sdf

    4.查找删除:
        ${var/PATTERN} :以PATTERN为模式查找var字符串中第一次的匹配,并删除之
        ${var//PATTERN}:所有
        ${var/#PATTERN}:删除行首
        ${var/%PATTERN}:删除行尾
    5.字符创大小写转换
        ${var^^} :把var中的所有字符转换为大写;
        ${var,,} :把var中的所有转换为小写
    6.变量赋值
        ${var:-VALUE} :如果var为空,或未定义,那么返回value;否则则返回var的值                //有返回值,但不赋值
        ${var:=VALUE} :    如果var为空,或未定义,那么返回value,并赋值;否则则返回var的值    //为空,返回并赋值
        ${var:+VALUE} :如果var非空,则返回value;否则nothing                                //非空返回该值
        ${var:?ERROF_INFO} :如果var为空,或未设置,返回ERROR_INFO;否则返回var值            //

五.测试脚本    
脚本1:定义一个数组,元素是/var/log目录下以.log结尾的文件;统计其下标为偶数的文件的行数之和
    [[email protected] ~]# declare -a files
    [[email protected] ~]# files=("/var/log/*.log")  //这样引用是错误的,只是赋值给"a[0]"
    [[email protected] ~]# echo ${files[*]}  

    #!/bin/bash 
    declare -a files 
    files=(/var/log/*.log)        //只能这样引用 
 
    declare -i line=0 
    for i in $(seq 0 $[${#files[*]}-1]);do  //$(COMMAND ),数组应用${#a[*]} 
        if [ $[$i%2] -eq 0 ] ;then 
            let line+=$(wc -l ${files[$i]} | cut -d‘ ‘ -f1) 
        fi 
    done 
    echo "num is $line"

脚本2:取出基名和路径名,使用模式取子串
    路径名:echo "${path%/*}/" ;
    基名:echo "${path##*/}" ;
 
         
注意:
    命令引用:a=$( wc -l /etc/passwd ) //只能用小括号
    数值计算:$[$a -a]; let i++
    echo ${aa[0]} //数组
${var:?ERROF_INFO}  
    [ ] && [ ] //在 [ ]之外的&&,||,!
    [ a -o b ] [ c -a b] //在[ ]之内的 或者,和

本文出自 “黑马腾空” 博客,请务必保留此出处http://hmtk520.blog.51cto.com/12595610/1982179

以上是关于Bash数组和字符切片(高级用法)的主要内容,如果未能解决你的问题,请参考以下文章

Python切片中的误区与高级用法

${ }引用变量的高级用法

swift 高级用法

Python进阶:自定义对象实现切片功能

2.shell编程-函数的高级用法

理解JSON.stringify()高级用法