第二课 Shell脚本编程-函数的用法

本文介绍了Shell脚本中函数的定义和使用,包括如何定义函数、调用参数及返回值。通过示例展示了如何判断Nginx守护进程的状态,以及如何处理脚本自身的PID避免误判。此外,讲解了函数参数传递、局部与全局变量的区别,并演示了如何创建和使用函数库。最后,提供了函数库中加减乘除等数学运算的实现,以及如何引入并调用库函数。
摘要由CSDN通过智能技术生成

第二课 Shell脚本编程-函数的用法

第一节 函数的定义和使用

  1. Linux Shell中的函数和大多数编程语言中的函数一样
  2. 将相似的任务或代码封装到函数中,供其他地方调用
    在这里插入图片描述在这里插入图片描述
  3. 调用函数:直接使用函数名调用,可以将其想象成Shell中的一条命令
  4. 函数内部可以直接使用参数$1、$2..…..$n
  5. 调用函数: function_name $1 $2
# 第一种方法定义函数
[root@localhost ~]# test()
> {
>    echo "test function"
> }
[root@localhost ~]# test
test function
# 查看可调用的函数名称和函数内容
[root@localhost ~]# declare -f
test ()
{
    echo "test function"
}

# 第二种方法定义函数
[root@localhost ~]# function greeting
> {
>    echo "hello zhangsan"
> }
# tab 自动补全可以看到函数
[root@localhost ~]# gre
greeting  grep
[root@localhost ~]# greeting
hello zhangsan

# 查看可调用的函数名称
[root@localhost ~]# declare -F
declare -f greeting
declare -f test

第二节 Nginx判断守护进程

# 判断nginx进程是否存在 过滤grep
ps -ef | grep nginx | grep -v grep

# 有时候我们把上面一句化放到脚本中nginx_check.sh
#!/bin/bash
#
ps -ef | grep nginx | grep -v grep
echo $?

# 即使把nginx关掉 依然返回0 因为脚本名称中有个nginx 改下名字check.sh发现正常
# 不改文件名的解决方案 把脚本子进程的pid排除掉
# echo $$ 会把执行脚本 子进程的pid打印出来
#!/bin/bash
#

this_pid=$$ 
while true
do
    ps -ef | grep nginx | grep -v grep | grep -v $this_pid &> /dev/null
    if [ $? -eq 0 ];then
        echo "Nginx is running well"
    else
        systemctl start nginx
        echo "Nginx is down,Start it"
    fi
done

# 后台运行守护脚本
nohup sh nginx_daemon.sh &

第三节 向函数传递参数

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-7GegTQDE-1666023882024)(.\printscreen\2.3.png)]

  1. 直接在函数中$1, $2, $3即可。
  2. 函数调用: name Lily Allen
# 函数传参  
greeting ()
{
    echo "hello $1"
}
# 函数调用
greeting zhangsan
  1. 加减乘除案例
#!/bin/bash
#

function calcu
{
    case $2 in
        +)
            echo "`expr $1 + $3`"
            ;;
        -)
            echo "`expr $1 - $3`"
            ;;
        \*)
            echo "`expr $1 \* $3`"
            ;;
        /)
            echo "`expr $1 / $3`"
            ;;
        esac
}

# 调用函数
calcu $1 $2 $3


sh calculate.sh 20 + 20

第四节 返回值的方式

  1. 方法一:return
    • 使用return返回值,只能返回1-255的整数
    • 函数使用return返回值,通常只是用来供其他地方调用获取状态,因此通常仅返回0或1;0表示成功,1表示失败
  2. 方法二:echo
    • 使用echo可以返回任何字符串结果
    • 通常用于返回数据,比如一个字符串值或者列表值
  3. return的案例
#!/bin/bash
#

this_pid=$$ 
function is_nginx_running
{
    ps -ef | grep nginx | grep -v grep | grep -v $this_pid &> /dev/null
    if [ $? -eq 0 ];then
    	return # 默认为0
    else
        return 1 # 1失败需要重启
    fi
}
is_nginx_running && echo "Nginx is runing" || echo "Nginx is stop"

# 执行脚本
sh nginx_check.sh
# 查看脚本的执行过程
sh -x nginx_check.sh
  1. echo的案例
#!/bin/bash
#

function get_users
{
   users=`cat /etc/passwd | cut -d: -f1`
    echo $users
}

user_list=`get users`
index=1
for u in $user_list:
do
   echo "The $index user is : $u"
   index=$((index+1))
done

第五节 局部变量和全局变量

  1. 全局变量
    • 不做特殊声明,Shell中变量都是全局变量
    • Tips:大型脚本程序中函数中慎用全局变量
  2. 局部变量
    • 定义变量时,使用local关键字
    • 函数内和外若存在同名变量,则函数内部变量覆盖外部变量
  3. 全局变量案例
#!/bin/bash
#

var1="Hello world"
function test
{
   var2=87
}

echo $var1
echo $var2

test # 被调用后 变量就变成全局变量了

echo $var2
function test1
{
   echo $var2
}

# sh var.sh 结果
"Hello world"
""
87
87
  1. 局部变量案例
#!/bin/bash
#

var1="Hello world"
function test
{
   local var2=87
}

echo $var1
echo $var2

test # 被调用后 局部变量不会变成全局变量
echo $var2

# sh var.sh 结果
"Hello world"
""
""

第六节 定义函数库

  1. 经常使用的重复代码封装成函数文件
  2. 一般不直接执行,而是由其他脚本调用
  3. 定义一个函数库,该函数库实现以下几个函数;
    • 加法函数add
    • 减法函数reduce
    • 乘法函数multiple
    • 除法函数divide
    • 打印系统运行情况的函数sys_load,该函数可以显示内存运行情况, 磁盘的使用情况
  4. 写简单的库文件base_function.sh
#!/bin/bash
#

function add
{
    echo "`expr $1 + $3`"
}
function reduce
{
    echo "`expr $1 - $3`"
}
function mult1ple
{
    echo "`expr $1 \* $3`"
}
function divide
{
    echo "`expr $1 / $3`"
}
function sys_load
{
	echo "Memory Info"
	echo
	free -m
	echo
	
	echo "Disk UseAge"
	df -h
	echo 
}
  1. 引入库文件, 并使用其中函数。
#!/bin/bash
#

. /home/base_function
add 12 23
reduce 90 30
multiple 12 12
divide 12 2
  1. 经验之谈
    • 库文件名的后缀是任意的,但一般使用.lib
    • 库文件通常没有可执行选项
    • 库文件无需和脚本在同级目录,只需在脚本中引用时指定
    • 第一行一般使用#!/bin/echo输出警告信息,避免用户执行
  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值