Shell函数
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