Shell中函数可以像简单命令被调用,执行复合命令,函数可以带有参数,叫位置参数(以下简称"参数")。


函数基本形式为:

[ function ] name () compound-command [redirection]


上面定义了一个名称为name的函数,中括号[]里的保留字可省略;若保留,函数名后的小括号(),可省略。函数体是放在一对大括号{}里的复合命令。函数被调用时,就是执行该组复合命令。函数基本形式里重定向部分[redirection],会在函数体执行前,先执行。



若函数带有参数,那么参数个数,各个参数内容,所有参数,都有特殊变量表示。


示例如下(函数需先定义,后调用):

# function func () {

>     echo "参数个数: ${#}"

>     echo "第一个参数: ${1}"

>     echo "第二个参数: ${2}"

>     echo "第三个参数: ${3}"

>     echo "所有参数: ${@}"

>     echo "所有参数: ${*}"

> }


# func "a" "bb" "ccc"

参数个数: 3

第一个参数: a

第二个参数: bb

第三个参数: ccc

所有参数: a bb ccc

所有参数: a bb ccc


函数体中的变量若未使用内置命令local修饰,其就是在函数和调用者间共享,即全局变量;若使用local修饰,该变量就只属于函数,即局部变量。


函数的退出状态一般是函数体最后一个命令的状态。若想控制函数的退出时刻,需使用内置命令return显式指定。函数的退出状态使用$?表示。


示例如下,若$1不包含$2,返回1,否则返回0:

# function strstr () {

>     [ "${1#*$2*}" = "$1" ] && return 1

>     return 0

> }


# strstr "abcxyz" "zzz"

# echo $?

1


# strstr "abcxyz" "xyz"

# echo $?

0


如何将函数的输出,赋值给变量呢。前面说到函数调用,和执行简单命令类似,那么获取函数的输出,就和获取简单命令的输出类似。


示例如下:

# function getstring () {

>     echo "zzzz"

> }


# var=$(getstring)

# echo $var

zzzz


若感兴趣可关注订阅号”数据库最佳实践”(DBBestPractice).

qrcode_for_gh_54ffa7e55478_258.jpg