一篇文章教会shell函数

函数

1 函数

对于学习过其他的程序语言的用户来说,函数可能并不陌生。但是Shell中的函数与其他的程序设计语言的函数有许多不同之处。

1.1什么是函数

通俗地讲,所谓函数就是将一组功能相对独立的代码集中起来,形成一个代码块,这个代码可以完成某个具体的功能。从上面的定义可以看出,Shell中的函数的概念与其他语言的函数的概念并没有太大的区别。

从本质上讲,函数是一个函数名到某个代码块的映射。也就是说,用户在定义了函数之后,就可以通过函数名来调用其所对应的一组代码。

使用shell函数优势
1、把相同的程序段定义为函数,可以减少整个程序段代码量,提升开发效率。
2、增加程序段可读性、易读性,提升管理效率。
3、可以实现程序功能模块化,使得程序具备通用性(可移植性)。

1.2 函数语法

function 函数名() {
   指令
    return
   }
 简化写法1:
 function 函数名 {
    指令
    return
 }
简化写法2:
函数名() {
   指令
   return
}

1.3 函数的调用

在Shell中,函数调用的基本语法如下:

function_name param1 param2 …

在上面的语法中,function_name表示函数名称,其后面跟的param1、param2…表示函数的参数。
Shell的函数参数的语法比较特殊。实际上,Shell将脚本参数和函数参数做了统一地处理。
也就是说,Shell采用了相同的方法来处理脚本的参数和函数参数。
(1)调用函数:直接执行函数名即可。
函数名
(2)带参数的函数执行方法:
函数名 参数
与Shell脚本一样,用户可以在Shell函数中使用位置变量来获取参数值。
例如, 0 表示脚本名称, 0表示脚本名称, 0表示脚本名称,#来获取函数的参数个数,$1表示第1个参数, 2 表示第 2 个参数等,以此类推。另外,用户还可以通过系统变量 2表示第2个参数等,以此类推。 另外,用户还可以通过系统变量 2表示第2个参数等,以此类推。另外,用户还可以通过系统变量@和$*获取所有参数的值。

1.4 函数的返回值

首先,用户可以使用return语句来返回某个数值,这与绝大部分的程序设计语言是相同的。但是,在Shell中,return语句只能返回某个0~255之间的整数值。如果超出这个范围会被256整除取余。
在函数中,用户将需要返回的数据写入到标准输出(stdout),通常这个操作是使用echo语句来完成的。然后在调用程序中将函数的执行结果赋给一个变量。这种做法实际上就是命令替换的一个变种。

1.5 函数库文件

为了方便地重用这些功能,可以创建一些可重用的函数。这些函数可以单独地放在函数库文件中。
函数库文件定义:
创建一个函数库文件的过程非常类似于编写一个Shell脚本。脚本与库文件之间的唯一区别在于函数库文件通常只包括函数,而脚本中则可以既包括函数和变量的定义,又包括可执行的代码。此处所说的可执行代码,是指位于函数外部的代码,当脚本被载入后,这些代码会立即被执行,毋需另外调用。
函数库文件的调用当库文件定义好之后,用户就可以在程序中载入库文件,并且调用其中的函数。在Shell中,载入库文件的命令为.,即一个圆点,其语法如下:
. filename
其中,参数filename表示库文件的名称,必须是一个合法的文件名。库文件可以使用相对路径,也可以使用绝对路径。另外,圆点命令和库文件名之间有一个空格。

1.6 递归函数

Linux的Shell也支持函数的递归调用。也就是说,函数可以直接或者间接地调用自身。在函数的递归调用中,函数既是调用者,又是被调用者。
递归函数的调用过程就是反复地调用其自身,每调用一次就进入新的一层。

练习

1.online写一个脚本,判定给定的IP列表中的主机哪些在线

使用函数返回值判断(有参数,有返回值)

[redhat@localhost day5]$ vim online.sh
#!/bin/bash
#########################
#File name:online.sh
#Version:v1.0
#Email:admin@test.com
#Created time:2022-08-27 09:52:18
#Description:
#####################
online() {
    if ping -c 1 -W 1 $1 >/dev/null
    then
        return 0
    else
        return 1
    fi
}
for i in {1..254}   
do
    online 172.25.10.$i  
    if [ $? -eq 0 ];then
        echo "172.25.10.$i is up"
    else
        echo "172.25.10.$i is down" 
    fi
done

[redhat@localhost day5]$ bash online.sh 
172.25.10.1 is down
172.25.10.2 is up
172.25.10.3 is down
172.25.10.4 is down
172.25.10.5 is down
172.25.10.6 is down

2.函数能够接受一个参数,参数为用户名;

判断一个用户是否存在
如果存在,就返回此用户的shell和UID;并返回正常状态值;
如果不存在,就说此用户不存在;并返回错误状态值;

[redhat@localhost day5]$ vim user.sh
#!/bin/bash
user() {
    if id $1 &>/dev/null
    then
        echo "`grep ^$1 /etc/passwd | cut -d: -f3,7`"
        return 0
    else
        echo "$1 does not exist" 
        return 1
    fi
}
read -p "please input username(if you want to exit please input q or quit):" username
until [ "$username" = "quit"  -o "$username" = "q" -o "$username" = "" ]
do
    user $username
    if [ $? == 0 ];then
    read -p "please input again:" username
    else
    read -p "no $username,please input again:" username
    fi
done
[redhat@localhost day5]$ bash user.sh 
please input username(if you want to exit please input q or quit):
[redhat@localhost day5]$ bash user.sh 
please input username(if you want to exit please input q or quit):q
[redhat@localhost day5]$ bash user.sh 
please input username(if you want to exit please input q or quit):quit

3.利用递归求n的阶乘

[redhat@localhost day5]$ vim fact.sh
fact() {
    local n="$1"
    if [ "$n" -eq 0 ]
    then
        result=1
    else
        let "m=n-1"
        fact "$m"
        let "result=$n * $result"
    fi
}
fact "$1"
echo "Factorial of $1 is $result"
[redhat@localhost day5]$ bash fact.sh  8
Factorial of 8 is 40320
[redhat@localhost day5]$ bash fact.sh  5
Factorial of 5 is 120
[redhat@localhost day5]$ bash fact.sh  0
Factorial of 0 is 1

4.函数库文件:在一个脚本中调用另一个脚本中的函数

以第三题的递归函数求阶乘为例子

# 先编写一个数据库文件,只包含函数
[redhat@localhost day5]$ vim fact1.sh
#!/bin/bash
fact() {
    local n="$1"
    if [ "$n" -eq 0 ]
    then
        result=1
    else
        let "m=n-1"
        fact "$m"
        let "result=$n * $result"
    fi
}
# 在编写一个脚本来调用数据库文件
[redhat@localhost day5]$ vim fact2.sh
#!/bin/bash
. fact1.sh
fact "$1"
echo "Factorial of $1 is $result"
# 执行脚本文件
[redhat@localhost day5]$ bash fact2.sh  4 
Factorial of 4 is 24
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值