第十六章:创建函数
基本的脚本函数
创建函数
1.用function关键字,后面跟函数名
function name { commands }
2.函数名后面跟空圆括号,标明正在定义一个函数
name() { commands }
如果两个函数的名称相同,那么后面的将会覆盖前面的,而且不会有提示。
使用函数
使用函数名称即可。必须先定义,再使用。
#!/bin/bash f1() { echo "this is f1." } f1 function f1 { echo "this is f1111." } f1 f2 f2() { echo "this is f2." }
这里首先定义了f1,然后执行,然后又定义了一个f1,再执行。发现第二次执行的是新的f1函数。
接着调用f2,由于此时f2还没有定义,所以会调用失败。
$ function_test this is f1. this is f1111. ./function_test: line 12: f2: command not found
返回值
bash shell会把函数当做小型脚本,运行结束时会返回一个退出状态码。
有三种方式生成函数退出状态码
默认退出状态码
默认情况下,函数的退出状态码是函数中最后一条命令返回的退出状态码
函数执行结束后,可以使用$?变量来决定函数的退出状态码
#!/bin/bash fun(){ ls nothing echo $? echo "done" } fun echo "fun:$?"
由于ls找不到nothing文件或者目录,所以返回的状态码=2
但是fun函数最后的echo执行成功了,所以fun返回的状态码=0
$ function_test ls: cannot access nothing: No such file or directory 2 done fun:0
使用函数默认退出状态码是很危险的……
使用return命令
bash shell使用return命令退出函数并返回特定的退出状态码。
return命令允许指定一个整数值来定义函数的退出状态码
注意:函数一结束就取返回值,退出状态码必须在0-255之间。
使用函数输出
可以将函数的输出保存到变量中,例如:
result=`f1`
bash shell不会将read读取输入的部分作为 STDOUT
在函数中使用变量
向函数传递参数
在脚本中指定函数时,必须将参数和函数放在同一行
然后函数可以用参数环境变量来获得参数值
在函数中处理变量
函数会用到全局变量和局部变量。
全局变量
在脚本中定义的所有变量均为全局变量。
#!/bin/bash var=1 fun(){ echo "var:"$var var2=2 } fun echo "var2:"$var2
输出:
$ function_test var:1 var2:2
局部变量
函数内部任何变量都可以声明为局部变量,只需在变量前加local关键字即可。
在脚本中定义的局部变量,函数中是无法访问的。
数组变量和函数
向函数传递数组参数
需要将数组变量的值分解成单个值,然后作为函数参数使用。
在函数内部,可以将他们再组成一个数组。
#!/bin/bash array=(a b c d) fun(){ newarray=($@) #重新组合为数组 echo "newarray is:"${newarray[*]} #打印数组 echo "The 3rd element is:"${newarray[3]} } fun ${array[*]} #拆分成多个值传入
输出:
$ function_test newarray is:a b c d The 3rd element is:d
如果试图将数组当做一个参数传递给函数,那么函数只会读取数组变量的第一个值。
#!/bin/bash array=(a b c d) fun(){ echo "We have "$#" parameter(s)." echo "They are: "$@ echo "They are: "$* } fun $array
fun函数只认识数组中的第一个元素
$ function_test We have 1 parameter(s). They are: a They are: a
从函数返回数组
#!/bin/bash fun(){ local array=(a b c d) echo ${array[*]} } array=(`fun`) echo ${array[2]}
同返回普通字符串类似,按顺序echo输出,然后放在圆括号里面即可。
函数递归
还是以最简单的求N的阶乘为例:
#!/bin/bash fun(){ local result=1; if [ $1 -eq 1 ] then echo 1 else result=$[$1 * `fun $[$1 - 1]`] echo $result fi } fun $1
没有新的知识点,只是不太熟悉罢了
如果使用了``,那么函数内的echo就不会输出到STDOUT了,和上面其他的例子一样。
创建库
source命令可以在当前的shell上下文中执行命令,而不是创建一个新的shell来执行命令。可以用source命令来在shell脚本中运行库文件脚本。
source命令等同于点操作符(dot operator)
在一个名叫lib_test的文件中定义一个plus函数
#!/bin/bash plus(){ if [ $# -ne 2 ] then echo "I need 2 numbers!" return fi echo $[$1 + $2] }
然后我们在另一个脚本中使用它
#!/bin/bash . lib_test #脚本路径 plus $1 $2
使用方法很简单,这样就相当于把lib_test导入到当前文件中了
$ function_test 4 5 9
在命令行上使用函数
在命令行上创建函数
由于在键入命令时shell就会解释命令,所以可以在命令上直接定义函数。
$ plus(){ echo $[$1 + $2]; } $ plus 3 1 4
注意:要在花括号两边加空格,每条命令用分号隔开。
下面的方法看起来更实用一些,效果也更好
$ plus(){ > echo $[$1 + $2] > } $ plus 4234 23 4257
无须分号和空格。
在.bashrc文件中定义函数
可以直接在这里定义函数,也可以使用source命令,导入库
注意,修改了.bashrc之后要重启才能生效
如果不是每次开机都要执行,那我们还可以在shell中直接使用source,很多时候,这种方式可能更好一些。
转贴请保留以下链接
本人blog地址