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
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] //在[ ]之内的 或者,和
本文转自MT_IT51CTO博客,原文链接:http://blog.51cto.com/hmtk520/1982179,如需转载请自行联系原作者