shell 之 数组
函数传参使用场景示例,需求描述:写一个脚本,实现nginx服务的启动、停止、重启。
[root@shell day06]# cat nginx.sh
#!/bin/bash
source /etc/init.d/functions
if [ $# -ne 1 ];then
echo "Usage: $0 {start|stop|status|reload|restart}"
exit
fi
rc=$1
retu() {
if [ $? -eq 0 ];then
action "Nginx is $rc 成功!" /bin/true
else
action "Nginx is $rc 失败!" /bin/false
fi
}
start() {
if [ ! -f /var/run/nginx.pid ];then
/usr/sbin/nginx
retu
else
echo "Nginx 服务正在运行....."
fi
}
stop() {
if [ -f /var/run/nginx.pid ];then
/usr/sbin/nginx -s stop
retu
else
echo "Nginx 服务不在运行......"
fi
}
reload() {
if [ -f /var/run/nginx.pid ];then
/usr/sbin/nginx -s reload
retu
else
echo "Nginx 服务不在运行,无法进行重启!"
fi
}
status() {
if [ -f /var/run/nginx.pid ];then
echo "Nginx 服务正在运行....."
else
echo ""Nginx 服务不在运行.....
fi
}
case $rc in
start)
start
;;
stop)
stop
;;
reload)
reload
;;
restart)
rc=stop
stop
sleep 2
rc=start
start
;;
status)
status
;;
*)
echo "Usage: $0 {start|stop|status|reload|restart}"
exit
esac
echo 数据
return 返回状态码 0-255 正整数 0 成功 非0 失败
[root@shell day06]# cat state.sh
#!/bin/bash
fun() {
echo 100
return 1
}
tt=$(fun)
echo 当前返回的数据为$tt ,状态码为 $?
[root@shell day06]# cat state-1.sh
#!/bin/bash
fun(){
if [ -f /etc/hosts ];then
return 1
else
return 2
fi
}
fun && echo "文件存在" || echo "文件不存在"
Shell函数返回值场景练习,例:猜数字游戏。
1.如果用户输入的数值大于0且小于10则返回0
2.如果用户输入的数值大于等于10且小于20则返回1
3.如果用户输入的数值大于等于20且小于30则返回2
4.输入其余数值则返回3
[root@shell day06]# cat state-2.sh
#!/bin/bash
return_num () {
read -p "请输入一个数字:" num
if [ $num -gt 0 -a $num -lt 10 ];then
return 0
elif [ $num -ge 10 -a $num -lt 20 ];then
return 1
elif [ $num -ge 20 -a $num -lt 30 ];then
return 2
else
return 3
fi
}
return_num
rc=$?
case $rc in
0)
echo "你输入的数字大于0且小于10。"
;;
1)
echo "你输入的数字大于等于10且小于20。"
;;
2)
echo "你输入的数字大于等于20且小于30。"
;;
3)
echo "你输入的数字不认识。"
esac
作业
- 系统初始化版本
3. 编写系统管理工具箱
查看内存的使用情况
查看磁盘的使用情况
查看系统的负载
等等
q键退出程序
[root@qiudao /scripts]# cat case-6.sh
#!/bin/bash
menu() {
cat <<-EOF
#############################
## h 命令帮助
## d 磁盘使用情况
## m 内存使用情况
## v 系统版本
## k 系统内核版本
## n 系统静态主机名
## e eth0网卡ip地址
## i 外网ip地址
## u 系统负载情况
## q 退出程序
#############################
EOF
}
menu
while true
do
read -p "根据上方的菜单,选择你要查看的信息: " sys
case $sys in
h)
clear
menu
;;
d)
clear
df -h
;;
m)
clear
free -m
;;
v)
clear
awk '{print $1,$2,$4}' /etc/redhat-release
;;
k)
clear
uname -r
;;
n)
clear
hostnamectl|grep "Static hostname"|awk '{print $3}'
;;
e)
clear
ifconfig eth0|awk 'NR==2{print $2}'
;;
i)
clear
curl -s icanhazip.com
;;
q)
clear
exit
;;
*)
clear
echo "USAGE: $0 [ h | d | m | v | k | n | e | i | q ]"
esac
done
数组
普通数组 只能用数字作为索引,不需要指定
关联数组 可以使用字符作为索引,需要指定
普通数组定义
[root@shell day06]# array1[0]=jinke
[root@shell day06]# array1[1]=zhangsong
[root@shell day06]# array1[2]=shaobai
[root@shell day06]# array2=(linux python mysql)
[root@shell day06]# array3=($(cat /etc/hosts))
#查看普通数组的值
#查看数组的索引个数
[root@shell day06]# echo ${#array1[@]}
3
#查看所有索引的名称
[root@shell day06]# echo ${!array1[@]}
0 1 2
#查看数组的所有值
[root@shell day06]# echo ${array1[@]}
jinke zhangsong shaobai
#查看0索引对应的值
[root@shell day06]# echo ${array1[0]}
jinke
[root@shell day06]# echo ${array1[1]}
zhangsong
#从第一列开始显示1列值,默认是从0列开始计算
[root@shell day06]# echo ${array1[@]:1:1}
zhangsong
[root@shell day06]# echo ${array1[@]:0:1}
jinke
[root@shell day06]# echo ${#array2[*]}
3
[root@shell day06]# echo ${!array2[*]}
0 1 2
[root@shell day06]# echo ${array2[*]}
linux python mysql
[root@shell day06]# echo ${array2[1]}
python
[root@shell day06]# echo ${array2[0]}
linux
#查看所有的普通数组
[root@shell day06]# declare
[root@shell day06]# echo ${!array3[*]}
0 1 2 3 4 5 6 7 8 9
[root@shell day06]# echo ${array3[0]}
127.0.0.1
[root@shell day06]# echo ${array3[9]}
localhost6.localdomain6
关联数组
#指定该数组为关联数组
[root@shell day06]# declare -A guanlian
#定义关联数组
[root@shell day06]# guanlian=([name]=jinke [age]=18 [skill]=yangzhu)
[root@shell day06]# echo ${#guanlian[@]}
3
[root@shell day06]# echo ${!guanlian[@]}
name age skill
[root@shell day06]# echo ${guanlian[@]}
jinke 18 yangzhu
[root@shell day06]# echo ${guanlian[name]}
jinke
[root@shell day06]# echo ${guanlian[age]}
18
[root@shell day06]# echo ${guanlian[skill]}
yangzhu
#普通数组
[root@shell day06]# putong=([3]=zhangsong [5]=shell)
[root@shell day06]# echo ${!putong[@]}
3 5
[root@shell day06]# echo ${putong[@]}
zhangsong shell
[root@shell day06]# echo ${putong[5]}
shell
数组遍历与循环
方式二:通过数组元数的索引进行遍历(推荐) 注意: 将统计的对象作为数组的索引,仅针对关联数据。
01.普通数组赋值与遍历示例
[root@shell day06]# cat array-1.sh
#!/bin/bash
while read line
do
host_array[i++]=$line
done </etc/hosts
for i in ${!host_array[@]}
do
echo "host_array 数组的索引:$i ,对应的值为:${host_array[$i]}"
done
[root@shell day06]# sh array-1.sh
host_array 数组的索引:0 ,对应的值为:127.0.0.1 localhost localhost.localdomain localhost4 localhost4.localdomain4
host_array 数组的索引:1 ,对应的值为:::1 localhost localhost.localdomain localhost6 localhost6.localdomain6
[root@shell day06]# cat array-1.sh
#!/bin/bash
while read line
do
host_array[i++]=$line
a=$(($i-1))
echo $a ${host_array[$a]}
done </etc/hosts
02.使用关联数组统计文件中的每个Shell数量
[root@shell day06]# cat array-2.sh
#!/bin/bash
declare -A shell_num
while read line
do
Shell=$(echo $line |awk -F: '{print $NF}')
let shell_num[$Shell]++
done </etc/passwd
for j in ${!shell_num[@]}
do
echo "当前shell为:$j ,存在的数量为:${shell_num[$j]}"
done
- 统计Nginx日志IP访问次数
[root@git day6]# cat array4.sh
#!/bin/bash
declare -A shell_num
while read line
do
shell=$(echo $line |awk '{ print $1 }')
let shell_num[$shell]++
done < driverzeng.com_access.log
for j in ${!shell_num[@]}
do
echo "当前shell $j, 存在的数量为 ${shell_num[$j]}"
done
-
统计tcp的状态信息
[root@git day6]# cat tcp.sh #!/bin/bash declare -A shell_num shell=$(netstat -ant|awk 'NR>2 {print $NF}') for i in $shell do let shell_num[$i]++ done for j in ${!shell_num[@]} do echo "当前shell $j, 存在的数量为 ${shell_num[$j]}" done