Shell 函数

 


一、Shell函数概述

1. Shell函数的概念

将命令序列按格式写在一起,可方便重复使用命令序列

2. Shell函数定义

方式一:

function 函数名 {
命令序列
}

方式二:

函数名() {
命令序列
}

3. 调用函数的方法

函数名 [参数1] [参数2]

4. 函数返回值

return表示退出函数并返回一个退出值,脚本中可以用$?变量显示该值
使用原则:
(1)函数一结束就取返回值,因为$?变量只返回执行的最后一条命令的退出状态码;
(2)退出状态码必须是0~255,超出时返回值将为除以256后的取余数。

5. 函数的作用范围

函数在Shell脚本中仅在当前Shell环境中有效
Shell脚本中变量默认全局有效
将变量限定在函数内部使用local命令

#!/bin/bash
test() {
local i #i为内部变量
i=8 #内部变量i为8
echo #echo内部变量i
}
i=9 #外部变量i为9
test
echo $i #echo外部变量i
[root@localhost ~]# ./test
8 #内部变量i先被echo
9 #外部变量i后被echo

6. 函数的参数

(1)参数的用法

函数名称 参数1 参数2 参数3……

(2)参数的表示方法

$1 $2 $3 …… ${10} ${11} ……

#!/bin/bash
sum1() {
sum=$[$1+$2]
echo $sum
}
sum1 $1 $2
[root@localhost ~]# ./jiafa.sh 1 2
3

二、递归函数

1. 阶乘

调用自己本身的函数

#!/bin/bash
fact() {
if [ $1 -eq 1 ];then
echo 1
else
local temp=$[$1 - 1]
local result=$(fact $temp)
echo $[$1 * $result]
fi
}
read -p "请输入:" n
result=$(fact $n)
echo $result
[root@localhost ~]# ./fact.sh
请输入一个阶乘的数字:5
120
[root@localhost ~]# ./fact.sh
请输入一个阶乘的数字:10
3628800

2. 递归目录

#!/bin/bash
list_files() {
for i in $(ls $1)
do
if [ -d "$1/$i" ];then
echo "$2$i/"
list_files "$1/$i" " $2"
else
if [ ! -x $1/$i ];then
echo "$2$i"
fi
fi
done
}
################main###############
OLDIFS=$IFS
IFS=$IFS':'
for floder in $PATH
do
echo "$floder/"
list_files "$floder" " "
done
IFS=$OLDIFS
[root@localhost ~]# ./jiansuo.sh
/usr/local/sbin/
/usr/local/bin/
/usr/sbin/
/usr/bin/
/root/bin/
aa/
bb/
cc/
dd/
abc.txt

三、创建函数库

1. 函数库的定义

函数库是由系统建立的具有一定功能的函数的集合。库中存放函数的名称和对应的目标代码,以及连接过程中所需的重定位信息。用户也可以根据自己的需要建立自己的用户函数库。

2. 函数库的作用

C语言库函数是把自定义函数放到库里,是别人把一些常用到的函数编完放到一个文件里,供程序员使用。程序员用的时候把它所在的文件名用#include<>加到里面就可以了(尖括号内填写文件名),例如#include<math.h>。

3. 创建函数库

#!/bin/bash
fact() {
if [ $1 -eq 1 ];then
echo 1
else
local temp=$[$1-1]
local result=$(fact $temp)
echo $[$1 * $result]
fi
}
jiafa() {
echo $[$1 + $2]
}
jianfa() {
echo $[$1 - $2]
}
chengfa() {
echo $[$1 * $2]
}
chufa() {
if [ $2 -ne 0 ];then
echo $[$1 / $2]
else
echo "被除数不能为0!"
fi
}

4. 调用函数库

#!/bin/bash
. suanfa.sh
v1=$1
v2=$2
res1=$(jiafa $v1 $v2)
res2=$(jianfa $v1 $v2)
res3=$(chengfa $v1 $v2)
res4=$(chufa $v1 $v2)
res5=$(fact $v1)
echo "加法的结果为 $res1"
echo "减法的结果为 $res2"
echo "乘法的结果为 $res3"
echo "除法的结果为 $res4"
echo "$1 阶乘的结果为 $res5"
[root@localhost ~]# ./jisuan.sh 10 5
加法的结果为 15
减法的结果为 5
乘法的结果为 50
除法的结果为 2
10 阶乘的结果为 3628800
[root@localhost ~]# ./jisuan.sh 5 0
加法的结果为 5
减法的结果为 5
乘法的结果为 0
除法的结果为 被除数不能为0!
5 阶乘的结果为 120


感谢您的阅读,如果您觉得阅读本文对您有帮助,请点一下“推荐”按钮。本文欢迎各位转载,但是转载文章之后必须在文章页面中给出作者和原文连接
posted @   DoYouWantMore  阅读(61)  评论(0编辑  收藏  举报
编辑推荐:
· AI与.NET技术实操系列:基于图像分类模型对图像进行分类
· go语言实现终端里的倒计时
· 如何编写易于单元测试的代码
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
阅读排行:
· 分享一个免费、快速、无限量使用的满血 DeepSeek R1 模型,支持深度思考和联网搜索!
· 25岁的心里话
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· ollama系列01:轻松3步本地部署deepseek,普通电脑可用
· 按钮权限的设计及实现
点击右上角即可分享
微信分享提示