Shell 函数

shell中函数的定义格式如下:

1
2
3
4
5
[ function ] funname [()]
{
action;
[return int;]
}

说明:

  1. 可以带function fun() 定义,也可以直接fun() 定义。
  2. 返回值,可以显示加:return 返回,如果不加,将以最后一条命令运行结果,作为返回值。return后跟数值n(0-255);调用方法和取得返回值之间,不能有任何操作,不然取不到return的值。

注意:所有函数在使用前必须定义。这意味着必须将函数放在脚本开始部分,直至shell解释器首次发现它时,才可以使用。调用函数仅使用其函数名即可。

函数参数

在Shell中,调用函数时可以向其传递参数。在函数体内部,通过 $n 的形式来获取参数的值,例如,$1表示第一个参数,$2表示第二个参数…

1
2
3
4
5
6
7
8
9
10
11
#!/bin/bash
add() {
a=$1
b=$2
return $(($a+$b))
}
add 1 2
result=$? # Get result of func by $?
echo $result

注意,$10 不能获取第十个参数,获取第十个参数需要${10}。当n>=10时,需要使用${n}来获取参数。

向函数传递数组变量

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
#!/bin/bash
a=(1 2 3)
echo ${a[*]}
function sum(){
echo parameters : "$@"
local the_sum=0
for num in "$@"
do
#the_sum=$(($the_sum + $num))
let the_sum+=$num
done
echo $the_sum
}
sum ${a[*]}

函数返回值

默认仅能使用 return 返回 (0,255) 范围内的数值。

如果需要函数返回数值以外类型的值,可以在函数调用之前,定义变量(这个就是全局变量)。在函数内部就可以直接修改,然后在执行函数就可以读出修改过的值。

另外,也可以使用 echo 的方式来获取其他类型的返回值。

1
2
3
4
5
6
7
8
9
#!/bin/bash
say_hello() {
name=$1
echo "Hello $1"
}
result=`say_hello "Tom"`
echo $result

函数返回数组变量

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
#!/bin/bash
a=(1 2 3)
plus2(){
echo parameters : "$@"
local newarray=(`echo "$@"`)
local element="$#"
#local i
for (( i = 0; i < $element; i++ ))
{
newarray[$i]=$[ ${newarray[$i]} * 2 ]
}
echo new value:${newarray[*]}
}
result=`plus2 ${a[*]}`
echo ${result[*]}

函数内部变量

如果需要定义自己变量,可以在函数中定义:local 变量=值 ,这时变量就是内部变量,它的修改,不会影响函数外部相同变量的值

删除函数

像删除变量一样,删除函数也可以使用 unset 命令,不过要加上 .f 选项,如:$unset .f function_name

全局函数

如果你希望直接从终端调用函数,可以将函数定义在主目录下的 .profile 文件,这样每次登录后,在命令提示符后面输入函数名字就可以立即调用。