Shell 函数的本质是一段可以重复使用的脚本代码,这段代码被提前编写好了,放在了指定的位置,使用时直接调取即可。
Shell 中的函数和C++、Java、Python、C# 等其它编程语言中的函数类似,只是在语法细节有所差别。
Shell 函数定义的语法格式如下:
function name() {
statements
[return value]
}
对各个部分的说明:
-
function
是 Shell 中的关键字,专门用来定义函数; -
name
是函数名; -
statements
是函数要执行的代码,也就是一组语句; -
return value
表示函数的返回值,其中 return 是 Shell 关键字,专门用在函数中返回一个值;这一部分可以写也可以不写。
由{ }
包围的部分称为函数体,调用一个函数,实际上就是执行函数体中的代码。
一、函数定义的简化写法
如果你嫌麻烦,函数定义时也可以不写 function 关键字:
name() {
statements
[return value]
}
如果写了 function 关键字,也可以省略函数名后面的小括号:
function name {
statements
[return value]
}
建议使用标准的写法,这样能够做到“见名知意”,一看就懂。
二、函数调用
调用 Shell 函数时可以给它传递参数,也可以不传递。如果不传递参数,直接给出函数名字即可:
name
如果传递参数,那么多个参数之间以空格分隔:
name param1 param2 param3
不管是哪种形式,函数名字后面都不需要带括号。
和其它编程语言不同的是,Shell 函数在定义时不能指明参数,但是在调用时却可以传递参数,并且给它传递什么参数它就接收什么参数。
Shell 也不限制定义和调用的顺序,你可以将定义放在调用的前面,也可以反过来,将定义放在调用的后面。
实例:
1) 定义一个函数,输出 Shell 教程的地址:
#!/bin/bash
#函数定义
function url(){
echo "http://c.biancheng.net/shell/"
}
#函数调用
url
运行结果:
http://c.biancheng.net/shell/
==================
你可以将调用放在定义的前面
2) 定义一个函数,计算所有参数的和:
#!/bin/bash
function getsum(){
local sum=0
for n in $@
do
((sum+=n))
done
return $sum
}
getsum 10 20 55 15 #调用函数并传递参数
echo $?
运行结果:
100
$@
表示函数的所有参数,$?
表示函数的退出状态(返回值)。
三、Shell函数参数
和C++、C#、Python 等大部分编程语言不同,Shell 中的函数在定义时不能指明参数,但是在调用时却可以传递参数。
函数参数是 Shell位置参数的一种,在函数内部可以使用$n
来接收,例如,$1 表示第一个参数,$2 表示第二个参数,依次类推。
除了$n
,还有另外三个比较重要的变量:
-
$#
可以获取传递的参数的个数; -
$@
或者$*
可以一次性获取所有的参数
(1)带参数的函数示例:
#!/bin/bash
funWithParam(){
echo "第一个参数为 $1 !"
echo "第二个参数为 $2 !"
echo "第十个参数为 $10 !"
echo "第十个参数为 ${10} !"
echo "第十一个参数为 ${11} !"
echo "参数总数有 $# 个!"
echo "作为一个字符串输出所有参数 $* !"
}
funWithParam 1 2 3 4 5 6 7 8 9 34 73
输出结果:
第一个参数为 1 !
第二个参数为 2 !
第十个参数为 10 !
第十个参数为 34 !
第十一个参数为 73 !
参数总数有 11 个!
作为一个字符串输出所有参数 1 2 3 4 5 6 7 8 9 34 73 !
注意,$10 不能获取第十个参数,获取第十个参数需要${10}。当n>=10时,需要使用${n}来获取参数。
(2)实例2:使用 $@ 来遍历函数参数。
定义一个函数,计算所有参数的和:
#!/bin/bash
function getsum(){
local sum=0
for n in $@
do
((sum+=n))
done
echo $sum
return 0
}
#调用函数并传递参数,最后将结果赋值给一个变量
total=$(getsum 10 20 55 15)
echo $total
#也可以将变量省略
echo $(getsum 10 20 55 15)
运行结果:
100
100
(3)其他特殊字符用来处理参数:
参数处理 | 说明 |
$# | 传递到脚本或函数的参数个数 |
$* | 以一个单字符串显示所有向脚本传递的参数 |
$$ | 脚本运行的当前进程ID号 |
$! | 后台运行的最后一个进程的ID号 |
$@ | 与$*相同,但是使用时加引号,并在引号中返回每个参数。 |
$- | 显示Shell使用的当前选项,与set命令功能相同。 |
$? | 显示最后命令的退出状态。0表示没有错误,其他任何值表明有错误。 |
四、return返回值
1. 有return
(1)¥?获取return返回值
#!/bin/bash
function demoFun1(){
echo "这是我的第一个 shell 函数!"
return `expr 1 + 1`
}
demoFun1
echo $?
这是我的第一个 shell 函数!
2
(2)$? 仅对其上一条指令负责,一旦函数返回后其返回值没有立即保存入参数,那么其返回值将不再能通过 $? 获得
#!/bin/bash
function demoFun1(){
echo "这是我的第一个 shell 函数!"
return `expr 1 + 1`
}
demoFun1
echo $? #调用函数后立即获取返回值,可以获取返回值
echo $? #调用函数后,上面已经执行其他命令,获取不到函数调用的返回值,而是获取到的上一条命令的执行结果(0代表上一条命令echo $?执行的结果)
执行结果:
这是我的第一个 shell 函数!
2
0
2. 没有return
shell如果没有return,默认retur 0
shell 语言中 0 代表 true,0 以外的值代表 false。
3. 函数与命令的执行结果可以作为条件语句使用。
1. 打印返回结果
实例1:
#!/bin/bash
echo "Hello World !" | grep -e Hello
echo $?
运行结果:
Hello World !
0
实例2:
echo "Hello World !" | grep -e Bye
echo $?
运行结果:
1
grep 是从给定字符串中寻找匹配内容的命令。首先看出如果找到了匹配的内容,会打印匹配部分且得到的返回值 $? 为 0,如果找不到,则返回值 $? 为 1。
2. 返回值当if条件判断
#!/bin/bash
if echo "Hello World !" | grep -e Hello
then
echo true
else
echo false
fi
if echo "Hello World !" | grep -e Bye
then
echo true
else
echo false
fi
运行结果:
Hello World !
true
false
分别将这两次执行的 grep 命令当作条件语句交给 if 判断,得出返回值 $? 为 0,即执行成功时,条件语句为 true,当返回值 $? 为 1,即执行失败时,条件语句为 false。
========
#!/bin/bash
function demoFun1(){
return 0
}
function demoFun2(){
return 12
}
if demoFun1
then
echo true
else
echo false
fi
if demoFun2
then
echo ture
else
echo false
fi
用函数的 return 值作为测试,其中 demoFun1 返回值为 0,demoFun2 返回值选择了任意一个和 0 不同的整数,这里为 12。
将函数作为条件语句交给 if 判断,得出返回值为 0 时,依然为 true,而返回值只要不是 0,条件语句都判断为 false。