shell--(九)Shell函数
原文:https://www.runoob.com/linux/linux-shell-func.html
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。