shell脚本知识点11

Shell-day11

1. 上周回顾


1. Shell编程介绍  

2. 什么是Shell,为什么学习Shell,任何学习好Shell,Shell能干什么  

3. Shell的开发规范习惯,Shell的执行方式

4. 登录式Shell和非登录式Shell  交互式  非交互式

5. Shell的变量介绍  

6. 用户自定义变量 环境变量  位置变量  预定义变量 

7. 变量的定义实战  

8. Shell变量的read复制 

9. Shell的变量替换  

10. Shell的变量运算  

11. 流程控制语句介绍

12. 流程控制语句之文件比较 

13. 流程控制语句之整数比较 

14. 函数库的应用  

15. 流程控制语句之字符比较 

16. 流程控制语句之多条件比较  

17. 流程控制语句之正则比较

18. 流程控制语句之case语句

19. 循环语句之For循环

20. For循环取值方式 

21. 循环语句之while循环 

22. 循环语句之until循环 

23. 跳出循环的内置指令  

2. Shell函数基本介绍


什么是函数?

	函数其实就是一堆命令的集合,用来完成特定的功能代码块,方便后期调用。
	
函数的作用:

	函数可以将代码进行模块化,便于后期的代码的复用,增加脚本的可读性  
	
	函数和变量类似,先定义,后引用,直接写函数名就能直接引用  不引用就不会执行函数
	

3. 函数的语法示例


#1. 如何定义函数   定义函数有两种方式 

#方式一

函数名() {
    command1
    command2
    .....
}

变量名=值  command

#方式二

function 函数名 {
    command1
    command2
    ........
}

#定义函数
[root@qls ~]# fun1() { echo "hello";}

#调用函数
[root@qls ~]# fun1
hello
[root@qls ~]# fun2() { echo "hello"; echo $USER ;}
[root@qls ~]# fun2
hello
root


[root@qls ~]# function fun3 { echo "test"; }
[root@qls ~]# fun3
test
[root@qls ~]# function fun4 { echo "Test";echo $UID;}
[root@qls ~]# fun4
Test
0

[root@qls /service/scripts/day11]# cat fun-1.sh
#!/bin/bash
#定义函数
fun1() {
    echo "Test"
}
#调用函数
fun1
[root@qls /service/scripts/day11]# sh fun-1.sh
Test

[root@qls /service/scripts/day11]# cat fun-2.sh
#!/bin/bash
#定义函数
function fun1 {
    echo "Test"
}
#引用函数
fun1
[root@qls /service/scripts/day11]# sh fun-2.sh
Test

4. 函数的参数传递


函数参数传递跟脚本类似  都是使用$1 $2 .. $9 .... 

[root@qls /service/scripts/day11]# cat fun-3.sh
#!/bin/bash
fun1() {
    echo "$1"	#函数的第一个位置参数
}
fun1 $1 		#脚本将第一个位置参数传递给函数
[root@qls /service/scripts/day11]# sh fun-3.sh test
test

[root@qls /service/scripts/day11]# cat fun-3.sh
#!/bin/bash
fun1() {
    echo "$1"
}
fun1 hello 
[root@qls /service/scripts/day11]# sh fun-3.sh
hello

#函数使用变量  
[root@qls /service/scripts/day11]# cat fun-3.sh
#!/bin/bash
fun1() {
    echo "$Num"
}
Num=1
fun1 
[root@qls /service/scripts/day11]# sh fun-3.sh
1

#函数中使用局部变量  
[root@qls /service/scripts/day11]# cat fun-3.sh
#!/bin/bash
fun1() {
    local Num=1
    echo "$Num"
}
fun1 
echo "变量Num值为: $Num"
[root@qls /service/scripts/day11]# sh fun-3.sh
1
变量Num值为: 


[root@qls /service/scripts/day11]# cat fun-3.sh
#!/bin/bash
fun1() {
    echo "$Num"
}
Num=$1	#将脚本的第一个位置参数传递给变量Num
fun1 
[root@qls /service/scripts/day11]# sh fun-3.sh test
test

#传递多个参数 

[root@qls /service/scripts/day11]# cat fun-3.sh
#!/bin/bash
fun1() {
    echo "$1"	#接收函数的传递的第一个位置变量
}
fun1 $1		#接收脚本的第一个位置变量,传入到函数算第一个位置变量 
fun1 $2		#接收脚本的第二个位置变量,传入到函数算第一个位置变量
fun1 $3		#接收脚本的第三个位置变量,传入到函数算第一个位置变量 
[root@qls /service/scripts/day11]# sh fun-3.sh  123 456 789
123
456
789


[root@qls /service/scripts/day11]# cat fun-3.sh 
#!/bin/bash
fun1() {
    echo "$1"		#接收函数的第一个位置参数
}
fun1 $1 $2 $3		#接收脚本的第一个第二个第三个位置变量 传递给函数也是三个位置
fun1 $3				#接收脚本第三个位置变量,传递给函数为第一个位置变量
fun1 $2				#接收脚本第二个位置变量,传递给函数为第一个位置变量
[root@qls /service/scripts/day11]# sh fun-3.sh  123 456 789
123
789
456


[root@qls /service/scripts/day11]# cat fun-3.sh
#!/bin/bash
fun1() {
    echo "$1 $2 $3"
}
Test=$(fun1 $1 $2 $3)
echo $Test
[root@qls /service/scripts/day11]# sh fun-3.sh  123 456 789
123 456 789


[root@qls /service/scripts/day11]# cat fun-3.sh
#!/bin/bash
fun1() {
    echo "$*"   # 或者  $@
}
Test=$(fun1 $*)
echo $Test
[root@qls /service/scripts/day11]# sh fun-3.sh  123 456 789
123 456 789
[root@qls /service/scripts/day11]# sh fun-3.sh  123 456 789 abc cba
123 456 789 abc cba
[root@qls /service/scripts/day11]# 


函数的位置变量跟脚本的位置变量作用是类似的,但是函数的位置变量不等于脚本的位置变量,脚本的位置变量不等于函数的位置变量,两者不能混为一谈。



[root@qls /service/scripts/day11]# cat fun-3.sh
#!/bin/bash
fun1() {
    Test=hello
    echo "$Test"
}
fun1
echo "Test变量值为:$Test"
[root@qls /service/scripts/day11]# sh fun-3.sh
hello
Test变量值为:hello
[root@qls /service/scripts/day11]# vim fun-3.sh
[root@qls /service/scripts/day11]# cat fun-3.sh
#!/bin/bash
fun1() {
    local Test=hello
    echo "$Test"
}
fun1
echo "Test变量值为:$Test"
[root@qls /service/scripts/day11]# sh fun-3.sh
hello
Test变量值为:

[root@qls /service/scripts/day11]# cat fun-3.sh
#!/bin/bash
fun1() {
    Test=hello
    echo "$Test"
}
echo "Test变量值为:$Test"
[root@qls /service/scripts/day11]# sh fun-3.sh
Test变量值为:

函数中调用局部变量时,一定要加上local  使用全局变量时,将变量定义在脚本中,而不是函数中,变量一定要定义在调用函数的前面。

[root@qls /service/scripts/day11]# cat fun-3.sh
#!/bin/bash
fun1() {
    echo "$Test"
}
fun1
Test=hell0
echo "Test变量值为:$Test"
[root@qls /service/scripts/day11]# sh fun-3.sh

Test变量值为:hell0

5. 函数参数传递案例


#编写一个计算器脚本,使用函数实现  

执行脚本时,需要在脚本后面加上计算的数字及操作符

sh  scripts  1 + 1 

执行结果

1 + 1 = 2

sh  scripts  1 - 1 

1 - 1 = 0

#第一种
[root@qls /service/scripts/day11]# cat fun-4.sh 
#!/bin/bash
Cale() {
    awk "BEGIN{print $1 $2 $3}"
}
if [ $# -ne 3 ];then
    echo "你输入的参数不等于3个!请重新输入!例:1 + 1"
    exit
fi
echo "$1 $2 $3 = $(Cale $1 "$2" $3)"
[root@qls /service/scripts/day11]# sh fun-4.sh
你输入的参数不等于3个!请重新输入!例:1 + 1
[root@qls /service/scripts/day11]# sh fun-4.sh 1 * 1
你输入的参数不等于3个!请重新输入!例:1 + 1
[root@qls /service/scripts/day11]# sh fun-4.sh 1 \* 1
1 * 1 = 1
[root@qls /service/scripts/day11]# sh fun-4.sh 1 \* 5
1 * 5 = 5
[root@qls /service/scripts/day11]# sh fun-4.sh 1 / 5
1 / 5 = 0.2
[root@qls /service/scripts/day11]# sh fun-4.sh 1 ^ 5
1 ^ 5 = 1
[root@qls /service/scripts/day11]# sh fun-4.sh 2 ^ 5
2 ^ 5 = 32
[root@qls /service/scripts/day11]# sh fun-4.sh 2 % 5
2 % 5 = 2
[root@qls /service/scripts/day11]# sh fun-4.sh 9 % 5
9 % 5 = 4

#第二种

[root@qls /service/scripts/day11]# cat fun-5.sh
#!/bin/bash
Cale() {
    case $2 in
        +|-|/|%|^)
            awk "BEGIN{print $1 $2 $3}"
            ;;
        x)
            awk "BEGIN{print $1 * $3}"
            ;;
        *)  
            echo "你输入的第二个位置参数不是一个操作符!请重新输入"
            exit
    esac
}
if [ $# -ne 3 ];then
    echo "你输入的参数不等于3个!请重新输入!例:1 + 1"
    exit
fi
echo "$1 $2 $3 = $(Cale $1 $2 $3)"

[root@qls /service/scripts/day11]# sh fun-5.sh
你输入的参数不等于3个!请重新输入!例:1 + 1
[root@qls /service/scripts/day11]# sh fun-5.sh 1 + 1
1 + 1 = 2
[root@qls /service/scripts/day11]# sh fun-5.sh 1 - 1
1 - 1 = 0
[root@qls /service/scripts/day11]# sh fun-5.sh 1 / 1
1 / 1 = 1
[root@qls /service/scripts/day11]# sh fun-5.sh 1 % 1
1 % 1 = 0
[root@qls /service/scripts/day11]# sh fun-5.sh 2 ^ 1
2 ^ 1 = 2
[root@qls /service/scripts/day11]# sh fun-5.sh 2 * 1
你输入的参数不等于3个!请重新输入!例:1 + 1
[root@qls /service/scripts/day11]# sh fun-5.sh 2 \* 1
2 * 1 = 你输入的第二个位置参数不是一个操作符!请重新输入
[root@qls /service/scripts/day11]# sh fun-5.sh 2 x 1
2 x 1 = 2
[root@qls /service/scripts/day11]# sh fun-5.sh 2 x 4
2 x 4 = 8

6. 使用函数编写Nginx启动脚本



/usr/sbin/nginx

[root@qls /service/scripts/day11]# cat fun_nginx.sh
#!/bin/bash
#引用函数库
[ -f /etc/init.d/functions ] && source /etc/init.d/functions
#判断当前用户是否为某某用户
if [ $USER != "root" -o $UID -ne 0 ];then
    echo "当前用户${USER}对此脚本${0}没有权限执行!"
    exit
fi
#判断位置变量是否存在且只有一个
if [ $# -ne 1 ];then
    echo "Usage: $0 {start|stop|status|restart|reload}"
    exit
fi
#加锁机制
Suo=/tmp/nginx.lock
if [ -f $Suo ];then
    echo "此脚本${0}正在执行中!请稍后再执行....."
    exit
fi
touch $Suo  &>/dev/null
#编写函数
State=$1
Pid_File=/var/run/nginx.pid
#定义返回状态的函数
Return() {
    if [ $? -eq 0 ];then
        action "Nginx Service $State Successfully!" /bin/true
    else
        action "Nginx Service $State Failed!" /bin/false
    fi
}
#编写语法错误函数
Syntax_Err() {
    local Err_Log=/tmp/nginx_err.log
    /usr/sbin/nginx -t &>$Err_Log
    Err_File=$(awk -F '[ :]' 'NR==1{print $(NF-1)}' $Err_Log)
    Err_Line=$(awk -F '[ :]' 'NR==1{print $NF}' $Err_Log)
    /usr/sbin/nginx -t
    echo "Nginx Syntax Check Failed!Error File is $Err_File,Error Line is $Err_Line"
    read -p "请问你是否选择进行修改配置文件[Yes|No]: " Confirm
    case $Confirm in
        y|Y|Yes|yes)
            vim +$Err_Line $Err_File
            /usr/sbin/nginx -t &>/dev/null
            if [ $? -eq 0 ];then
                State_1() {
                    /usr/sbin/nginx &>/dev/null && sleep 3
                }
                State_2() {
                    /usr/sbin/nginx -s reload &>/dev/null && sleep 3
                }
                if [ $State == "start" ];then
                    State_1
                    Return
                fi
                if [ $State == "reload" ];then
                    State_2
                    Return
                fi
                if [ $State == "stop" -o $State == "restart" ];then
                    /usr/sbin/nginx -s stop &>/dev/null && sleep 3
                    Return
                fi
            else
                action "Nginx Service Syntax Error!" /bin/false
            fi
            ;;
        n|N|No|NO)
            echo "你选择不进行修改配置文件!"
            ;;
        *)
            echo "你输入的不符合要求!"
    esac
}
#编写启动函数
Start() {
    if [ -f $Pid_File ];then
        action "Nginx Service is Running....."  /bin/true
    else
        /usr/sbin/nginx -t &>/dev/null
        if [ $? -eq 0 ];then
            /usr/sbin/nginx &>/dev/null && sleep 3
            Return
        else
            action "Nginx Service Syntax Error!" /bin/false
            Syntax_Err
        fi
    fi
}
#编写停止函数
Stop() {
    if [ -f $Pid_File ];then
        /usr/sbin/nginx -t &>/dev/null
        if [ $? -eq 0 ];then
            /usr/sbin/nginx -s stop &>/dev/null && sleep 3
            Return
        else
            Syntax_Err
        fi
    else
        action "Nginx Service is Not Running....." /bin/true
    fi
}
#编写状态函数
Status() {
    if [ -f $Pid_File ];then
        action "Nginx Service is Running....."  /bin/true
    else
        action "Nginx Service is Not Running....." /bin/true
    fi
}
#编写重启函数
Restart() {
    if [ -f $Pid_File ];then
        local State=stop
        Stop 
        local State=start
        Start
    else
        action "Nginx Service is Not Running....." /bin/true
        Start 
    fi
}
#编写平滑重启操作
Reload() {
    if [ -f $Pid_File ];then
        /usr/sbin/nginx -t &>/dev/null
        if [ $? -eq 0 ];then
            /usr/sbin/nginx -s reload &>/dev/null && sleep 3
            Return
        else
            Syntax_Err
        fi
    else
        action "Nginx Service is Not Running!Unable to Reload!" /bin/false
    fi
}
#编写case语句
case $1 in
    start)
        Start
        ;;
    stop)
        Stop
        ;;
    status)
        Status
        ;;
    restart)
        Restart
        ;;
    reload)
        Reload
        ;;
    *)
        echo "Usage: $0 {start|stop|status|restart|reload}"
esac
#解锁
rm -f $Suo
posted @   zbzSH  阅读(28)  评论(0编辑  收藏  举报
编辑推荐:
· AI与.NET技术实操系列:基于图像分类模型对图像进行分类
· go语言实现终端里的倒计时
· 如何编写易于单元测试的代码
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
阅读排行:
· 分享一个免费、快速、无限量使用的满血 DeepSeek R1 模型,支持深度思考和联网搜索!
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· ollama系列01:轻松3步本地部署deepseek,普通电脑可用
· 25岁的心里话
· 按钮权限的设计及实现
点击右上角即可分享
微信分享提示