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

本文涉及的产品
语种识别,语种识别 100万字符
文档翻译,文档翻译 1千页
图片翻译,图片翻译 100张
简介:
1
2
3
4
5
一、 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]所占用的字符个数 
        [root@MT ~]# declare -a files 
        [root@MT ~]# 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之前都删除 
            [root@MT scripts]# path="/etc/init.d/fucntion/sdf" 
            [root@MT scripts]# echo ${path#*/} 
                etc/init.d/fucntion/sdf 
            [root@MT scripts]# echo ${path##*/} 
                sdf 
            注意:分隔符为“/" 
        2.自右往左 //*在word的左还是右,取决于从哪里开始匹配 
             #{var%word*} :其中word是指定的分隔符;功能:自右向左,查找var变量所存储的字符串中,第一次出现的word分隔符,删除字符串开头至此分隔符之间的所有字符 
                //尾部到word不要 
             #{var%%*word*} :其中word是指定的分隔符;功能:自右向左,查找var变量所存储的字符串中,最后次出现的word分隔符,删除字符串开头至此分隔符之间的所有字符 
                //只要最后word之后 
            [root@MT scripts]#  path="/etc/init.d/fucntion/sdf" 
            [root@MT scripts]# echo ${path%/*} 
                /etc/init.d/fucntion 
            [root@MT scripts]# echo ${path%%/*} 
                //为空,什么都没有 
        3.小结 
            ##*word 
            %%word* //记录这两种用法即可 
             
            #:自左向右*在word前 
            %:自右往左*在word后 
            //:全部替换 
            #行首 
            %行尾 
                         
    3.查找替换: 
 

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
        ${ var /PATTERN/SUBSTI}: 查找 var 所表示的字符串,第一次被pattern所匹配到的字符创,替换为SUBSTI所表示的字符串 
             //仅替换第一次出现 
         ${ var //PATTERN/SUBSTI}: //全部替换 
         ${ var /#PATTERN/SUBSTI}:  //行首匹配则替换 
         ${ var /%PATTERN/SUBSTI}:  //行尾匹配则替换 
         支持glob 
             ?:单个字符 
          echo ${a/%[^[:digit:]]/N}     
         [root@MT scripts]# echo $path 
             /etc/init.d/fucntion/sdf 
         [root@MT scripts]# b=${path/etc/mmm} 
         [root@MT scripts]# echo $b 
             /mmm/init.d/fucntion/sdf 
         [root@MT scripts]# echo  $path 
             /etc/init.d/fucntion/sdf 
         [root@MT scripts]# b=${path/#etc/mmm}  //必须是行首,否则不会替换 
         [root@MT scripts]# echo $b 
             /etc/init.d/fucntion/sdf 
         [root@MT scripts]# b=${path/#\/etc/mmm}  //转义 
         [root@MT 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结尾的文件;统计其下标为偶数的文件的行数之和 
    [root@MT ~]# declare -a files 
    [root@MT ~]# files=("/var/log/*.log")  //这样引用是错误的,只是赋值给"a[0]" 
    [root@MT ~]# echo ${files[*]}  

1
2
3
4
5
6
7
8
9
10
11
     #!/bin/bash 
     declare -a files 
     files=(/ var /log/*.log)         //只能这样引用 
  
     declare -i line=0 
     for  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] //在[ ]之内的 或者,和 













本文转自MT_IT51CTO博客,原文链接:http://blog.51cto.com/hmtk520/1982179,如需转载请自行联系原作者

相关文章
|
9月前
|
存储 Shell 索引
如何在Bash中使用For循环和数组?
如何在Bash中使用For循环和数组?
156 0
|
运维 Shell
善用chatGPT学习 | bash脚本如何判断字符串在数组中
善用chatGPT学习 | bash脚本如何判断字符串在数组中
159 0
|
Shell 数据库 数据安全/隐私保护
bash 只读/整形/数组 类型操作
bash 只读/整形/数组 类型操作
78 0
|
Shell 测试技术
Bug Bash:Bug大扫除的正确用法
Bug Bash:Bug大扫除的正确用法
75 0
|
Shell Linux
bash shell 中数组使用举例
bash shell 中数组使用举例 一 背景 让我们先来看一个 shell 脚本的执行过程及结果: [gysl@gysl-DevOps ~]$ sh array.sh N2 N3 N4 The elements of this array 2-4 are: N2 N3 N4 N1 is in array.
1354 0
|
存储 Shell 索引
|
存储 Shell 索引