1.shell函数的定义与调用
Shell 函数定义 | 说明 | 函数定义的简化写法 | 函数调用 |
function name() { statements [return value] } |
function 是 Shell 中的关键字,专门用来定义函数;
name 是函数名;
statements 是函数要执行的代码,也就是一组语句;
return value 表示函数的返回值,其中 return 是 Shell 关键字,专门用在函数中返回一个值;这一部分可以写也可以不写。
- 由
{ } 包围的部分称为函数体,调用一个函数,实际上就是执行函数体中的代码。
|
1.定义函数时不写function关键字
name() { statements [return value] }
2.定义时使用function关键字,但省略函数名后的小括号
function name { statements [return value] }
|
- 调用函数时可以传递参数,也可以不传递。
-
- 如果不传递参数,直接给出函数名字即可:name
- 如果传递参数,那么多个参数之间以空格分隔:
- name param1 param2 param3
- 不管是哪种形式,函数名字后面都不需要带括号。
2. Shell 函数在定义时不能指明参数,但是在调用时却可以传递参数,并且给它传递什么参数它就接收什么参数。
3. Shell 也不限制定义和调用的顺序,你可以将定义放在调用的前面,也可以反过来,将定义放在调用的后面。
|
实例1 | 实例2 | 实例3 | 知识点 |
定义一个函数,输出 Shell 教程的地址:
- function url(){
- echo "http://c.biancheng.net/shell/"
- }
- url
运行结果: http://c.biancheng.net/shell/
|
你可以将调用放在定义的前面,即:
- url
- function url(){
- echo "http://c.biancheng.net/shell/"
- }
运行结果: http://c.biancheng.net/shell/
|
定义一个函数,计算所有参数的和:
- function getsum(){
- local sum=0
- for n in $@
- do
- ((sum+=n))
- done
- return $sum
- }
- getsum 10 20 55 15
- echo $?
运行结果: 100
|
$@ 表示函数的所有参数,$? 表示函数的退出状态(返回值)
- 此处使用return 关键字将所有数字的和返回,并使用
$? 得到这个值,这种方式是错误后,后续内容会进行解释
|
2.shell函数参数
Shell 中的函数在定义时不能指明参数,但是在调用时却可以传递参数
| 实例1 | 实例2 |
函数参数是 Shell 位置参数的一种,在函数内部可以使用$n 来接收传递的参数
- $1 表示第一个参数,$2 表示第二个参数….
$# 可以获取传递的参数的个数;
$@ 或者$* 可以一次性获取所有的参数。
|
使用 $n 来接收函数参数。
- function show(){
- echo "Tutorial: $1"
- echo "URL: $2"
- echo "Author: "$3
- echo "Total $# parameters"
- }
- show C
运行结果: Tutorial: C# URL: http://c.biancheng.net/csharp/ Author: Tom Total 3 parameters
|
使用 $@ 来遍历函数参数
- 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.函数返回值
大部分编程语言return 函数结果 |
在 C++、Java、Python 等大部分编程语言中,返回值是指函数被调用之后,执行函数体中的代码所得到的结果,这个结果就通过 return 语句返回。 |
|
shell return退出状态 |
Shell 中的返回值表示的是函数的退出状态:返回值为 0 表示函数执行成功了,返回值为非 0 表示函数执行失败(出错)了。if、while、for 等语句都是根据函数的退出状态来判断条件是否成立 |
Shell 函数的返回值只能是一个介于 0~255 之间的整数,其中只有 0 表示成功,其它值都表示失败。
如果函数体中没有 return 语句,那么使用默认的退出状态,也就是最后一条命令的退出状态。即默认返回为return $?
$? 是一个特殊变量,用来获取上一个命令的退出状态,或者上一个函数的返回值。
|
shell 函数处理结果 |
获取函数处理结果
-
- 一种是借助全局变量,将得到的结果赋值给全局变量;
- 一种是在函数内部使用 echo、printf 命令将结果输出,在函数外部使用
$() 或者`` 捕获结果
|
|
| 实例1 | 实例2 |
|
将函数处理结果赋值给一个全局变量。
- sum=0
- function getsum(){
- for((i=$1; i<=$2; i++)); do
- ((sum+=i))
- done
- return $?
- }
- read m
- read n
- if getsum $m $n; then
- echo "The sum is $sum"
- else
- echo "Error!"
- fi
运行结果: 1 100 The sum is 5050
这种方案的弊端是:定义函数的同时还得额外定义一个全局变量,如果我们仅仅知道函数的名字,但是不知道全局变量的名字,那么也是无法获取结果的。
|
在函数内部使用 echo 输出结果。
- function getsum(){
- local sum=0
- for((i=$1; i<=$2; i++)); do
- ((sum+=i))
- done
- echo $sum
- return $?
- }
- read m
- read n
- total=$(getsum $m $n)
- echo "The sum is $total"
运行结果: 1↙ 100↙ The sum is 5050
代码中总共执行了两次 echo 命令,但是却只输出一次,这是因为$() 捕获了第一个 echo 的输出结果,它并没有真正输出到终端上。除了$() ,你也可以使用`` 来捕获 echo 的输出结果。
这种方案的弊端是:如果不使用$() ,而是直接调用函数,会将结果直接输出到终端上。
|