目录
1. 语法
写法一:
Func1() {
command
}
写法二:
function Func1 {
command
}
写法三:
function Func1() {
command
}
function:关键字
Func1:自定义的函数名
- 两种写法都可以,根据自己习惯就好
2. 常见用法
2.1. 定义函数
注意:我个人比较喜欢直接使用函数名开头,以下示例皆使用这种方式
函数名以字母开头
Func(){
echo "这是一个函数"
}
函数名以数字开头
1func(){
echo "这是一个函数"
}
函数名以下划线开头
_func(){
echo "这是一个函数"
}
- 函数名可以以字母、数字、下划线开头,但不允许是纯数字
- 函数的首单词以大写开头(标准写法)
2.2. 调用函数
Func(){
echo "这是一个函数"
}
直接使用函数名即可调用
Func
# script:func.sh
Func1(){
echo "这是第1个函数"
}
Func2(){
Func1 # 函数中调用函数
echo "这是第2个函数"
}
使用函数调用函数
Func2
[yt@localhost function]$ bash func.sh
这是第1个函数
这是第2个函数
# script:func.sh
Func(){
echo "$1"
}
f=$( Func "abc" )
echo $f
在 $() 中使用函数
[yt@localhost function]$ bash func.sh
abc
- 注意顺序,函数体在上面,调用时必须在下面
2.3. 函数传参
# script:func.sh
Func(){
echo "函数的第一个参数:$1"
echo "函数的第二个参数:$2"
}
参数放在函数名后面即可,以空格分割
Func "one" "two"
[yt@localhost function]$ bash func.sh
函数的第一个参数:one
函数的第二个参数:two
# script:func.sh
eval执行命令,且不受变量影响
示例1:
Func1(){
echo "11111"
}
Func2(){
echo "22222"
}
Func3(){
for i in "$@";do # 遍历所有位置参数
eval $i
done
}
Func3 "Func1" "Func2"
输出结果
[yt@localhost function]$ bash func.sh
11111
22222
解释:
传入的位置参数 Func1 和 Func2 使用了双引号,所以表示这两个参数为字符串,并非函数
使用 for 循环遍历两个字符串,利用 eval 执行
eval 会将 Func1 和 Func2 当做命令执行。若没有这两个函数,那么会报错
示例2:
a="a b c d e f g h i j k"
for ((i=1; i<=3; i++));do
eval "a${i}='${a}'"
done
echo $a1
echo $a2
echo $a3
输出结果
[yt@localhost function]$ bash func.sh
a b c d e f g h i j k
a b c d e f g h i j k
a b c d e f g h i j k
2.4. 函数返回值
函数运行报错
Func(){
ls ttttt # 没有ttttt这个文件/目录
}
Func
echo $?
状态码为2(非0表示异常)
[yt@localhost function]$ bash func.sh
ls: 无法访问ttttt: 没有那个文件或目录
2
指定返回值为0
Func(){
ls ttttt # 没有ttttt这个文件/目录
return 0
}
Func
echo $?
状态码为0(0表示正常)
[yt@localhost function]$ bash func.sh
ls: 无法访问ttttt: 没有那个文件或目录
0
- 也就是说,不论函数是否执行成功,都可以强制赋予正常或异常的状态码
Func(){
w=0
while (( w < 10 ));do
(( w += 1))
done
return $w
}
Func
echo $?
echo $w
返回某个变量
[yt@localhost function]$ bash func.sh
10
10
2.5. 局部变量
定义局部变量一:
local var1="abc" # 定义当前变量
定义局部变量二:
lcoal var1 var2 var3 # 定义多个变量
var1="a"
var2="b"
var3="c"
示例一:local 定义局部变量
Func(){
local var="abc"
}
Func
echo ${var}
外部无法调用局部变量
[yt@localhost function]$ bash func.sh
示例二:不使用关键字local
Func(){
var="abc"
}
Func
echo ${var}
可以调用变量
[yt@localhost function]$ bash func.sh
abc
- 使用关键字local定时局部变量,定义后外部无法使用