目录
定义函数就是只将一段实现某个任务的命令序列封装进一个函数,便于使用和后期维护。
function 函数名() {
命令序列
}
函数名() {
命令序列
}
- [root@localhost1 func]#vim definite.sh
- #!/bin/bash
- #定义函数运算()
- function yunsuan() {
- a=2
- b=3
- jia=$[ $a + $b ]
- jian=$[ $a - $b]
- echo "相加等于:$jia"
- echo "相减等于:$jian"
- }
定义过的函数需要调用才能执行其中的命令序列。
- [root@localhost1 func]#vim definite.sh
- #!/bin/bash
- function yunsuan() {
- a=2
- b=3
- jia=$[ $a + $b ]
- jian=$[ $a - $b]
- echo "相加等于:$jia"
- echo "相减等于:$jian"
- }
-
- #直接在脚本中写入函数名
- yunsuan
-
- [root@localhost1 func]#bash definite.sh
- 相加等于:5
- 相减等于:-1
- [root@localhost1 func]#vim definite.sh
- #!/bin/bash
- function jiajian() {
- a=10
- b=3
- jia=$[ $a + $b ]
- jian=$[ $a - $b]
- echo "相加等于:$jia"
- echo "相减等于:$jian"
- }
-
- function chengchu() {
- a=10
- b=3
- cheng=$[ $a * $b ]
- chu=$[ $a / $b]
- echo "相乘等于:$cheng"
- echo "相除等于:$chu"
- }
-
- #调用上两个函数
- yunsuan() {
- jiajian
- chengchu
- }
-
- yunsuan
-
- [root@localhost1 func]#bash definite.sh
- 相加等于:13
- 相减等于:7
- 相乘等于:30
- 相除等于:3
在Shell中,调用函数时可以向其传递参数。在函数体内部,通过 $n 的形式来获取参数的值。例如:$1表示第一个参数,$2表示第二个参数…即使用位置参数来实现参数传递。
注意
- 当我们执行脚本时跟的参数,对应的是脚本中的位置变量
- 当我们执行函数时跟的参数,对应的是函数中的位置变量
虽然都表示为$1、$2,但我们执行一个函数时,传入的参数只跟其输入函数的顺序有关,与输入脚本时传入参数的顺序无关。
- [root@localhost1 ~]#vim chuancan.sh
- #!/bin/bash
-
- test1() {
- jian=$[ $1 - $2 ] #脚本中的$1对应先传入的30,$2对应后传入的50
- echo "相减的值为:$jian"
- }
-
- test1 $2 $1 #执行函数时,先传入30($2),再传入50($1)
-
- [root@localhost1 ~]#bash chuancan.sh 50 30 #执行脚本时传入参数 $1对应50 $2对应30
- 相减的值为:-20
return 表示退出函数并返回一个退出值,脚本中可以用$?变量表示该退出值(状态码)
在函数中的使用原则
- 函数一结束就取返回值,因为$?变量只返回执行的最后一条命令的退出状态码;
- 退出状态码必须是0~255,超出时值将为除以256取余。
| 状态码 | 含义 |
|---|---|
| 0 | 执行成功 |
| 非0 | 不同程度的错误 |
| 2 | 用法不当 |
| 126 | 不是可执行的 |
| 127 | 命令未找到 |
- [root@localhost1 array]#vim returntest.sh
- #!/bin/bash
- returntest1() {
- if [ $1 -eq $passwd ];then
- echo "$name的密码输入正确!"
- else
- echo "$name的密码输入错误!"
- return 1
- fi
- }
-
- name=张三
- passwd=123456
- returntest1 $1
-
-
- [root@localhost1 array]#bash returntest.sh 123
- 张三的密码输入错误!
- [root@localhost1 array]#echo $?
- 1 -- 这里输入错误返回了我们指定的状态码1
- [root@localhost1 array]#bash returntest.sh 123456
- 张三的密码输入正确!
- [root@localhost1 array]#echo $?
- 0
-
是指函数在满足递归条件的情况下,调用函数本身执行到
- [root@localhost1 ~]#vim jiecheng.sh
- #!/bin/bash
- fact() {
- if [ $1 -eq 0 -o $1 -eq 1 ];then
- echo 1
- else
- way=$[$1 - 1] #迭代方式(指定数每次减1)
- result=$(fact $way) #递归执行函数(使初始值每次减1)
- echo $[ $1 * $result ] #输出初始值乘每次递归的值,直到1(实现阶乘效果)
- fi
- }
- read -p "请输入一个数:" n
- result=$(fact $n)
- echo "$n的阶乘为:$result"
-
-
- [root@localhost1 ~]#bash jiecheng.sh
- 请输入一个数:6
- 6的阶乘为:720
- [root@localhost1 ~]#bash jiecheng.sh
- 请输入一个数:1
- 1的阶乘为:1
- [root@localhost1 ~]#bash jiecheng.sh
- 请输入一个数:4
- 4的阶乘为:24
- [root@localhost1 ~]#bash jiecheng.sh
- 请输入一个数:9
- 9的阶乘为:362880
- [root@localhost1 ~]#vim variable.sh
- #!/bin/bash
- #定义i变量值为1
- i=1
-
- test1() {
- i=10 #定义i变量值为10
- echo $i
- }
-
- test1 #调用函数
- echo $i #输出变量i的值
-
- #输出的i均为10,是由于第二点的特性,i的值在函数中被重新赋值了
- [root@localhost1 ~]#bash variable.sh
- 10
- 10
使用 local 限定函数内部变量
- [root@localhost1 ~]#vim variable.sh
- #!/bin/bash
- i=1
-
- test1() {
- local i=10 #加local限定为内部变量,将不再影响函数外的变量
- echo $i
- }
-
- test1
- echo $i
-
-
- [root@localhost1 ~]#bash variable.sh
- 10
- 1
在外部脚本调用一个脚本或文件中的函数,需要先在脚本中加载目标文件,需要使用绝对路径(source 文件名 或 . 文件名),再输入函数名即可执行。
- [root@localhost1 ~]#vim hanshu.sh
- #!/bin/bash
-
- test1() {
- echo "我是hanshu.sh文件中的test1函数"
- }
-
- #在外部脚本中调用hanshu.sh中的test1函数
- [root@localhost1 ~]#vim diaoyong.sh
- source /root/hanshu.sh
-
- test1
-
- #执行外部脚本
- [root@localhost1 ~]#bash diaoyong.sh
- 我是hanshu.sh文件中的test1函数
调用函数库文件
函数库文件是指将一些常用的函数提前编写好放入这个函数库文件,当我们编写脚本时,同样通过绝对路径加载函数库文件,在调用其中的函数,这样可以提高代码编写的效率(类似于java中面向对象编程,调用方法)