Shell-day12
1. 昨日回顾
Shell函数相关介绍
函数的语法示例 两种定义的方式
函数名() {} function 函数名 {}
函数的参数传递 $1 $2 $3 ... 函数的参数和脚本的参数是不一样的
函数的参数传递案例
Nginx启动停止脚本
布置了课后作业:
一键化安装LNMP架构脚本 搭建WordPress
2. 函数状态返回介绍
执行命令之后的返回状态 状态码
两种 echo return
echo 返回数据,返回任何的字符串,自定义的数据
return 返回状态码 只能返回0-255的正整数 给函数返回一个状态码,然后在其他地方进行调用,
0 表示成功 非0表示失败 $?
3. 函数状态返回的语法案例
[root@qls /service/scripts/day12]
fun1() {
echo "1"
return 2
}
a=$(fun1)
echo "函数的状态码值为:$?"
echo "函数的返回值(函数的执行输出结果):$a"
[root@qls /service/scripts/day12]
函数的状态码值为:2
函数的返回值(函数的执行输出结果):1
[root@qls /service/scripts/day12]
File() {
if [ -f /etc/hosts ];then
return 0
else
return 1
fi
}
File && echo "文件存在!" || echo "文件不存在!"
[root@qls /service/scripts/day12]
文件存在!
[root@qls /service/scripts/day12]
-rw-r--r-- 1 root root 158 2020-04-25 23:08 /etc/hosts
[root@qls /service/scripts/day12]
[root@qls /service/scripts/day12]
文件不存在!
[root@qls /service/scripts/day12]
[root@qls /service/scripts/day12]
File() {
if [ -f /etc/hosts ];then
return 3
else
return 0
fi
}
File && echo "文件存在!" || echo "文件不存在!"
[root@qls /service/scripts/day12]
-rw-r--r-- 1 root root 158 2020-04-25 23:08 /etc/hosts
[root@qls /service/scripts/day12]
文件不存在!
[root@qls /service/scripts/day12]
[root@qls /service/scripts/day12]
文件存在!
[root@qls /service/scripts/day12]
Nginx() {
ps aux| grep nginx |grep -Ev "grep|$$" &>/dev/null
if [ $? -eq 0 ];then
return 1
else
return 0
fi
}
Nginx && echo "Nginx进程不存在!" || echo "Nginx进程存在!"
4. 判断数字的范围
1. 提示用户输入一个数字,要进行判断
2. 如果用户输入的数值大于等于0且小于10 则返回状态码为0
3. 如果用户输入的数值大于等于10且小于20 则返回状态码为1
4. 如果用户输入的数值大于等于20且小30 则返回状态码为2
5. 输入其他数值 则返回3
6. 根据返回的状态进行判断 数值在什么范围 5这个数字大于等于0且小于10
[root@qls /service/scripts/day12]
fun() {
read -p "请输入一个0-30之间的数字: " Num
if [[ ! $Num =~ ^[0-9]+$ ]];then
echo "你输入的不符合要求"
continue
fi
if [ $Num -eq 666 ];then
exit
fi
if [ $Num -ge 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
}
while true
do
fun
Return=$?
case $Return in
0)
echo "你输入的数字为: $Num,该数字大于等于0且小于10."
;;
1)
echo "你输入的数字为: $Num,该数字大于等于10且小于20."
;;
2)
echo "你输入的数字为: $Num,该数字大于等于20且小于30."
;;
3)
echo "你输入的数字为: $Num,不在判断范围之内!请重新输入!"
continue
;;
esac
done
作业:
系统初始化操作:
使用函数编写个脚本,实现系统初始化操作
5. Shell的数组概述
什么是数组?
数组也是变量的一种
传统的变量只能存储一个值,但是数组可以存储多个值。
数组的分类
普通数组和关联数组 索引
普通数组:只能使用正整数作为数组索引
关联数组:不管可以使用整数作为索引,同时也可以使用字符串作为索引
6. 普通数组的使用
1. 单个赋值
[root@qls /service/scripts/day12]
[root@qls /service/scripts/day12]
[root@qls /service/scripts/day12]
[root@qls /service/scripts/day12]
2. 赋值多个值
[root@qls /service/scripts/day12]
[root@qls /service/scripts/day12]
root@qls /service/scripts/day12]
3. 通过命令进行赋值
[root@qls /service/scripts/day12]
[root@qls /service/scripts/day12]
declare -a BASH_ARGC='()'
declare -a BASH_ARGV='()'
declare -a BASH_LINENO='()'
declare -ar BASH_REMATCH='()'
declare -a BASH_SOURCE='()'
declare -ar BASH_VERSINFO='([0]="4" [1]="2" [2]="46" [3]="2" [4]="release" [5]="x86_64-redhat-linux-gnu")'
declare -a DIRSTACK='()'
declare -a FUNCNAME='()'
declare -a GROUPS='()'
declare -a PIPESTATUS='([0]="0")'
declare -a array1='([0]="linux" [1]="nginx" [2]="php-fpm" [3]="mariadb")'
declare -a array2='([0]="linux" [1]="apache" [2]="php-fpm" [3]="mariadb")'
declare -a array3='([0]="linux" [1]="apache" [2]="php fpm" [3]="mariadb")'
declare -a array4='([0]="linux" [1]="apache" [6]="php-fpm" [7]="mariadb")'
declare -a array5='([0]="127.0.0.1" [1]="localhost" [2]="localhost.localdomain" [3]="localhost4" [4]="localhost4.localdomain4" [5]="::1" [6]="localhost" [7]="localhost.localdomain" [8]="localhost6" [9]="localhost6.localdomain6")'
[root@qls /service/scripts/day12]
4
[root@qls /service/scripts/day12]
4
[root@qls /service/scripts/day12]
5
[root@qls /service/scripts/day12]
linux
[root@qls /service/scripts/day12]
nginx
[root@qls /service/scripts/day12]
php-fpm
[root@qls /service/scripts/day12]
mariadb
[root@qls /service/scripts/day12]
linux nginx php-fpm mariadb
[root@qls /service/scripts/day12]
linux nginx php-fpm mariadb
[root@qls /service/scripts/day12]
0 1 6 7
[root@qls /service/scripts/day12]
0 1 6 7
[root@qls /service/scripts/day12]
0 1 2 3
[root@qls /service/scripts/day12]
nginx php-fpm mariadb
[root@qls /service/scripts/day12]
linux nginx php-fpm mariadb
[root@qls /service/scripts/day12]
linux nginx
[root@qls /service/scripts/day12]
nginx php-fpm
[root@qls /service/scripts/day12]
php-fpm mariadb
7. 关联数组的应用
[root@qls /service/scripts/day12]
[root@qls /service/scripts/day12]
1. 单个进行赋值
[root@qls /service/scripts/day12]
[root@qls /service/scripts/day12]
[root@qls /service/scripts/day12]
2. 赋值多个
[root@qls /service/scripts/day12]
[root@qls /service/scripts/day12]
[root@qls /service/scripts/day12]
declare -A g_array1='([name]="qls" [age]="18" [skill]="linux" )'
declare -A g_array2='([name]="haoda" [age]="30" [skill]="linux" )'
[root@qls /service/scripts/day12]
[root@qls /service/scripts/day12]
3
[root@qls /service/scripts/day12]
3
[root@qls /service/scripts/day12]
3
[root@qls /service/scripts/day12]
qls
[root@qls /service/scripts/day12]
18
[root@qls /service/scripts/day12]
linux
[root@qls /service/scripts/day12]
qls 18 linux
[root@qls /service/scripts/day12]
qls 18 linux
[root@qls /service/scripts/day12]
name age skill
[root@qls /service/scripts/day12]
name age skill
[root@qls /service/scripts/day12]
qls 18 linux
[root@qls /service/scripts/day12]
18 linux
[root@qls /service/scripts/day12]
linux
[root@qls /service/scripts/day12]
18
[root@qls /service/scripts/day12]
18 linux
[root@qls /service/scripts/day12]
qls 18
[root@qls /service/scripts/day12]
qls
[root@qls /service/scripts/day12]
[root@qls /service/scripts/day12]
qiudao
[root@qls /service/scripts/day12]
8. 数组遍历与循环
1. 通过数组的元数个数进行遍历 不用 不推荐
2. 通过数组的索引进行遍历 推荐 必会 关联数组
[root@qls /service/scripts/day12]
i=0
while read line
do
Passwd[$i]=$line
let i++
done < /etc/passwd
for n in ${!Passwd[*]}
do
echo -e "Passwd数组的索引为:$n\t\t对应的值为:${Passwd[$n]}"
done
[root@qls /service/scripts/day12]
Passwd数组的索引为:0 对应的值为:root:x:0:0:root:/root:/bin/bash
Passwd数组的索引为:1 对应的值为:bin:x:1:1:bin:/bin:/sbin/nologin
Passwd数组的索引为:2 对应的值为:daemon:x:2:2:daemon:/sbin:/sbin/nologin
Passwd数组的索引为:3 对应的值为:adm:x:3:4:adm:/var/adm:/sbin/nologin
Passwd数组的索引为:4 对应的值为:lp:x:4:7:lp:/var/spool/lpd:/sbin/nologin
Passwd数组的索引为:5 对应的值为:sync:x:5:0:sync:/sbin:/bin/sync
Passwd数组的索引为:6 对应的值为:shutdown:x:6:0:shutdown:/sbin:/sbin/shutdown
1. 根据passwd文件,取出每一种shell的数量
[root@qls /service/scripts/day12]
declare -A Array_Shells
while read line
do
let Array_Shells[${line##*:}]++
done < /etc/passwd
for i in ${!Array_Shells[*]}
do
echo -e "Shell: $i\t\tCount: ${Array_Shells[$i]}"
done
[root@qls /service/scripts/day12]
Shell: /sbin/nologin Count: 24
Shell: /bin/sync Count: 1
Shell: /bin/bash Count: 23
Shell: /sbin/shutdown Count: 1
Shell: /sbin/halt Count: 1
[root@qls /service/scripts/day12]
50 /etc/passwd
[root@qls /service/scripts/day12]
23 /bin/bash
1 /bin/sync
1 /sbin/halt
24 /sbin/nologin
1 /sbin/shutdown
[root@qls /service/scripts/day12]
[root@qls /service/scripts/day12]
[root@qls /service/scripts/day12]
[root@qls /service/scripts/day12]
[root@qls /service/scripts/day12]
[root@qls /service/scripts/day12]
[root@qls /service/scripts/day12]
[root@qls /service/scripts/day12]
[root@qls /service/scripts/day12]
5
[root@qls /service/scripts/day12]
[root@qls /service/scripts/day12]
[root@qls /service/scripts/day12]
3
[root@qls /service/scripts/day12]
[root@qls /service/scripts/day12]
1
[root@qls /service/scripts/day12]
[root@qls /service/scripts/day12]
[root@qls /service/scripts/day12]
[root@qls /service/scripts/day12]
4
作业:
1. 统计出访问日志中每个IP的访问次数
2. 统计出访问日志中每个状态码的数量
3. 统计出访问日志中每个URL访问次数
4. 统计tcp的11中状态的数量
5. 系统初始化脚本:
使用函数编写个脚本,实现系统初始化操作
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· AI与.NET技术实操系列:基于图像分类模型对图像进行分类
· go语言实现终端里的倒计时
· 如何编写易于单元测试的代码
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 分享一个免费、快速、无限量使用的满血 DeepSeek R1 模型,支持深度思考和联网搜索!
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· ollama系列01:轻松3步本地部署deepseek,普通电脑可用
· 25岁的心里话
· 按钮权限的设计及实现