linux shell 入门学习笔记18 函数开发

概念

函数就是将你需要执行的shell命令组合起来,组成一个函数体。一个完整的函数包括函数头和函数体,其中函数名就是函数的名字。

优点
  • 将相同的程序,定义,封装为一个函数,能减少程序的代码数量,提高开发效率。
  • 使用函数,能让你写更少的代码,早点写完,早点回家休息多好。
  • 函数能够增加代码的可读性,易读性,容器管理。
函数的实际开发

shell函数定义的语法

# 标准shell函数定义
function 函数名() {
	函数体
	你想执行的Linux命令
	return 返回值
}

# 偷懒写法
# 当使用function关键字时候,可以省略括号
function 函数名 {
  函数体
  你想执行的那些命令。。。。
  return 返回值
}

# 超人懒人写法,shell老司机的时候
# 必须有括号
函数名() {
  函数体
  代码。。。
  return 返回值
}

# 执行该函数
函数名
执行函数的基础概念

有关函数执行的基本概念

  • 执行shell函数,直接写函数名字即可,无需添加其他内容
  • 函数必须先定义,在执行,shell脚本自上而下加载
  • 函数体内定义的变量,称之为局部变量
  • 函数体内需要添加return语句,作用是退出函数,且赋予返回值给调用该函数的程序,也就是shell脚本
  • return语句和exit不同
    • return是结束函数的执行,返回一个(退出值、返回值)
    • exit是结束shell环境,返回一个(退出值、返回值)给当前的shell
  • 函数如果单独写入一个文件里,需要用source读取
  • 函数内,使用local关键字,定义局部变量
函数实践

场景1:

xiao123@xiao123:~/Downloads/shscripts$ cat ./func1.sh
#! /bin/bash

function chaochao() {
        cd /tmp
        echo "我准备创建一个文件,且写入信息"
        echo "爱的魔力转圈圈" > ./music.txt
        return 0
}

chaochao
xiao123@xiao123:~/Downloads/shscripts$

运行结果:

xiao123@xiao123:~/Downloads/shscripts$ bash ./func1.sh
我准备创建一个文件,且写入信息
xiao123@xiao123:~/Downloads/shscripts$ ls /tmp/
message.txt
music.txt
xiao123@xiao123:~/Downloads/shscripts$
xiao123@xiao123:~/Downloads/shscripts$ cat /tmp/music.txt
爱的魔力转圈圈
xiao123@xiao123:~/Downloads/shscripts$

场景2:
函数定义和执行,分开在不同的文件中,Linux自带的诸多脚本,都是基于该形式使用的。

  • 函数写在一个文件中,只定义,不执行
  • 另外一个脚本,读取该文件,且加载该函数
1. 先定义一个my_function.c脚本,作用是只记录函数,不运行
xiao123@xiao123:~/Downloads/shscripts$ cat my_function.sh
#!/bin/bash

chao(){
        echo "我是函数,我被执行~你真棒"
}
xiao123@xiao123:~/Downloads/shscripts$

2.如何检查当前的shell环境变量
xiao123@xiao123:~/Downloads/shscripts$ set | grep ^chao
xiao123@xiao123:~/Downloads/shscripts$

3.利用source命令读取shell脚本,能够加载其变量到当前shell环境中
xiao123@xiao123:~/Downloads/shscripts$ source my_function.sh
xiao123@xiao123:~/Downloads/shscripts$

4.再次验证
xiao123@xiao123:~/Downloads/shscripts$ set | grep ^chao
chao ()
xiao123@xiao123:~/Downloads/shscripts$

5.可以推出当前shell,再次登录,查看该环境变量
exit
xiao123@xiao123:~$ chao
Command 'chao' not found, did you mean:
  command 'chaos' from deb emboss (6.6.0+dfsg-11ubuntu1)
  command 'chat' from deb ppp (2.4.9-1+1ubuntu3)
Try: apt install <deb name>
xiao123@xiao123:~$

xiao123@xiao123:~/Downloads/shscripts$ source my_function.sh
xiao123@xiao123:~/Downloads/shscripts$ set | grep ^chao
chao ()
xiao123@xiao123:~/Downloads/shscripts$ chao
我是函数,我被执行~你真棒
xiao123@xiao123:~/Downloads/shscripts$

使用脚本加载chao,并执行

xiao123@xiao123:~/Downloads/shscripts$ cat fun3.sh
#! /bin/bash

[ -f ./my_function.sh ] && . my_function.sh || exit -1

chao
xiao123@xiao123:~/Downloads/shscripts$

xiao123@xiao123:~/Downloads/shscripts$ bash fun3.sh  #启动子shell,在子shell中加载
我是函数,我被执行~你真棒
xiao123@xiao123:~/Downloads/shscripts$

xiao123@xiao123:~/Downloads/shscripts$ chao
\Command 'chao' not found, did you mean:
  command 'chat' from deb ppp (2.4.9-1+1ubuntu3)
  command 'chaos' from deb emboss (6.6.0+dfsg-11ubuntu1)
Try: apt install <deb name>
xiao123@xiao123:~/Downloads/shscripts$

xiao123@xiao123:~/Downloads/shscripts$ source fun3.sh   # 在当前shell中加载
我是函数,我被执行~你真棒
xiao123@xiao123:~/Downloads/shscripts$ set | grep ^chao
chao ()
xiao123@xiao123:~/Downloads/shscripts$ chao
我是函数,我被执行~你真棒
xiao123@xiao123:~/Downloads/shscripts$

bash 开启子shell执行,source使用当前shell执行

函数处理参数

函数可以处理来自命令行传到shell脚本中的参数。

my_function.sh

xiao123@xiao123:~/Downloads/shscripts$ cat my_function.sh
#!/bin/bash

chao(){
        echo "我是函数,我被执行~你真棒"
}

helloPyyu(){
        echo "兄台,你传入的脚本参数,依次是 $1 $2 $3,并且参数个数一共是$#"
}
xiao123@xiao123:~/Downloads/shscripts$

fun3.sh

xiao123@xiao123:~/Downloads/shscripts$ cat fun3.sh
#! /bin/bash

[ -f ./my_function.sh ] && . my_function.sh || exit -1

helloPyyu $1 $2 $3
xiao123@xiao123:~/Downloads/shscripts$

运行结果

xiao123@xiao123:~/Downloads/shscripts$ bash fun3.sh
兄台,你传入的脚本参数,依次是   ,并且参数个数一共是0
xiao123@xiao123:~/Downloads/shscripts$ bash fun3.sh 2131 4543 5646 45645
兄台,你传入的脚本参数,依次是 2131 4543 5646,并且参数个数一共是3
xiao123@xiao123:~/Downloads/shscripts$ bash fun3.sh 2131 4543 5646
兄台,你传入的脚本参数,依次是 2131 4543 5646,并且参数个数一共是3
xiao123@xiao123:~/Downloads/shscripts$
函数实战开发
  1. 检测url是否正常,要求是函数开发形式
xiao123@xiao123:~/Downloads/shscripts$ cat check_url.sh
#!/bin/bash

usage() {
        echo "Usage: $0 url"
        exit 1
}

check_url() {
        wget --spider -q -o /dev/null --tries=1 -T 5 $1
        if [ $? -eq 0 ]
          then
                echo "$1 is running..."
        else
                echo "$1 is down..."
        fi
}

main() {
        if [ $# -ne 1 ]
          then
                usage
        fi
        check_url $1
}

main $*
xiao123@xiao123:~/Downloads/shscripts$

运行结果

xiao123@xiao123:~/Downloads/shscripts$ bash check_url.sh www.baidu.com
www.baidu.com is running...
xiao123@xiao123:~/Downloads/shscripts$ bash check_url.sh www.baidu.coms
www.baidu.coms is down...
xiao123@xiao123:~/Downloads/shscripts$ bash check_url.sh www.baidu.coms  fd
Usage: check_url.sh url
xiao123@xiao123:~/Downloads/shscripts$ bash check_url.sh
Usage: check_url.sh url
xiao123@xiao123:~/Downloads/shscripts$

美化脚本

xiao123@xiao123:~/Downloads/shscripts$ cat check_url.sh
#!/bin/bash

. /lib/lsb/init-functions

usage() {
        echo "Usage: $0 url"
        exit 1
}

check_url() {
        wget --spider -q -o /dev/null --tries=1 -T 5 $1
        if [ $? -eq 0 ]
          then
                log_success_msg echo "$1 is running..."
        else
                log_failure_msg "$1 is down..."
        fi
}

main() {
        if [ $# -ne 1 ]
          then
                usage
        fi
        check_url $1
}

main $*
xiao123@xiao123:~/Downloads/shscripts$

运行结果:
slab

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值