1. 创建函数的两种方式
1.1 创建函数
有两种格式可以用来在bash shell脚本中创建函数。脚本中定义的每个函数都必须有一个唯一的名称
。
- 第一种格式采用关键字function,后跟分配给该代码块的函数名。name属性定义了赋予函数的唯一名称。
function name {
commands
}
- 第二种格式更接近于其他编程语言中定义函数的方式。
name() {
commands
}
1.2 使用函数
$ cat test1
#!/bin/bash
# using a function in a script
function func1 {
echo "This is an example of a function"
}
count=1
while [ $count -le 5 ]
do
func1
count=$[ $count + 1 ]
done
echo "This is the end of the loop"
func1
echo "Now this is the end of the script"
$
$ ./test1
This is an example of a function
This is an example of a function
This is an example of a function
This is an example of a function
This is an example of a function
This is the end of the loop
2. 返回值
2.1 默认退出状态码
记住,$?
变量会返回执行的最后一条命令的退出状态码。
- 函数运行成功,默认
退出码0
- 函数运行失败,默认
退出码1
2.2 使用return命令
bash shell使用return命令来退出函数并返回特定的退出状态码
。return命令允许指定一个整数值来定义函数的退出状态码,从而提供了一种简单的途径来编程设定函数退出状态码。
- 记住,函数
一结束
就取返回值; - 记住,退出状态码必须是
0~255
。
#!/bin/bash
db1(){
read -p "Enter a value: " value
echo "doubling the value"
return $[ $value * 2 ]
}
db1
echo The new value is $?
2.3 使用函数输出 - echo
新函数会用echo语句来显示计算的结果。该脚本会获取dbl函数的输出,而不是查看退出状 态码。
$ cat test5b
#!/bin/bash
# using the echo to return a value
function dbl {
read -p "Enter a value: " value
echo $[ $value * 2 ]
}
result=$(dbl)
echo "The new value is $result"
$
$ ./test5b
Enter a value: 200
The new value is 400
$
$ ./test5b
Enter a value: 1000
The new value is 2000
3. 函数变量、传参
3.1 向函数传递参数
bash shell会将函数当作小型脚本
来对待。这意味着你可以像普通脚 本那样向函数传递参数
函数可以使用标准的参数环境变量来表示命令行上传给函数的参数。例如,函数名会在$0 变量中定义,函数命令行上的任何参数都会通过$1、$2
等定义。也可以用特殊变量$#来判断传 给函数的参数数目。
尽管函数也使用了$1和$2
变量,但它们和脚本主体中的$1和$2
变量并不相同。要在函数中
使用这些值,必须在调用函数时手动将它们传过去
。
#!/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 15: "
value=$(addem 10 15)
echo $value
echo -n "Let's try adding just one number: "
value=$(addem 10)
echo $value
echo -n "Now trying adding no numbers: "
value=$(addem)
echo $value
echo -n "Finlly, try adding three numbers: "
value=$(addem 10 15 20)
echo $value
输出:
Adding 10 and 15: 25
Let's try adding just one number: 20
Now trying adding no numbers: -1
Finally, try adding three numbers: -1
3.2 全局变量、局部变量
全局变量
是在shell脚本中任何地方都有效的变量。如果你在脚本的主体部分定义了一个全局 变量,那么可以在函数内读取它的值。类似地,如果你在函数内定义了一个全局变量,可以在脚 本的主体部分读取它的值。
局部变量
使用local关键字声明。local关键字
保证了变量只局限在该函数中。如果脚本中在该函数之外有同样名字的变量, 那么shell将会保持这两个变量的值是分离
的。
#!/bin/bash
function func1 {
local 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 samller"
fi
输出
The result is 22
temp is smaller
3.3 向函数传参数组
该脚本用$myarray
变量来保存所有的数组元素,然后将它们都放在函数的命令行上。该函 数随后从命令行参数中重建数组变量。在函数内部,数组仍然可以像其他数组一样使用
#!/bin/bash
function testit {
local newarray
newarray=($(echo "$@"))
echo The new array value is: ${newarray[*]}
}
myarray=(1 2 3 4 5)
echo "The original array is ${myarray[*]}"
testit ${myarray[*]}
输出
The original array is 1 2 3 4 5
The new array value is: 1 2 3 4 5
4. 引入自定义函数 - source
bash shell允许创建函数库文件
,然后在多个脚本中引用该库文件。
库文件myfuncs
,它定义了3个简单的函数。
#!/bin/bash
# my script functions
function addem {
echo $[ $1 + $2 ]
}
function multem {
echo $[ $1 * $2 ]
}
function divem {
if [ $2 -ne 0 ]
then
echo $[ $1 / $2 ]
else
echo -1
fi
}
使用函数库的关键在于source命令。source命令
会在当前shell上下文中执行命令,而不是 创建一个新shell。可以用source命令来在shell脚本中运行库文件脚本。这样脚本就可以使用库 中的函数了。
source命令有个快捷的别名
,称作点操作符(dot operator)
。要在shell脚本中运行myfuncs 库文件,只需添加下面这行:
. ./myfuncs
这个例子假定myfuncs库文件和shell脚本位于同一目录。如果不是,你需要使用相应路径访 问该文件。这里有个用myfuncs库文件创建脚本的例子。
$ cat source.sh
#!/bin/bash
. ./myfuncs
value1=10
value2=5
result1=$(addem $value1 $value2)
echo $result1
输出
15