Shell函数

函数定义

定义格式:

[ function ] funname() {

   # statements;

    [return value]

}

说明:

  • function是定义函数的关键字,但是并不强制. 如果使用function则函数名后面括号可以省略
  • 不需要定义参数列表,这同其他语言是有区别的
  • 参数返回,可以显示加:return 返回值,如果不加,将以最后一条命令运行结果,作为返回值。

示例:

#!/bin/bash

function myFun(){
    echo "my shell method"
}

withoutFun(){
    echo "this method without function keyword"
}

function noParentheses{
    echo "this method no parentheses"
    return 1
}

函数调用

shell函数调用非常简单,使用函数名即可

函数名 [参数1 参数2...]

如调用上面代码中定义的函数

echo "调用函数开始"
myFun

函数应该是先定义后调用,即调用代码应是在定义代码之后

函数变量作用范围

  1. 函数在shell脚本中仅在当前shell环境中有效

  2. 变量默认全局变量

  3. 函数内局部变量定义使用local关键字

    myfun(){
      #声明一个局部变量
      local i
      i=10
      echo $i
    }
    # 同名全局变量
    i=20
    
    myfun
    echo $i
    
    输出结果:
    10
    20
    

函数参数

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

$0 表示是脚本参数,表示脚本名称

示例

#!/bin/bash  

function withParams(){  
    echo "参数总数: $#"  
    echo "第一个参数: $1 "  
    echo "第二个参数: $2 "  
    echo "所有参数:  $* "  
}  

withParams 8 9 "A" "X"

注: 参数位置超过10时,应使用${n}方式获取, 如使用$10 编译器会认为是$1

函数返回值

return表示退出函数并返回一个退出值,用 $?接收函数返回值

函数结束就取返回值,因为$?变量只返回执行的最后一条命令的退出状态码 退出状态码必须是0~255,超出时值将为除以256取余

示例:

sum(){
    return $[$1+$2]
}

sum 2 4
echo $?

特殊字符说明:

参数处理说明
$0脚本运行的第一个参数,即脚本名称
$n传递给脚本或函数的参数。n 是n>=1的数字,表示第几个参数。例如,第一个参数是 $1,第二个参数是 $2。
$#传递给脚本或函数的参数个数
$*传递给脚本或函数的所有参数,使用引号"$"时表示所有参数合并为一个整体,即参数列表被合并成了一个变量
$$脚本运行的当前进程ID号
$!后台运行的最后一个进程的ID号
$@与$*相同,但是使用引号不同, "$@"" 仍表示所有参数,并没有合并
$-显示Shell使用的当前选项,与set命令功能相同。
$?显示最后命令的退出状态。0表示没有错误,其他任何值表明有错误。