Shell 函数
1.函数的定义
函数的格式:
[ function ] 函数名
{
命令表
[return]
}
其中:
- 关键字function表示定义一个函数,可以省略。
- 符号{表示函数执行命令的入口。
- return用于返回函数中最后一个命令的退出状态值或者给定的参数值。
- 函数中使用exit命令可以退出整个脚本。
- 函数中使用break命令可以中断函数的执行
- declare -f显示定义的函数清单
- export -f将函数输出给Shell
- unset -f 从shell内存中删除函数
2.函数的调用
2.1函数的执行
执行函数只需直接输入函数名即可。通过命令行定义的函数在用户退出登录时将自动删除。
函数通常被保存在一个使用该函数的可执行文件中。
2.2函数参数传递
函数可以通过位置变量传递参数。
计算立方和的代码:
chen@chen-IdeaPad-Y430:~/test$ cat cubetotal
#!/bin/bash
#filename:cubetotal
cube()
{
ITEM=` expr $1 \* $1 \* $1 `
}
echo "input a number:"
read N
i=1
RESULT=0
ITEM=
while [ $i -le $N ]
do
cube $i
RESULT=` expr $RESULT + $ITEM `
i=$(($i+1))
done
echo "计算1...$N的立方和为: $RESULT "
运行结果:
chen@chen-IdeaPad-Y430:~/test$ chmod u+x cubetotal
chen@chen-IdeaPad-Y430:~/test$ ./cubetotal
input a number:
5
计算1...5的立方和为: 225
2.3函数的返回值
return的返回值只能是0~256之间的一个整数,返回值将保存到变量$?中。
根据输入不同返回提示不同信息:
chen@chen-IdeaPad-Y430:~/test$ cat funcVerify
#!/bin/bash
#filename:funcVerify
function verify
{
if [ $# -ne 2 ]
then
return 1
fi
if [ $1 = "wanger" -a $2 = "123456" ]
then
return 2
fi
if [ $1 != "wanger" -a $2 = "123456" ]
then
return 3
fi
if [ $1 = "wanger" -a $2 != "123456" ]
then
return 4
fi
if [ $1 != "wanger" -a $2 != "123456"]
then
return 5
fi
}
verify $1 $2
case $? in
1)echo "参数书目错误! ";;
2)echo "通过验证!" ;;
3)echo "用户名错误!";;
4)echo "密码错误! ";;
5)echo "用户名密码错误!";;
esac
运行结果:
chen@chen-IdeaPad-Y430:~/test$ ./funcVerify wanger 123456
通过验证!
2.4载入函数
函数的定义可以放在~/.bash_profile文件中,或者直接放在命令行中,也可以放在脚本文件中。如果需要使用的函数保存在其他的脚本文件中,可以通过source命令或者.命令把它们装入到内存,以供当前脚本使用。
程序squareandcube中定义了两个函数square和cube。
chen@chen-IdeaPad-Y430:~/test$ cat squareandcube
#!/bin/bash
#filename:squareandcube
function square
{
local temp
let temp=$1*$1
echo "$1的平方为:$temp"
}
function cube
{
local temp
let temp=$1*$1*$1
echo "$1的立方为:$temp"
}
程序sourcefunc使用source命令载入上面的文件。
chen@chen-IdeaPad-Y430:~/test$ cat sourcefunc
#!/bin/bash
#filename:sourcefunc
source squareandcube
echo "input a number:"
read N
i=1
while [ $i -le $N ]
do
square $i
i=$(($i+1))
done
echo "--------------"
i=1
while [ $i -le $N ]
do
cube $i
i=$(($i+1))
done
执行结果:
chen@chen-IdeaPad-Y430:~/test$ ./sourcefunc
input a number:
5
1的平方为:1
2的平方为:4
3的平方为:9
4的平方为:16
5的平方为:25
--------------
1的立方为:1
2的立方为:8
3的立方为:27
4的立方为:64
5的立方为:125
2.5删除函数
使用命令unset -f可以从Shell内存中删除函数。
3.函数的作用域
函数在当前环境下运行,跟调用它的脚本分享变量,即无论在函数内外,没有使用关键字local进行特别声明的变量都具有全局作用域。
chen@chen-IdeaPad-Y430:~/test$ cat funcvar
#!/bin/bash
#filename:funcvar
function testvar
{
a="这是在函数中定义的变量"
echo "在函数内输出: $a"
}
testvar
echo "在主程序中输出: $a"
执行结果:
chen@chen-IdeaPad-Y430:~/test$ chmod u+x funcvar
chen@chen-IdeaPad-Y430:~/test$ ./funcvar
在函数内输出: 这是在函数中定义的变量
在主程序中输出: 这是在函数中定义的变量
在函数中使用关键字local声明的变量称为该函数的局部变量。
局部变量的使用,使得函数执行完毕后可以自动释放变量所占用的内存空间,从而减少系统资源的消耗。
4.函数的嵌套
Shell支持函数的嵌套,即在函数中可以定义并调用其他函数。
5.函数的递归
很多情况下,递归可以用循环来取代。递归函数比循环慢而且占用更多的内存,所有多用循环。