您的位置:首页 > 运维架构 > Shell

Shell函数

2016-04-10 11:25 746 查看

1.函数定义

Shell函数有3中定义方式:
第一种定义:

function func(){
do something...
}


第二种定义,函数名与“{”之间必须有空格。

function func {
do something...
}


第三种定义:

func(){
do something...
}


Shell函数有点儿类似于C语言的函数,由于Shell函数没有函数声明,所以函数定义必须放在函数使用之前。同时,函数名必须是唯一的,否则会有问题,如果你重新定义了函数,那么新定义的函数会覆盖原函数,而不会产生错误信息。代码如下:

#!/usr/bin/env bash

function func1(){
name=func1
echo "This is function $name"
}
func1

# 函数名与“{”之间必须有空格
function func2 {
name=func2
echo "This is function $name"
}
func2

func3(){
name=func3
echo "This is function $name"
}
func3


输出:

This is function func1
This is function func2
This is function func3


2.返回值

2.1默认退出状态码

默认情况下,函数的退出状态码是函数中最后一条命令返回的退出状态码。在函数执行结束后,你可以用标准的“$?”变量来读取退出状态码。这种默认情况有个弊端,就是退出状态码只能显示函数中最后一条命令的执行状态,而无法保证函数中其他命令的执行状态。

下面的例子中,改变函数中命令的顺序,得到不同的退出状态码:
function func(){
ls -l test
echo "test return status code"
}
func
echo "return status code: $?"

function func(){
echo "test return status code"
ls -l test
}
func
echo "return status code: $?"

2.2使用return命令指定退出状态码

在Shell脚本中,return命令不是返回函数的值,而是返回退出状态码。在使用return返回退出状态码时,需要注意:
函数一结束就取退出状态码。如果在函数执行结束后,执行了其他命令,那么退出状态码可能会丢失。
退出状态码必须在0~255之间。

function func(){
read -p "Enter a value: " value
return $[ $value * 2 ]
}
func
echo "return status code: $?"


2.3函数返回值

如果要得到函数字符串、浮点数、整型等类型的返回值,那么首先需要用echo命令输出,然后将输出保存到变量里。获取返回值有两种方式:一是,将函数看作命令,用反引号“`”括起函数名;二是,用“$(函数名)”的形式。
function func(){
name=func1
echo "This is function $name"
}

val1=`func`
echo "The return value: $val1"

val2=$(func)
echo "The return value: $val2"

3.在函数使用变量

3.1向函数传递参数

函数可以使用标准的参数环境变量来代表命令行上传给函数的参数。例如,函数名在$0中定义,函数命令行上的任何参数在$1、$2等定义,特殊变量$#代表传给函数的参数数目。但是,函数的$#、$0、$1、$2等这些变量,和脚本主体参数的$#、$0、$1、$2等这些变量是完全不同的。注意,在脚本中给函数传参时,函数名和参数必须在同一行。
function func(){
arg1=$1
val=4
echo $[ $out * $arg1 * $2 ]
}

out=3
val1=`func $out 5`
echo "The return value: $val1"

val2=$(func $out 5)
echo "The return value: $val2"

3.2在函数中使用变量

在了解函数中使用变量之前,我们需要先知道全局变量和局部变量。
全局变量:在Shell脚本的任何地方都有效的变量。默认情况下,在脚本中定义的任何变量都是全局变量。
局部变量:函数内部使用的任何变量都可以被声明为局部变量。声明局部变量时,在变量名前加上“local”关键字就行了;也可以在给变量赋值时,在变量名前加上“local”。
function func(){
local arg
arg=$1
local temp=$[ $arg * 2 ]
echo $temp
}

temp=3

val=`func 5`
echo "The global temp: $temp"
echo "The return value: $val"

4.数组变量和函数

如果对Shell数组不熟,可以先看Shell数组

4.1向函数传递数组参数

向脚本函数传递数组变量时,有些复杂。如果将数组变量当做单个参数传递的话,函数只会取数组变量的第一个值。要解决这个问题,你必须将该数组变量的值分解成单个值,然后将这些值作为函数参数使用。在函数内部,你可以将所有的参数重组到新的数组变量中。
function func(){
#local newarr=$1   只会得到数组的第一个元素
local newarr=(`echo $@`)
for i in ${!myarr[*]};do
newarr[i]=$[ ${newarr[i]} * 2 ]
done
echo "The new array: ${newarr[*]}"
}
myarr=(1 2 3 4 5)

echo "My array: ${myarr[*]}"
func ${myarr[*]}


输出:

My array: 1 2 3 4 5
The new array: 2 4 6 8 10


4.2从函数返回数组

从函数里向Shell脚本传回数组变量,也用类似接收数组参数的方法。函数用echo语句来按正确顺序输出单个数组值,然后脚本再将它们重新放进一个新的数组变量中。
function func(){
local newarr=(`echo $@`)
for i in ${!myarr[*]};do
newarr[i]=$[ ${newarr[i]} * 2 ]
done
echo ${newarr[*]}
}

myarr=(1 2 3 4 5)

echo "My array: ${myarr[*]}"
val=(`func ${myarr[*]}`)
echo "The return array: ${val[*]}"
echo "The 5th element in the return array: ${val[4]}"


输出:

My array: 1 2 3 4 5
The return array: 2 4 6 8 10
The 5th element in the return array: 10
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  shell bash 函数