在Shell里允许定义函数,你当然也可以把一个大的任务做成许多小脚本,然后在一个脚本里执行另一个脚本程序,但那样效率低,并且执行结果的回传也成问题,如果任务很分散,小脚本也会因过多而难于管理。
在Shell定义个函数很简单,写出他的名字,然后是一对空括号"()",再把有关的语句放在一对花括号"{}"里:
function_name () {
statements;
}
例子:
#!/bin/sh
foo() {
echo "Function foo is executing!"
}
echo "script starting"
foo
echo "script ended"
exit 0
注意:
Shell里的函数定义和Pascal的函数定义类似,必须先定义后使用. 再调用一个函数的时候,脚本程序的位置参数 "$*","$@","$#",$!","$2" 登会被替换为函数的参数. 这也是读取传递给函数的参数的办法. 函数执行完毕后,有关参数会被恢复. 但有写比较老的SHELL在函数执行后不能恢复位置参数的值,所以如果你想让自己的脚本具有可移植性,就不要依赖这个行为.
在shell里可以通过local关键字声明局部变量,局部变量将局限在函数的作用范围内.函数可以对全局作用范围中的其他shell变量进行存取. 如果某个局部变量和某个全局变量的名字相同,前者会覆盖后者,但也仅限于函数的作用范围以内.
#!/bin/sh
sample_txt="global varible"
foo() {
local sample_txt="local varible"
echo "Function foo is executing"
echo $sample_txt
}
echo "script starting"
echo $sample_txt
exit 0
----------
函数输出如下:
script starting
Function foo is executing
local varible
global varible
如果在函数里没有使用return命令指定返回值,它返回的就是执行最后一条命令的退出状态码. 下面这个脚本程序,演示了函数的参数是如何被传递的一急如何让函数返回一个true或false的结果.
#!/bin/sh
#Define function
yes_or_no() {
echo "Is you name $* ?"
while true
do
echo "Enter yes or no:"
read x
case "$x" in
y | yes ) return 0;;
n | no ) return 1;;
* ) echo "Answer yes or no"
esac
done
}
# Main program
if [ "$#" = "0" ] ; then
echo "Usage: myname name"
else
echo "Original parameters are $*"
if yes_or_no "$s*"
then echo "Hi $*,nice name"
else
echo "Never mind"
fi
fi
exit 0
阅读(1407) | 评论(0) | 转发(0) |