shell 编程-函数

来源:互联网 发布:禁毒网络知识竞赛网 编辑:程序博客网 时间:2024/05/01 06:00

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.函数的递归

很多情况下,递归可以用循环来取代。递归函数比循环慢而且占用更多的内存,所有多用循环。






0 0