1. 程式人生 > >Bash數組和字符切片(高級用法)

Bash數組和字符切片(高級用法)

bash echo 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]所占用的字符個數
[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.查找替換:

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

    #!/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數組和字符切片(高級用法)