Shell 函数

Shell 脚本中, 可以自定义函数, 但是函数的功能有限. 函数可以提高代码的重用性.

  • 函数在使用之前必须先定义
  • 函数返回值只能是数字 [0~255]
  • 函数中定义的变量也是全局变量, 在函数外依然可用

1. 函数定义

shell 中函数的定义比较灵活, 怎么写都行. 关键字function , () , return 语句都是可以省略的

[function] func_name [()] {

   # 代码块儿

   # 返回值
   [ return int]
}

2. 函数调用

2.1 无返回值调用

函数调用比较简单, 直接输入函数名称就好了, 如果传参数的话, 直接在后面跟要传入的参数就好了

  • 无参调用: func_name
  • 有参调用: func_name arg1 arg2 arg3 ...

2.2 获取返回值

shell 中的函数只能返回0~255 直接的一个数字, 这个返回值保存在$? 变量中. 要获取函数的返回值, 必须在函数调用之后立刻获取$?的值, 因为$? 是预定义变量,用来记录上一条语句执行的结果的, 如果在调用函数之后, 有执行了其它语句, 那么$? 中记录的就不再是函数返回的结果了.

func_name
result=$?

3. 函数内获取传参

上面说了, 函数调用可以是无参调用, 也可以是有参调用, 那么在函数中如何获取传入的参数呢? 在函数中获取参数和脚本参数时一样的. 详情可参考Sehll 变量中对脚本变量的详细讲解

变量名 变量含义
$# 代表传入的参数格式
$* 代表传入的所有参数, 把所有传入的参数当做是一个字符串变量
$@ 代表传入的所有参数, 把所有传入的参数当做一个数组
$n n为数字,从1开始,表示传入的第几个参数,当超过9个参数时,需要用${n}
$0 命令本身

3. 示例程序

# 函数定义:
sayHello(){

  # 方法内定义的变量也是全局变量
  hello=Hello

  # 获取传入参数列表
  for name in $@
    do
      echo "$hello,$name"
    done

  # 函数返回
  return 1
}

#调用函数, 获取函数返回值
sayHello zhangsan lisi wangwu

# 获取函数返回值, 获取完之后, $? 立刻会发生变化 
result=$?
echo "result:$result, \$?:$?"

# 方法中定义的变量, 方法外也可以获取
echo "hello:$hello"

测试输出

[admin@localhost shell]$ ./function.sh 
Hello,zhangsan
Hello,lisi
Hello,wangwu
result:1, $?:0
hello:Hello
[admin@localhost shell]$

results matching ""

    No results matching ""