格式

  1. [ function ] funname [()]
  2. {
  3. action;
  4. [return int;]
  5. }
  • 1、可以带function fun() 定义,也可以直接fun() 定义,不带任何参数。
  • 2、参数返回,可以显示加:return 返回,如果不加,将以最后一条命令运行结果,作为返回值。 return后跟数值n(0-255)

不获取 return值和stdout值

  1. func() {
  2. name=zdkk
  3. echo "Hello $name"
  4. }
  5. func

结果:Hello zdkk

获取 return值和stdout值

  1. func() {
  2. name=zdkk
  3. echo "Hello $name"
  4. echo "abc"
  5. return 123
  6. }
  7. output=$(func)
  8. ret=$?
  9. echo "output = $output"
  10. echo "return = $ret"

结果:

  1. output = Hello zdkk
  2. abc
  3. return = 123

函数的输入参数

在函数内,$1表示第一个输入参数,$2表示第二个输入参数,依此类推。

注意:函数内的$0仍然是文件名,而不是函数名。

  1. func() { # 递归计算 $1 + ($1 - 1) + ($1 - 2) + ... + 0
  2. word=""
  3. while [ "${word}" != 'y' ] && [ "${word}" != 'n' ]
  4. do
  5. read -p "要进入func($1)函数吗?请输入y/n:" word
  6. done
  7. if [ "$word" == 'n' ]
  8. then
  9. echo 0
  10. return 0
  11. fi
  12. if [ $1 -le 0 ]
  13. then
  14. echo 0
  15. return 0
  16. fi
  17. sum=$(func $(expr $1 - 1))
  18. echo $(expr $sum + $1)
  19. }
  20. echo $(func 10)

输出:

  1. acs@d03778d09cd5:~$ ./test.sh
  2. 要进入func(10)函数吗?请输入y/ny
  3. 要进入func(9)函数吗?请输入y/ny
  4. 要进入func(8)函数吗?请输入y/ny
  5. 要进入func(7)函数吗?请输入y/ny
  6. 要进入func(6)函数吗?请输入y/ny
  7. 要进入func(5)函数吗?请输入y/ny
  8. 要进入func(4)函数吗?请输入y/ny
  9. 要进入func(3)函数吗?请输入y/ny
  10. 要进入func(2)函数吗?请输入y/ny
  11. 要进入func(1)函数吗?请输入y/ny
  12. 要进入func(0)函数吗?请输入y/nn
  13. 55

函数内的局部变量

可以在函数内定义局部变量,作用范围仅在当前函数内。
可以在递归函数中定义局部变量。

命令格式:
local 变量名=变量值

  1. #! /bin/bash
  2. func() {
  3. local name=zdkk
  4. echo $name
  5. }
  6. func
  7. echo $name

输出:

  1. zdkk

注意2为空行