17. 创建函数
17.1 基本的脚本函数
17.1.1 创建函数
有两种定义函数的格式:
#第一种定义函数的方式
function name{
commands
}
#第二种定义函数的方式
name(){
commands
}
17.1.2 使用函数
test1.sh
脚本详细内容
#!/bin/bash
function func1 {
echo "This is an example of a function"
}
count=1
while [ $count -le 10 ]
do
func1
count=$[ $count + 1 ]
done
echo "This is end of the loop"
echo "This is the end of script"
使用准则:
1.不能重定义函数,函数名必须重新定义
2.必须在定义之后才能使用
17.2 返回值
17.2.1 默认状态码
$?
可以得到函数的返回值,执行成功默认返回0,执行失败默认返回1。
17.2.2 使用return命令
return val
就可以实现返回指定状态码,但是需要注意
1.记住,函数一结束就取返回值;
2. 记住,退出状态码必须是0~255。
17.2.3 可以使用函数输出
function db1{
read -p "Enter a value:" value
echo $[ $value * 2 ]
}
result=$(db1) #得到函数的输出
17.3 在函数中使用变量
17.3.1 向函数传递参数
命令行传递给函数的参数在之前介绍过了,主要是$1
、$2
和$#
表示参数的个数。
注意如果在函数中使用$1
和$2
变量,这与命令行传递的$1
和$2
变量并不一致,必须手动传一次。 例如:
#!/bin/bash
function badfunc1 {
echo $[ $1 * $2 ]
}
if [ $# -eq 2 ]
then
#这里必须手动传递,否则执行报错
value=$(badfunc1 $1 $2)
echo "The result is $value"
else
echo "Usage: badfunc1 a b"
fi
17.3.2 在函数中处理变量
变量作用域分为全局变量和局部变量
1.全局变量
默认情况,shell定义的变量都属于全局变量
#!/bin/bash
# demonstrating a bad use of variables
function func1 {
temp=$[ $value + 5 ]
result=$[ $temp * 2 ]
}
temp=4
value=6
func1
echo "The result is $result"
if [ $temp -gt $value ]
then
echo "temp is larger"
else
echo "temp is smaller"
fi
2.局部变量
使用local
关键字声明函数内部的局部变量,返回结果保持全局变量。
17.4 数组变量和函数
17.4.1 向函数传递数组参数
跟一般的编程语言一样,数组名代表数组首地址,首地址对应的元素是数组中第一个元素。
myarr=(1 2 3 4 5)
echo $myarr #打印数组的第一个元素
传递所有的参数,并接收所有的元素。
#!/bin/bash
function addarray {
local sum=0
local newarray
newarray=($(echo "$@"))
for value in ${newarray[*]}
do
sum=$[ sum + $value ]
done
echo $sum
}
myarr=(1 2 3 4 5)
result=$(addarray ${myarr[*]})
echo "The result is $result"
17.4.2 从函数返回数组
#!/bin/bash
function arraydir {
local originarr
local newarr
local ele_nums
local i
originarr=($(echo "$@"))
ele_nums=$[ $# - 1 ]
for((i = 0; i <= $ele_nums; i++ )){
newarr[$i]=$[ ${originarr[$i]} * 2 ]
}
echo ${newarr[*]} #返回所有元素
}
myarr=(1 2 3 4 5)
echo "The origin arr is: ${myarr[*]}"
result=($(arraydir ${myarr[*]}))
echo "The new arr is:${result[*]}"
17.5 函数递归
给出一个计算阶乘的递归例子
#!/bin/bash
function factorial {
if [ $1 -eq 1 ]
then
echo 1
else
local temp=$[ $1 - 1 ]
local result=$(factorial $temp)
echo $[ $result * $1 ]
fi
}
read -p "Enter value:" value
result=$(factorial $value)
echo "The factorial result is $result"
17.6 创建库
要让函数在多个脚本中都可以使用,最好创建函数库文件,在多个脚本中引用,就是常见编程语言中的头文件。使用source
指令,快捷别名为点操作符。
例如,如果在myfuncs
库文件中编写了需要用到的函数,在脚本中可以使用../myfuncs
运行对应函数
#!/bin/bash
. ./myfuncs #引入库文件
result=$(addem 10 15) #调用库文件中的addem函数
echo "The result is $result"
17.7 在命令行上使用函数
一旦在shell中定义了函数,你就可以在整个系统中使用它了,无需担心脚本是不是在PATH环境变量里。重点在于让shell能够识别这些函数。
17.7.1 在命令行上创建函数
1.单行定义
当在命令行上定义函数时,你必须记得在每个命令后面加个分号,这样shell就能知道在哪里是命令的起止了。
function divem { echo $[ $1 / $2 ]; }
2.多行定义
bash shell会使用次提示符来提示输入更多命令。用这种方法,你不用在每条命令的末尾放一个分号,只要按下回车键就行。
$ function multem {
> echo $[ $1 * $2 ]
> }
17.7.2 在.bashrc文件中创建函数
1.直接定义函数
把你写的函数放在文件末尾就行了。
#!/bin/bash
if [ -r /etc/bashrc ]; then
. /etc/bashrc
fi
function addem {
echo $[ $1 + $2 ]
}
下次启动shell时,库中的所有函数都可在命令行界面下使用了。