基本脚本函数
1、创建函数
有两种格式可以用来在bash shell脚本中创建函数。
第一种采用关键字function。后跟分配给该代码的函数名。
function name { commands }
name属性定义了赋予函数唯一的名称。脚本中定义的每个函数都必须有一个唯一的名称。
commands是构成函数的一条或多条bash shell命令。在调用该函数时,bash shell会按命令在函数中出现的顺序依次执行,就像在普通脚本中一样。
在bash shell脚本中定义函数的第二种格式更接近于其他编程语言中定义函数的方式。
name(){ conmmands }
函数名后的空括号表明正在定义的是一个函数。这种格式的命名规则和之前定义shell脚本函数的格式一样。
2、使用函数
要在脚本中使用函数,只需要向其他shell命令一样,在行中指定函数名就行。
[root@node1 ljy]# more ceshi.sh #!/bin/bash function func1 { echo "hello everyone!" } count=1 while [ $count -le 5 ] do func1 count=$[ $count + 1 ] done [root@node1 ljy]# sh ceshi.sh hello everyone! hello everyone! hello everyone! hello everyone! hello everyone!
返回值
有3种不同的方法来为函数生成退出状态码。
1、默认退出状态码
默认情况下,函数的退出状态码是函数中最后一条命令返回的退出状态码。
如果之前命令有失败,但是最后一条命令是成功的,该函数的退出状态码也是0,所以使用默认退出状态码是很危险的。
2、使用return命令
return命令允许指定一个整数值来定义函数的退出状态码。
[root@node1 ljy]# more ceshi.sh #!/bin/bash function db1 { read -p "enter your value:" value echo "doubling the value" return $[ $value * 2 ] } db1 echo "the new value is $?" [root@node1 ljy]# sh ceshi.sh enter your value:3 doubling the value the new value is 6
如果使用这种方式来获取返回码,需要注意
(1)函数一结束就取返回值。
(2)退出状态码必须是0~255
3、使用函数输出
可以将函数的结果输出保存在变量中。
[root@node1 ljy]# more ceshi.sh #!/bin/bash function db1 { read -p "enter your value:" value echo $[ $value * 2 ] } result=$(db1) echo "the new value is $result" [root@node1 ljy]# sh ceshi.sh enter your value:2 the new value is 4
在函数中使用变量
像函数传递参数
函数可以使用标准的参数环境变量来表示命令行上传给函数的参数。
在脚本中指定函数时,必须将函数和参数放在同一行:funcl $valu1 10
[root@node1 ljy]# more ceshi.sh #!/bin/bash function addem { if [ $# -eq 0 ] || [ $# -gt 2 ] then echo "-1" elif [ $# -eq 1 ] then echo $[ $1 + $1 ] else echo $[ $1 + $2 ] fi } echo -n "adding 10 and 5: " value=$(addem 10 5) echo $value [root@node1 ljy]# sh ceshi.sh adding 10 and 5: 15
也可以这么玩
[root@node1 ljy]# more ceshi.sh #!/bin/bash function addem { if [ $# -eq 0 ] || [ $# -gt 2 ] then echo "-1" elif [ $# -eq 1 ] then echo $[ $1 + $1 ] else echo $[ $1 + $2 ] fi } echo -n "the result is: " value=$(addem $1 $2) echo $value [root@node1 ljy]# sh ceshi.sh 1 2 the result is: 3
在函数中处理变量
函数使用两种类型的变量,全局变量和局部变量
1、全局变量
默认情况下,你在脚本中定义的任何变量都是全局变量。
[root@node1 ljy]# more ceshi.sh #!/bin/bash function func1 { temp=$[ $value + 5 ] value=$[ $temp + 1 ] } temp=2 value=3 func1 echo -n "temp is : " echo $temp echo -n "value is : " echo $value [root@node1 ljy]# sh ceshi.sh temp is : 8 value is : 9
temp的数据就受到了影响。
2、局部变量
local 关键字保证了变量只局限在该函数中。
[root@node1 ljy]# more ceshi.sh #!/bin/bash function func1 { local temp=$[ $value + 5 ] value=$[ $temp + 1 ] } temp=2 value=3 func1 echo -n "temp is : " echo $temp echo -n "value is : " echo $value [root@node1 ljy]# sh ceshi.sh temp is : 2 value is : 9
函数递归
函数可以调用自己来得到结果。
[root@node1 ljy]# more ceshi.sh #!/bin/bash function func1 { if [ $1 -eq 1 ] then echo 1 else local temp=$[ $1 - 1 ] local result=$(func1 $temp) echo $[ $result * $1 ] fi } read -p "enter value: " value result=$(func1 $value) echo "the factorial 0f $value is : $result" [root@node1 ljy]# sh ceshi.sh enter value: 5 the factorial 0f 5 is : 120
创建库
bash shell允许创建函数库文件,然后在多个脚本中引用该库文件。
1.创建一个包含脚本中所需函数的公用库文件
2.在用到这些函数的脚本文件中包含库文件名。
[root@node1 ljy]# more myfuncs function addem { echo $[ $1 + $2 ] } [root@node1 ljy]# more ceshi.sh #!/bin/bash . ./myfuncs result=$(addem 1 2) echo "result is $result" [root@node1 ljy]# sh ceshi.sh result is 3
使用函数库的关键在于source命令。
source命令有个快捷的别名,叫做点操作符。
. ./name
在命令行上使用函数
在命令行上创建函数
有两种方法:
一、采用单行方式定义函数
[root@node1 ljy]# function func1 { echo $[ $1 + $2 ]; } [root@node1 ljy]# func1 1 2 3
退出当前终端失效。
二、采用多行方式定义函数
[root@node1 ~]# function func1 { > echo $[ $1 + $2 ] > } [root@node1 ~]# func1 1 3 4
在函数的尾部使用花括号,shell就会知道你完成了函数的定义。
在.bashrc文件中定义函数
为了防止每次退出shell后函数失效,可以将函数写在.bashrc文件。bash shell在每次启动时都会在主目录下查找这个文件。
1.直接定义函数
把你的函数直接写在文件末尾
[root@node1 ~]# more .bashrc # .bashrc # User specific aliases and functions alias rm='rm -i' alias cp='cp -i' alias mv='mv -i' # Source global definitions if [ -f /etc/bashrc ]; then . /etc/bashrc fi #a test function function func1 { echo $[ $1 + $2 ] } [root@node1 ~]# func1 2 3 5
2.读取函数文件
在shell脚本中可以用source命令将库文件的函数添加到你的.bashrc文件中
[root@node1 ~]# more .bashrc # .bashrc # User specific aliases and functions alias rm='rm -i' alias cp='cp -i' alias mv='mv -i' # Source global definitions if [ -f /etc/bashrc ]; then . /etc/bashrc fi #a test function . /ljy/myfuncs [root@node1 ~]# more /ljy/myfuncs function addem { echo $[ $1 + $2 ] } [root@node1 ~]# addem 1 3 4