一、Shell函数
1、函数定义
函数定义的语法格式:
function function_name() {statements[return int_value]
}
说明:
- function是 Shell 中的关键字,专门用来定义函数;
- function_name是函数名;
- statements是函数要执行的代码,也就是一组语句;
- return 表示函数的返回值int_value(0-255),可以写也可以不写。如果不写,将以最后一条命令运行结果,作为返回值。
注意:
return 语句只能返回一个介于 0 到 255 之间的 整数,而有可能超过这个范围或者返回其他值。要解决这个问题,您可以直接使用 echo 输出和而不是使用 return。
函数定义的简化写法
函数定义时也可以不写 function 关键字:
function_name() {statements[return value]
}
如果写了 function 关键字,也可以省略函数名后面的小括号:
function function_name {statements[return value]
}
推荐使用标准的定义写法,这样能够做到“见名知意”,一看就懂。
2、函数调用
调用 Shell函数仅使用其函数名即可。调用函数时可以给它传递参数,也可以不传递。
- 如果不传递参数,直接给出函数名字即可。
- 如果传递参数,那么多个参数之间以空格分隔。在函数体内部,通过 $n 的形式来获取参数的值。
不管是哪种形式,函数名字后面都不需要带括号。
函数调用语法格式:
# 无参
function_name
# 有参
function_name param1 param2 param3
注意:
- Shell 函数在定义时不能指明参数,但是在调用时却可以传递参数,并且给它传递什么参数它就接收什么参数。
- Shell 所有函数在使用前必须定义。这意味着必须将函数放在脚本开始部分,直至shell解释器首次发现它时,才可以使用。
示例如下:
#!/bin/bash#函数定义
function fn1(){echo "https://www.baidu.com/1"
}fn2(){echo "https://www.baidu.com/2"
}function fn3 {echo "function3"echo "https://www.baidu.com/3"
}#函数调用
fn1
fn2
fn3
echo "====="
fn3_res=$(fn3)
echo "fn3_res为:$fn3_res"
echo "ends"
二、函数示例
1、无参函数
示例如下:
#!/bin/bashfunction fun1(){echo "这个函数会对输入的两个数字进行相加运算。"echo "输入第一个数字: "read aNumecho "输入第二个数字: "read bNumsum=$(($aNum + $bNum))echo "两个数字计算结果为:$aNum + $bNum = $sum"
}fun1
echo "ends"
2、有参函数
传递参数查看:Shell流程控制和传参(https://blog.csdn.net/qq_42402854/article/details/136282663)。
通过 $n的形式来接收的参数,在 Shell 中称为位置参数(命令行参数)。注意:$10 不能获取第十个参数,获取第十个参数需要 ${10}。当n>=10时,需要使用${n}来获取参数。
示例如下:
#!/bin/bashfunWithParam(){echo "第一个参数为 $1 !"echo "第二个参数为 $2 !"echo "第十个参数为 $10 !" # 不对,请使用${10}echo "第十个参数为 ${10} !"echo "第十一个参数为 ${11} !"echo "参数总数有 $# 个!"echo "作为一个字符串输出所有参数 $* !"
}funWithParam 11 12 13 14 15 16 17 18 19 34 73echo "ends"
3、带返回值的函数
$@表示函数的所有参数,
$?表示函数的退出状态(返回值)。$? 仅对其上一条指令负责,一旦函数返回后其返回值没有立即保存入参数,那么其返回值将不再能通过 $? 获得。
示例1如下:
#!/bin/bashfunWithReturn(){aNum=$1bNum=$2sum=$(($aNum + $bNum))echo "两个数字计算结果为:$aNum + $bNum = $sum"return $(($aNum+$bNum))
}funWithReturn 2 4
echo "两个数字之和为 $? !"echo "ends"
示例2如下:
#!/bin/bashfunction getsum(){local sum=0for n in $@do((sum+=n))doneecho $sumreturn 0
}#调用函数并传递参数
getsum 10 20 55 15
echo "调用函数 return为 $? !"#调用函数并传递参数,最后将结果赋值给一个变量
total=$(getsum 10 20 55 15)
echo "变量接收函数结果:total = $total"#也可以将变量省略
echo "直接输出函数结果:$(getsum 10 20 55 15)"echo "ends"
– 求知若饥,虚心若愚。