Functions
我们可以在shell中定义函数。定义一个shell函数,结构如下:
function_name () {
statements
}
#!/bin/sh
foo(){
echo "Function foo is executing"
}
echo "script starting"
foo
echo "script ended"
exit 0
script starting
Function foo is executing
script ended
在shell脚本里面,我们必须在调用函数前定义好函数,除非你在调用前声明该函数。不过所有的脚本都是从头开始执行,因此基本上函数都定义在脚本的最前面。当函数被调用后,脚本的定位参数(如:$*,$@,$#,$1,$2等等)都将由函数的参数所替代。一旦函数结束,这些参数将恢复先前的数值。另外,我们可以通过使用return命令来返回一个数值,最通常的用法就是让函数返回一个字符串,并将之存到一个变量中,从而在函数结束之后使用。例如:
foo() {echo JAY;}
...
result="$(foo)"
除此之外,我们还可以通过local关键字来为shell函数定义本地变量,这个变量只在此函数的范围内有效。当此本地变量同其他的全局变量名字相同时,在该函数中,本地变量的值将覆盖全局变量的值。这点同其他编程语言一样。例子如下所示:
#!/bin/sh
sample_text="global variable"
foo(){
local sample_text="local variable"
echo "Function foo is executing"
echo $sample_text
}
echo "script starting"
echo $sample_text
foo
echo "$script ended"
echo $sample_text
exit 0
下面是一个简单而全面的函数调用脚本(my_name)的例子:
#!/bin/sh
yes_or_no(){
echo "Is your name $* ?"
while true
do
echo -n "Enter yes or no:"
read x
case "$x" in
y | yes ) return 0;;
n | no ) return 1;;
* ) echo "Answer yes or no"
esac
done
}
echo "Original parameters are $*"
if yes_or_no "$1"
then
echo "Hi $1, nice name"
else
echo "Nerver mind"
fi
exit 0
$ ./my_name Ricky Neil
Original prarmeters are Ricky Neil
Is your name Ricky?
Enter yes or no: yes
Hi Ricky, nice name
$