1、数组
1.1 数组分类
普通数组:只能使用整数作为数组索引(元素的下标)
关联数组:可以使用字符串作为数组索弓|(元素的下标)
1.2 普通数组定义
一次赋予一个值
数组名[索引下标],下标从0开始
arrya[0]=v1
arrya[1]=v2
arrya[2]=v3
一次赋予多个值
数组名=(值1 值2 值3 ...)
array=(var1 var2 var3 var4)
array1=(`cat /etc/passwd`) 将文件中每一行(或者空格为分隔符)赋值给array1数组
array2=(`ls /root`)
array3=(harry fl jack "Miss Liao")
array4=(1 2 3 4 "he11o world" [10]=linux) # [10]=linux 表示下标为10的元素为linux
1.3 数组的读取
${数组名[元素下标]}
echo ${array[0]} 获取数组里第一个元素
echo ${array[*]} 获取数组里的所有元素
echo ${#array[*]} 获取数组里所有元素个数
echo ${!array[@]} 获取数组元素的索引下标
或者
echo ${!array4[*]}
echo ${array[@]:1:2} 访问指定的元素; 1代表从下标为1的元素开始获取; 2代表获取后面几个元素
或者
echo ${array[*]:1:2}
1.4 关联数组定义
声明关联数组
declare -A asso_array #asso_array表示关联数组
数组赋值
一次赋一个值
数组名[索引或者下标]=变量值
asso_array[linux]=one
一次赋多个值
asso_array=([name1]=fl [name2]=feng [name3]=lei)
查看关联数组
declare -A
关联数组的查看
echo ${asso_array[name1]}
fl
declare -A books
let books[Shell]++
declare -A
declare -A books='([Shell]="1" )'
# 让关联数组中不存在的下标进行++操作,默认从0开始
1.5 案例
统计web服务的不同连接状态的个数
#!/bin/env bash
#定义一个关联数组
declare -A array
#统计每个状态的个数
states=`ss -atp | grep 80 | cut -d ' -f1` #获取每个连接的状态
for i in $states
do
let array[$i]++
done
#通过遍历数组里的索引和元素打印出来
for j in ${!array[@]}
do
echo $j:${array[$j]}
done
2、case语句
2.1 语法结构
说明:pattern表示需要匹配的模式
case var in 定义变量; var代表变量名
pattern 1) 模式1;用|分割多个模式, 相当于or 例如: hello|world) 匹配hello或者world
command1 需要执行的语句
;; 两个分号代表命令结束
pattern 2)
command2
;;
pattern 3)
command3
;;
*) default,不满足以上模式,默认执行*)下面的语句
command4
;;
esac esac表示case语句结束
2.2 案例
例1:当给程序传入start、 stop、 restart三个不同参数时分别执行相应命令
#!/bin/env bash
case $1 in
start|S)
service apache start &>/dev/null && echo "apache 启动成功"
;;
stop|T)
service apache stop &>/dev/null && echo "apache 停止成功"
;;
reload|R)
service apache restart&>/dev/null && echo "apache 重启完毕"
;;
*)
echo "请输入你要的动作"
;;
esac
例2:脚本提示让用户输入需要管理的服务名,然后提示用户需要对服务做什么操作,如启动,关闭等操作
#!/bin/env bash
read -p "请输入需要操作的服务:" service
case $service in
vsftpd)
read -p "请输出操作:" action
case $action in
start|S)
service vsftpd start &>/dev/null && echo "$service服务已经启动"
;;
stop|T)
service vsftpd stop &>/dev/null && echo "$service服务已经停止"
;;
reload|restart|R)
service vsftpd restart &>/dev/null && echo "$service服务已经重启"
;;
esac
;;
httpd)
echo "apache is running..."
;;
*)
echo "请输入需要管理的服务名称(vsftpd)"
;;
esac