天天看點

Bash數組和字元切片(進階用法)

<code>一、</code><code>case</code><code>和function</code>

<code>二、數組</code>

<code>三、數組切片</code>

<code>四.bash内置的字元串處理工具</code>

<code>五.測試腳本</code>

一、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") 

    數組下标檢視: 

        根據指定字元 

四.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.查找替換: 

<code>       </code><code>${</code><code>var</code><code>/PATTERN/SUBSTI}: 查找</code><code>var</code><code>所表示的字元串,第一次被pattern所比對到的字元創,替換為SUBSTI所表示的字元串 </code>

<code>            </code><code>//僅替換第一次出現 </code>

<code>        </code><code>${</code><code>var</code><code>//PATTERN/SUBSTI}: //全部替換 </code>

<code>        </code><code>${</code><code>var</code><code>/#PATTERN/SUBSTI}: </code><code>//行首比對則替換 </code>

<code>        </code><code>${</code><code>var</code><code>/%PATTERN/SUBSTI}: </code><code>//行尾比對則替換 </code>

<code>        </code><code>支援glob </code>

<code>            </code><code>?:單個字元 </code>

<code>         </code><code>echo ${a/%[^[:digit:]]/N}     </code>

<code>        </code><code>[root@MT scripts]# echo $path </code>

<code>            </code><code>/etc/init.d/fucntion/sdf </code>

<code>        </code><code>[root@MT scripts]# b=${path/etc/mmm} </code>

<code>        </code><code>[root@MT scripts]# echo $b </code>

<code>            </code><code>/mmm/init.d/fucntion/sdf </code>

<code>        </code><code>[root@MT scripts]# echo  $path </code>

<code>        </code><code>[root@MT scripts]# b=${path/#etc/mmm} </code><code>//必須是行首,否則不會替換 </code>

<code>        </code><code>[root@MT scripts]# b=${path/#\/etc/mmm} </code><code>//轉義 </code>

<code>            </code><code>mmm/init.d/fucntion/sdf</code>

    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[*]}  

<code>    </code><code>#!/bin/bash </code>

<code>    </code><code>declare -a files </code>

<code>    </code><code>files=(/</code><code>var</code><code>/log/*.log)        </code><code>//隻能這樣引用 </code>

<code> </code> 

<code>    </code><code>declare -i line=0 </code>

<code>    </code><code>for</code> <code>i </code><code>in</code> <code>$(seq 0 $[${#files[*]}-1]);</code><code>do</code>  <code>//$(COMMAND ),數組應用${#a[*]} </code>

<code>        </code><code>if</code> <code>[ $[$i%2] -eq 0 ] ;then </code>

<code>            </code><code>let</code> <code>line+=$(wc -l ${files[$i]} | cut -d</code><code>' '</code> <code>-f1) </code>

<code>        </code><code>fi </code>

<code>    </code><code>done </code>

<code>    </code><code>echo </code><code>"num is $line"</code>

腳本2:取出基名和路徑名,使用模式取子串 

    路徑名:echo "${path%/*}/" ; 

    基名:echo "${path##*/}" ; 

注意: 

    指令引用:a=$( wc -l /etc/passwd ) //隻能用小括号 

    數值計算:$[$a -a]; let i++ 

    echo ${aa[0]} //數組 

${var:?ERROF_INFO}  

    [ ] &amp;&amp; [ ] //在 [ ]之外的&amp;&amp;,||,! 

    [ a -o b ] [ c -a b] //在[ ]之内的 或者,和 

本文轉自MT_IT51CTO部落格,原文連結:http://blog.51cto.com/hmtk520/1982179,如需轉載請自行聯系原作者