<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}
[ ] && [ ] //在 [ ]之外的&&,||,!
[ a -o b ] [ c -a b] //在[ ]之内的 或者,和
本文轉自MT_IT51CTO部落格,原文連結:http://blog.51cto.com/hmtk520/1982179,如需轉載請自行聯系原作者