shell 脚本之函数

简介

函数是一些命令的集合,用一个名称做代表,称为函数名。

函数的最大作用就是让程序模块化。

Bash调用函数时不会开启新的shell,会在现有shell环境中执行该函数。

用法

语法

有3种写法,推荐用第2种。


function  funcName() {
     cmds...
}

funcName() {
     cmds...
}

function  funcName {
     cmds...
}

调用函数

函数调用直接写出函数名称即可,如果有参数,写在函数名称后面,空格分隔。


funcName
funcName  paramVal1  paramVal2  paramVal3

取消函数定义

unset -f funcName

在函数执行期间,Bash会建立一个特别的变量FUNCNAME,值为函数名称。

函数的结束状态

执行函数时,函数中最后一个命令的返回值代表函数的结束状态,如果遇到return命令,则立即返回,return命令可以指定函数的返回值。

函数与变量的作用范围

函数仅在定义的shell环境中有效,如果要传递函数给子shell环境使用,需要使用命令export及其选项-fexport -f funcName

变量的作用域默认是全局的。可用local将变量设置为函数私有的。

位置参数

函数的参数借用了命令行的位置参数的概念,用来传递变量值。

当函数借用命令行的位置参数时,原位置参数值会被暂时保存起来,等到函数执行结束,会再复原其值。

移动位置参数

shift [n]:往前移动位置参数的值,移动n个单位,n默认是1。

指定位置参数的值

set val1 val2 ...:set命令设定位置参数的值,按顺序将对应的值传给 $1, $2, $3, ....

如果要一次重置所有的位置参数,使其值为空,可执行:set --

取命令行选项和参数

使用内置命令getopts:getopts 选项行 选项变量。其中的选项行由单一字符组成。

如果某个选项需要提供一个参数,则在选项字符后方接上冒号:,当选项没有提供额外的参数时,Bash就会提示错误信息,如果不想出现错误信息,可在选项行的最前面加上冒号:

选项变量的作用:getopts由命令行取得选项,把它放入选项变量中,如果该选项需要额外的参数,参数值会放入OPTARG变量中。

举例

必须用bash命令来执行:bash func.sh -u test -h,用句点或sh都不行。


while getopts u:ah opt
do
    case $opt in
    u) echo "provide option u and val :$OPTARG" ;;
    a) echo "provide option a" ;;
    h) echo "provide option h" ;;
    *) ;;
    esac
done

function func1() {
    echo "i am func1," '$@=' $@
}

func2() {
    while shift
    do
       [ -n "$1" ] && echo "shift 1, \$@ is :" $@
    done
}

function func3 {
    set hello world
    echo "i am func3, \$@ is :" $@
}

func1 abc xyz 123
func2 0 8 9 3 4 5
func3

发表评论

电子邮件地址不会被公开。 必填项已用*标注

This site uses Akismet to reduce spam. Learn how your comment data is processed.