跟其他编程语言一样,Shell也是支持函数的,在函数中定义一次程序控制操作来进行封闭
最简单的函数,无形参,无返回值(shell的函数返回是整形的,表示函数执行的状态值)打印一句hello
function printHello{
str="hello"
echo $str
}
printHello
输出结果:
hello
下面可以直接通过$?来取得函数的返回值
function printHello{
str="hello"
echo $str
}
printHello
echo $?
输出结果:
hello
0
当然,也可以直接用return来给出返回值,不过需要是整型的
function printHello{
str="hello"
echo $str
return 2
}
printHello
输出结果:
hello
2
其实在shell中,变量的作用域并不像c或java那样严格,在c和java中是有严格的变量作用域的,在函数中声明的变量就是局部变量,在函数外部是访问不到的,但是在shell却不是这样的。还是上面的例子
function printHello{
str="hello"
echo $str
}
printHello
echo $str
输出结果:
hello
hello
其实这样,shell函数不能返回其他类型的返回值的问题就解决了,不过还有一个问题就是变量名不能重名,重名就会把值覆盖了
函数还是一个比较重要的内容就是参数的问题
shell的形参是不需要声明的,直接在函数内部用$i来取得就可以了,$0是函数名,从1开始就是输入的参数了
比如用下面的代码来实现一个加法函数
function add {
str="函数名:"
echo $str
echo $0
result=$(($1+$2))
}
add 1 2
echo $result
输出结果:
函数名:
add
3
如果非要使用局部变量的话,可以用local关键词,比如下面的代码
function testVar {
local var="hello"
echo $var
}
testVar
echo $var
输出结果:
hello
(这里会输出一个空行)
输出结果表示$var变量的作用域就是函数内,在函数外访问$var是取不到值的
关于函数的参数是一个数组的时候,如果直接通过$i来访问参数的话,实际上只能取到数据的第一个元素,下面的代码说明了这个问题
function testArray {
arr=$1
echo ${arr[*]}
}
array=(1 2 3 4 5)
testArray $array
输出结果:
1
如果想到在函数中获取数组的话,就需要其他一些操作了,网上比较流行的方法是在函数中重建这个传入的数组,比如说如下的代码例子
function testArray {
local arr=(`echo "$@"`)
echo ${arr[*]}
}
array=(1 2 3 4 5)
testArray ${array[*]}
输出结果:
1 2 3 4 5
其实也可以这样写
function testArray {
local arr=(`echo "$@"`)
echo ${arr[*]}
}
array=(1 2 3 4 5)
testArray ${array[*]}
输出结果:
1 2 3 4 5