LV080-函数
一、 shell 函数
1. 怎么定义?
shell
[function] function_name()
{
list of commands.
[ return int_value ]
}【注意】
(1) function 是可选的,可以省略不写,直接就是函数名字也可以。不写function的时候是POSIX 风格,bash和sh都支持,当写上function的时候,是Bash 扩展风格,只有bash支持。两者对函数格式支持情况如下:
| 特性 | Bash | Sh |
|---|---|---|
name() {} | ✅ | ✅ |
function name() {} | ✅ | ❌ |
function name {} | ✅ | ❌ |
(2) return int_value 表示返回值,如果不加,将以最后一条命令运行结果,作为返回值。函数的返回值可以在调用该函数后通过 $? 来获得。
(3) Shell 中,通过 return 只能返回整数值,并且是 0-255 的范围,如果超出这个范围就会错误的结果。
(4)如果希望直接从终端调用函数,可以将函数定义在主目录下的 .profile 文件,这样每次登录后,在命令提示符后面输入函数名字就可以立即调用。
2. 怎么调用?
shell
# 方式1
function_name [arg1 arg2 ...]
# 方式2
value_name= function_name [arg1 arg2 ... ]【注意】
(1)函数必须先定义后使用,这意味着必须将函数放在脚本开始部分,直至 shell 解释器首次发现它时,才可以使用。不像 C 语言一样可以只在前边声明函数,到最后再定义。
(2) Shell 函数的调用只需要写出函数名即可,不需要写出括号 () 。
3. 删除函数
像删除变量一样,函数也可以被删除。
shell
$unset .f function_name4. 函数的参数传递
4.1 传参格式
在 Shell 中,调用函数时可以向其传递参数。在函数体内部,通过 $n (也就是位置变量)的形式来获取参数的值。除了 $n 还有几个特殊字符也可以用于处理参数。
| ${n} | 位置变量 |
| ${*} | 以一个单字符串显示所有向脚本传递的参数 |
| ${$} | 脚本运行的当前进程ID号 |
| ${!} | 后台运行的最后一个进程的ID号 |
| ${@} | 与$*相同,但是使用时加引号,并在引号中返回每个参数 |
| ${?} | 显示最后命令的退出状态。0表示没有错误,其他任何值表明有错误 |
| $# | 传递到脚本或函数的参数个数 |
shell
# 定义函数时使用传入的参数
[function] function_name()
{
echo "$1" # 输出第1个位置变量
echo "${10}" # 输出第10个位置变量
}
# 调用函数时传入参数
function_name [ arg1 arg2 arg3 ... ]4.2 使用实例
shell
#!/bin/bash
function test()
{
for var in 1 2 3 4 5 6 7 8 9 10
do
echo '$'${var}' = '${var}' '
done
}
test 10 9 8 7 6 5 4 3 2 1 0输出结果为:
shell
$1 = 1
$2 = 2
$3 = 3
$4 = 4
$5 = 5
$6 = 6
$7 = 7
$8 = 8
$9 = 9
$10 = 10二、函数内部的变量
1. 两种作用域
shell 函数内部可以定义变量,有两种定义方式。两种方式代表了变量有不同的作用域。
全局作用域:在脚本的其他任何地方都能够访问该变量。
局部作用域:只能在声明变量的作用域内(函数内部)访问。
shell
# 局部变量
local variable_name=value
# 全局变量
variable_name=value2. 使用实例
shell
#!/bin/bash
function test()
{
var1=10
local var2=20
echo "函数内打印在函数内部定义的变量"
echo "var1=${var1}"
echo "var2=${var2}"
}
test
echo "函数外打印在函数内部定义的变量"
echo "var1=${var1}"
echo "var2=${var2}"输出结果为:
shell
函数内打印在函数内部定义的变量
var1=10
var2=20
函数外打印在函数内部定义的变量
var1=10
var2=可以看出,局部变量 var2 的值在函数外是访问不到的。