函数声明
语法:
# 第一种
fn() {
# codes
}
# 第二种
function fn() {
# codes
}
调用格式:函数名 参数1 参数2 参数3 ...
,就和执行脚本一样。
参数变量
函数体内获取参数变量,与脚本中获取脚本参数变量是一致的。
$1~$N
:函数的第一个到第N个的参数。$0
:函数所在的脚本名。$#
:函数的参数总数。$@
:函数的全部参数,参数之间使用空格分隔。$*
:函数的全部参数,参数之间使用变量${IFS}
值的第一个字符分隔,默认为空格,但是可以自定义。
全局变量和局部变量,local 命令
定义在函数体外的为全局变量,函数体内的为局部变量。
# 全局变量
globalVar="gvv"
fn() {
# 局部变量
localVar="lvv"
}
在一般的开发语言中,函数体内部可以访问外部的变量,外部无法访问到内部的变量。但是在 Shell 中,函数体内定义的变量是可以被外部访问的。
#!/bin/bash
fn () {
localVar="local var value"
}
fn
echo "localVar = ${localVar}"
输出:
$ ./func.sh
localVar = local var value
解决这个问题可以使用local
命令来实现:
#!/bin/bash
fn () {
local localVar="local var value"
}
fn
echo "localVar = ${localVar}"
输出:
./func.sh
inner: localVar = local var value
localVar =
return 命令
用于返回函数的返回值。在函数体中执行到了该命令,就不会继续向下执行了。
返回的值是有限定的,并不是所有值都能返回。必须是: [0-255]
区间中的整数。
#!/bin/bash
# 声明函数
function myFunc() {
return "abc"
}
# 调用函数
myFunc
执行:
$ ./func.sh
./func.sh: line 4: return: abc: numeric argument required
255
那么如何获取到函数的返回值呢:当调用函数后,函数的返回值会被赋值到$?
中。
#!/bin/bash
function myFunc() {
return 99
}
myFunc
echo "$?"
输出:
$ ./func.sh
99
如果函数没有返回值呢?
#!/bin/bash
function myFunc() {
echo "exec myFunc..."
}
myFunc
echo "$?"
输出:
$ ./func.sh
exec myFunc...
0
返回带有成功含义的0。
删除函数
与删除变量的方式一样,通过unset
命令即可:unset functionName
。
执行优先级
函数总是在当前 Shell 执行,Bash 会新建一个子 Shell 执行脚本。
如果函数与脚本同名,函数会优先执行。如果函数与别名同名,那么别名优先执行。
总结:别名 -> 函数 -> 脚本