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] //在[ ]之内的 或者,和

时间: 2024-11-10 17:13:35

Bash数组和字符切片(高级用法)的相关文章

bash-基础--数组和字符切片

      数组 什么是数组? 变量:存储单个元素的内存空间: 数组:存储多个元素的连续的内存空间: 数组名:整个数组只有一个名字: 数组索引:编号从0开始: 数组名[索引],  ${ARRAY_NAME[INDEX]} 注意:bash-4及之后的版本,支持自定义索引格式,而不仅仅是0,1,2,...数字格式: 此类数组称之为"关联数组" 声明数组: declare  -a  NAME:声明索引数组: declare  -A  NAME:声明关联数组: 数组中元素的赋值方式: (1)

【Python】字符串切片高级用法

原文地址:https://www.cnblogs.com/HGNET/p/12114310.html

bash颜色、配置、字符切片、数组

bash 的颜色显示规则 ASCII编码对于颜色进行设置 \033 相当于 Ctrl键 [ :控制字符和颜色代码之间的间隔字符 0m :关闭颜色属性的命令 1m :对于显示的文本字符加粗 4m :为文本字符加下划线标识 5m :使文本字符闪烁 7m :使文字色和背景色调换 8m :把文字颜色和背景色相同化 30m-39m :设置文本字符前景色 依次是黑红绿金蓝粉天蓝灰色 38m和39m暂时没有意义 40m-49m :设置文本字符背景色 依次是黑红绿金蓝粉天蓝灰色 38m和39m暂时没有意义 例如

C语言语法笔记 – 高级用法 指针数组 指针的指针 二维数组指针 结构体指针 链表 | IT宅.com

原文:C语言语法笔记 – 高级用法 指针数组 指针的指针 二维数组指针 结构体指针 链表 | IT宅.com C语言语法笔记 – 高级用法 指针数组 指针的指针 二维数组指针 结构体指针 链表 | IT宅.com C语言语法笔记 – 高级用法 指针数组 指针的指针 二维数组指针 结构体指针 链表 本文由 arthinking 发表于315 天前 ⁄ itzhai.com原创文章 ⁄ C语言 ⁄ 评论数 3 ⁄ 被围观 1,775 views+ 指针数组: 在一个数组中,如果它的元素全部都是指针类

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

众所周知,我们可以通过索引值(或称下标)来查找序列类型(如字符串.列表.元组...)中的单个元素,那么,如果要获取一个索引区间的元素该怎么办呢? 切片(slice)就是一种截取索引片段的技术,借助切片技术,我们可以十分灵活地处理序列类型的对象.通常来说,切片的作用就是截取序列对象,然而,它还有一些使用误区与高级用法,都值得我们注意.所以,本文将主要跟大家一起来探讨这些内容,希望你能学有所获. 事先声明,切片并非列表的专属操作,但因为列表最具有代表性,所以,本文仅以列表为例作探讨. 1.切片的基础

第九章 变量的高级用法

内部变量 1.BASH 记录了bash Shell的路径(通常为/bin/bash) [[email protected] tmp]# echo "$BASH" /bin/bash 2.BASH_VERSINFO 为一个数组,分别存储bash shell的主版本号,此版本号,补丁级别,编译版本,发行状态,硬件架构 [[email protected] tmp]# cat c.sh #! /bin/bash for n in 0 1 2 3 4 5 do echo "BASH_

Newtonsoft.Json高级用法

手机端应用讲究速度快,体验好.刚好手头上的一个项目服务端接口有性能问题,需要进行优化.在接口多次修改中,实体添加了很多字段用于中间计算或者存储,然后最终用Newtonsoft.Json进行序列化返回数据,经过分析一个简单的列表接口每一行数据返回了16个字段,但是手机APP端只用到了其中7个字段,剩余9个字段的数据全部都是多余的,如果接口返回数据为40K大小,也就是说大约20K的数据为无效数据,3G网络下20K下载差不多需要1s,不返回无效数据至少可以节约1s的时间,大大提高用户体验.本篇将为大家

#define的高级用法

=========================================================== define中的三个特殊符号:#,##,#@ =========================================================== #define Conn(x,y) x##y #define ToChar(x) #@x #define ToString(x) #x (1)x##y表示什么?表示x连接y,举例说: int n = Conn(12

Newtonsoft.Json 高级用法

基本用法 Json.NET是支持序列化和反序列化DataTable,DataSet,Entity Framework和Entity的.下面分别举例说明序列化和反序列化. DataTable: //序列化DataTable DataTable dt = new DataTable(); dt.Columns.Add("Age", Type.GetType("System.Int32")); dt.Columns.Add("Name", Type.G