shell函数
一、shell函数定义
- 使用函数可以避免代码重复
- 使用函数可以将大的工程分割为若干个小的功能模板,代码的可读性更强
1.函数定义的格式
【1】
function 函数名 {
命令序列
}
例子1:
例子2:
【2】
函数名() {
命令序列
}
例子2:
2.函数的查看和删除
declare
语法: declare -F
删除declare
语法:unset 函数名
3.函数返回值
1.return返回值
- return表示退出函数并返回一个退出值,脚本中可以用$?变量表示该值(只能在0-255之间)
- 使用原则:
1、函数一结束就取返回值,因为 $ ?变量只返回执行的最后一条命令的退出码
2、退出状态码必须是0~255,超出时将为除以256取余
function db1 {
read -p “请输入:” value
return $[ $value * 2]
}
db1
echo $?
2.echo返回值
echo对于linux来讲就是一个万能输出的工具,当 return 不能满足我们我们对返回值的需求时,可以强迫echo来充当返回值输出工具
db1() {
read -p “请输入:”value
echo $ [$value * 2]
}
result=`db1 `
echo $result
4.函数传参:
- 函数内部:
函数体内部的 $ 1、$ 2 代表的是调用函数时,函数后面跟的位置参数
在函数体内部的 $ #代表调用函数时,函数后面跟的参数个数
在函数体内部的$ @、$*代表调用函数时,函数后面跟的所有参数
函数内部的参数 | 代表含义 |
---|---|
$ 1、$ 2 | 代表的是调用函数时,函数后面跟的位置参数 |
$ # | 代表调用函数时,函数后面跟的参数个数 |
$ @、$* | 代表调用函数时,函数后面跟的所有参数 |
- 函数外部:
函数体外的$ 1、$ 2 代表的是执行脚本时,脚本后面跟的位置参数
在函数体外时,$ # 代表的是执行脚本时,脚本后面跟的参数个数
在函数体外时,$ * 、$@ 代表的是执行脚本时,脚本后面跟的所有参数
函数内部的命令 | 代表含义 |
---|---|
$ 1、$ 2 | 代表的是执行脚本时,脚本后面跟的位置参数 |
$ # | 代表的是执行脚本时,脚本后面跟的参数个数 |
$ * 、$@ | 代表的是执行脚本时,脚本后面跟的所有参数 |
sum2() {
#函数体内部的$1 $2代表的是调用函数时,函数后面跟的位置参数
sum=$[$1+$2]
echo $sum
echo $#
echo $@
}
#调用函数
#函数体外的$1 $2代表的是执行脚本时,脚本后面跟的位置参数
sum2 $1 $2
echo $@
echo $#
5.函数变量的作用范围
- 函数默认只能脚本内的 shell 环境有效(使用source执行脚本,也会影响系统的当前shel环境)
- 脚本中的变量默认全局有效 (即函数体内外都有效)
- 在函数体内执行 local 变量 ,可将变量限定在函数体内部使用
二、函数的应用
阶乘
- 函数调用本身的函数
例子1.数字本身的阶乘
fact () { #定义函数名fact
if [ $1 -eq 1 ] #创建一个if语句,当1=1时候直接输出1
then
echo 1
elif [ $1 -gt 1 ] #如果数字大于1,则让之相减1
then
local temp=$[$1 - 1] #local的作用是让变量temp在函数体内执行
local result=$(fact $temp) #输出结果返回值为(函数名 和上一次的结果)
echo $[$1 * result] #输出结果值,定义命令
else
echo "输入的内容无效,请重新输入内容"
fi
}
# main #
read -p "请输入内容的整数:" num #定义变量num我们要阶乘的值
result=$(fact $num) #返回值为执行这个函数并带入我们的数字
echo "$num的阶乘为$result" #输出的最后结果即为$result我们的返回值
~
递归目录
function digui {
for i in `ls $1`
do
if [ -d "$1/$i" ]
then
echo "$2$i"
digui "$1/$i" " $2"
else
echo "$2$i"
fi
done
}
### main ###
read -p "请输入需要查询的目录:" num
digui "/$num" " "