Linux Shell函数方法简介
? echo -n "print 2a: "
? return $[ $a * 2 ]
}
fun1
echo "return value $?"
[~/shell/function]# ./return.sh?
enter a: 100
print 2a: return value 200
由于shell状态码最大是255,所以当返回值大于255时会出错
[~/shell/function]# ./return.sh?
enter a: 200
print 2a: return value 144
3.函数输出
为了返回大于255的数、浮点数和字符串值,最好用函数输出到变量:
[~/shell/function]# cat ./fun_out.sh?
#!/bin/bash
function fun2 {
? read -p "enter a: " a
? echo -n "print 2a: "
? echo $[ $a * 2 ]
}
result=`fun2`
echo "return value $result"
[~/shell/function]# ./fun_out.sh ? ??
enter a: 400
return value print 2a: 800
4.向函数传递参数(使用位置参数):
[~/shell/function]# cat ./parameter.sh?
#!/bin/bash
if [ $# -ne 3 ]
then
? ? echo "usage: $0 a b c"
? ? exit
fi
fun3() {
? ? echo $[ $1 * $2 * $3 ]
}
result=`fun3 $1 $2 $3`
echo the result is $result
[~/shell/function]# ./parameter.sh ?1 2 3
the result is 6
[~/shell/function]# ./parameter.sh ?1 2
usage: ./parameter.sh a b c
5.全局变量与局部变量
默认条件下,在函数和shell主体中建立的变量都是全局变量,可以相互引用,当shell主体部分与函数部分拥有名字相同的变量时,可能会相互影响,例如:
[~/shell/function]# cat ./variable.sh ? ?
#!/bin/bash
if [ $# -ne 3 ]
then
? ? echo "usage: $0 a b c"
? ? exit
fi
temp=5
value=6
echo temp is: $temp
echo value is: $value
fun3() {
? ? temp=`echo "scale=3;$1*$2*$3" | bc -ql` ??
? ? result=$temp
}
fun3 $1 $2 $3
echo "the result is $result"
if [ `echo "$temp > $value" | bc -ql` -ne 0 ]
then?
? ? echo "temp is larger"
else
? ? echo "temp is still smaller"
fi
[~/shell/function]# ./variable.sh ?12 3 2
temp is: 5
value is: 6
the result is 72
temp is larger
在这种情况下,在函数内部最好使用局部变量,消除影响
[~/shell/function]# cat ./variable.sh?
#!/bin/bash
if [ $# -ne 3 ]
then
? ? echo "usage: $0 a b c"
? ? exit
fi
temp=5
value=6
echo temp is: $temp
echo value is: $value
fun3() {
? ? local temp=`echo "scale=3;$1*$2*$3" | bc -ql` ??
? ? result=$temp
}
fun3 $1 $2 $3
echo "the result is $result"
if [ `echo "$temp > $value" | bc -ql` -ne 0 ]
then?
? ? echo "temp is larger"
else
? ? echo "temp is still smaller"
fi
[~/shell/function]# ./variable.sh ?12 3 2
temp is: 5
value is: 6
the result is 72
temp is still smaller
6.向函数传递数组变量:
[~/shell/function]# cat array.sh?
#!/bin/bash
a=(11 12 13 14 15)
echo ${a[*]}
function array(){
? echo parameters : "$@"?
? local factorial=1
? for value in "$@"
? do
? ? factorial=$[ $factorial * $value ]
? done
? echo $factorial
}
array ${a[*]}
[~/shell/function]# ./array.sh?
11 12 13 14 15
parameters : 11 12 13 14 15
360360
7.函数返回数组变量
[~/shell/function]# cat array1.sh?
#!/bin/bash
a=(11 12 13 14 15)
function array(){
? 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=`array ${a[*]}`
echo ${result[*]}
[~/shell/function]# ./array1.sh?
parameters : 11 12 13 14 15 new value:22 24 26 28 30