shell脚本知识点12

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]# cat fun-1.sh
#!/bin/bash
fun1() {
    echo "1"
    return 2
}
a=$(fun1)
echo "函数的状态码值为:$?"
echo "函数的返回值(函数的执行输出结果):$a"
[root@qls /service/scripts/day12]# sh fun-1.sh
函数的状态码值为:2
函数的返回值(函数的执行输出结果):1

#return场景示例

[root@qls /service/scripts/day12]# cat return-1.sh
#!/bin/bash
File() {
    if [ -f /etc/hosts ];then
        return 0
    else
        return 1
    fi
}
File && echo "文件存在!" || echo "文件不存在!"
[root@qls /service/scripts/day12]# sh return-1.sh
文件存在!
[root@qls /service/scripts/day12]# ll /etc/hosts
-rw-r--r-- 1 root root 158 2020-04-25 23:08 /etc/hosts
[root@qls /service/scripts/day12]# mv /etc/hosts /etc/host
[root@qls /service/scripts/day12]# sh return-1.sh
文件不存在!
[root@qls /service/scripts/day12]# mv /etc/host /etc/hosts

[root@qls /service/scripts/day12]# cat return-1.sh
#!/bin/bash
File() {
    if [ -f /etc/hosts ];then
        return 3
    else
        return 0
    fi
}
File && echo "文件存在!" || echo "文件不存在!"
[root@qls /service/scripts/day12]# ll /etc/hosts
-rw-r--r-- 1 root root 158 2020-04-25 23:08 /etc/hosts
[root@qls /service/scripts/day12]# sh return-1.sh 
文件不存在!
[root@qls /service/scripts/day12]# mv /etc/hosts /etc/host
[root@qls /service/scripts/day12]# sh return-1.sh 
文件存在!


[root@qls /service/scripts/day12]# cat nginx.sh
#!/bin/bash
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]# cat return-2.sh
#!/bin/bash
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]# array1[0]=linux
[root@qls /service/scripts/day12]# array1[1]=nginx
[root@qls /service/scripts/day12]# array1[2]=php-fpm
[root@qls /service/scripts/day12]# array1[3]=mariadb

2. 赋值多个值  

[root@qls /service/scripts/day12]# array2=(linux apache php-fpm mariadb)

#如果遇到特殊的值
[root@qls /service/scripts/day12]# array3=(linux apache 'php fpm' mariadb)

#自定义索引号  

root@qls /service/scripts/day12]# array4=(linux apache [6]=php-fpm mariadb)

3. 通过命令进行赋值 

[root@qls /service/scripts/day12]# array5=($(cat /etc/hosts))

#获取数组的内容

#显示系统中所有的已定义的普通数组
[root@qls /service/scripts/day12]# declare -a 
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]# echo ${#array1[*]}
4
[root@qls /service/scripts/day12]# echo ${#array1[@]}
4

#获取某个索引值的长度 

[root@qls /service/scripts/day12]# echo ${#array1[0]}
5

#获取数组中的某一个值  元数  

[root@qls /service/scripts/day12]# echo ${array1[0]}
linux
[root@qls /service/scripts/day12]# echo ${array1[1]}
nginx
[root@qls /service/scripts/day12]# echo ${array1[2]}
php-fpm
[root@qls /service/scripts/day12]# echo ${array1[3]}
mariadb

#获取数组中所有的元数 值

[root@qls /service/scripts/day12]# echo ${array1[*]}
linux nginx php-fpm mariadb
[root@qls /service/scripts/day12]# echo ${array1[@]}
linux nginx php-fpm mariadb

#获取数组中的所有的索引

[root@qls /service/scripts/day12]# echo ${!array4[*]}
0 1 6 7
[root@qls /service/scripts/day12]# echo ${!array4[@]}
0 1 6 7
[root@qls /service/scripts/day12]# echo ${!array1[@]}
0 1 2 3

#从某个索引开始显示,显示剩下的所有  
[root@qls /service/scripts/day12]# echo ${array1[@]:1}
nginx php-fpm mariadb
[root@qls /service/scripts/day12]# echo ${array1[@]:0}
linux nginx php-fpm mariadb

#从某个索引开始,访问几个值 
[root@qls /service/scripts/day12]# echo ${array1[@]:0:2}
linux nginx
[root@qls /service/scripts/day12]# echo ${array1[@]:1:2}
nginx php-fpm
[root@qls /service/scripts/day12]# echo ${array1[@]:2:2}
php-fpm mariadb

7. 关联数组的应用


#赋值    定义关联数组需要声明  

[root@qls /service/scripts/day12]# #声明关联数组
[root@qls /service/scripts/day12]# declare -A g_array1


1. 单个进行赋值

[root@qls /service/scripts/day12]# g_array1[name]=qls
[root@qls /service/scripts/day12]# g_array1[age]=18
[root@qls /service/scripts/day12]# g_array1[skill]=linux

2. 赋值多个  

[root@qls /service/scripts/day12]# declare -A g_array2
[root@qls /service/scripts/day12]# g_array2=([name]=haoda [age]=30 [skill]=linux)

#调用关联数组 

#显示所有的关联数组 
[root@qls /service/scripts/day12]# declare  -A | tail -2
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]# unset  g_array3


#获取数组中元数的个数   值的个数  索引的个数  

[root@qls /service/scripts/day12]# echo ${#g_array1[*]}
3
[root@qls /service/scripts/day12]# echo ${#g_array1[@]}
3

#获取某个索引值的长度 

[root@qls /service/scripts/day12]# echo ${#g_array1[name]}
3

#获取数组中的某一个值  元数 

[root@qls /service/scripts/day12]# echo ${g_array1[name]}
qls
[root@qls /service/scripts/day12]# echo ${g_array1[age]}
18
[root@qls /service/scripts/day12]# echo ${g_array1[skill]}
linux

#获取数组中所有的元数 值

[root@qls /service/scripts/day12]# echo ${g_array1[*]}
qls 18 linux
[root@qls /service/scripts/day12]# echo ${g_array1[@]}
qls 18 linux

#获取数组中所有的索引

[root@qls /service/scripts/day12]# echo ${!g_array1[@]}
name age skill
[root@qls /service/scripts/day12]# echo ${!g_array1[*]}
name age skill

#从某个索引(索引对应的位置从1开始)开始显示,显示剩下的所有   1 2 3 

[root@qls /service/scripts/day12]# echo ${g_array1[*]:1}
qls 18 linux
[root@qls /service/scripts/day12]# echo ${g_array1[*]:2}
18 linux
[root@qls /service/scripts/day12]# echo ${g_array1[*]:3}
linux

#从某个索引的位置开始,显示几个索引值
[root@qls /service/scripts/day12]# echo ${g_array1[*]:2:1}
18
[root@qls /service/scripts/day12]# echo ${g_array1[*]:2:2}
18 linux
[root@qls /service/scripts/day12]# echo ${g_array1[*]:1:2}
qls 18

#替换某个索引的值
[root@qls /service/scripts/day12]# echo ${g_array1[name]}
qls
[root@qls /service/scripts/day12]# g_array1[name]=qiudao
[root@qls /service/scripts/day12]# echo ${g_array1[name]}
qiudao

#删除某个索引的值
[root@qls /service/scripts/day12]# unset g_array1[name]

8. 数组遍历与循环


1. 通过数组的元数个数进行遍历  不用  不推荐 

2. 通过数组的索引进行遍历   推荐   必会    关联数组  

#普通数组的遍历与循环  批量赋值  批量打印  


[root@qls /service/scripts/day12]# cat array-1.sh
#!/bin/bash
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]# sh array-1.sh
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]# cat array-2.sh
#!/bin/bash
#声明关联数组
declare -A  Array_Shells
#批量赋值
while read line
do
    #赋值  
    #Type=$(echo $line | awk -F: '{print $NF}')
    # /bin/bash  这个是索引   对应的值  次数 数字
    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]# sh array-2.sh
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]# wc -l /etc/passwd 
50 /etc/passwd
[root@qls /service/scripts/day12]# awk -F: '{print $NF}' /etc/passwd | sort | uniq -c 
     23 /bin/bash
      1 /bin/sync
      1 /sbin/halt
     24 /sbin/nologin
      1 /sbin/shutdown

[root@qls /service/scripts/day12]# declare -A  Array_Shells
[root@qls /service/scripts/day12]# Array_Shells[/bin/bash]=1
[root@qls /service/scripts/day12]# Array_Shells[/bin/sync]=1
[root@qls /service/scripts/day12]# Array_Shells[/sbin/nologin]=1
[root@qls /service/scripts/day12]# let Array_Shells[/bin/bash]++
[root@qls /service/scripts/day12]# let Array_Shells[/bin/bash]++
[root@qls /service/scripts/day12]# let Array_Shells[/bin/bash]++
[root@qls /service/scripts/day12]# let Array_Shells[/bin/bash]++
[root@qls /service/scripts/day12]# echo ${Array_Shells[/bin/bash]}
5
[root@qls /service/scripts/day12]# let Array_Shells[/sbin/nologin]++
[root@qls /service/scripts/day12]# let Array_Shells[/sbin/nologin]++
[root@qls /service/scripts/day12]# echo ${Array_Shells[/sbin/nologin]}
3
[root@qls /service/scripts/day12]# let a++
[root@qls /service/scripts/day12]# echo $a
1
[root@qls /service/scripts/day12]# let a++
[root@qls /service/scripts/day12]# let a++
[root@qls /service/scripts/day12]# let a++
[root@qls /service/scripts/day12]# echo $a
4

作业: 

	1. 统计出访问日志中每个IP的访问次数
	
	2. 统计出访问日志中每个状态码的数量
	
	3. 统计出访问日志中每个URL访问次数
	
	4. 统计tcp的11中状态的数量  

	5. 系统初始化脚本:

		使用函数编写个脚本,实现系统初始化操作 
	
posted @   zbzSH  阅读(28)  评论(0编辑  收藏  举报
编辑推荐:
· AI与.NET技术实操系列:基于图像分类模型对图像进行分类
· go语言实现终端里的倒计时
· 如何编写易于单元测试的代码
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
阅读排行:
· 分享一个免费、快速、无限量使用的满血 DeepSeek R1 模型,支持深度思考和联网搜索!
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· ollama系列01:轻松3步本地部署deepseek,普通电脑可用
· 25岁的心里话
· 按钮权限的设计及实现
点击右上角即可分享
微信分享提示