《Linux命令行与shell脚本编程大全》创建函数


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

相关内容

    暂无相关文章