Shell脚本编程之函数
2016/06/10
1. 脚本中使用函数
创建函数的格式,有两种:
function name {
commands
}
或
name() {
commands
}
#!/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"
#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"
2. 函数返回值
使用函数输出
#!/bin/bash
function func2 {
echo "inside function"
read -p "Enter a value: " value
echo $[$value*2]
}
result=`func2`
echo "The new value is $result"
function func2 {
echo "inside function"
read -p "Enter a value: " value
echo $[$value*2]
}
result=`func2`
echo "The new value is $result"
3.在函数中使用变量
3.1 向函数传递参数
函数可以使用标准的参数环境变量来代表命令行上传给函数的参数,如,函数名会在$0变量中定义,函数命令行的任何参数都会通过$1, $2等定义。也可以用特殊变量$#来判断传给函数的参数数目 ,函数可以用参数环境变量获得参数值。
3.1.1 在脚本中调用函数时传递参数,必须将参数和函数放在同一行
#!/bin/bash
function add {
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=`add 10 15`
echo $value
echo -n "Let's try adding just one number: "
value=`add 10`
echo $value
echo -n "Now trying adding no numbers: "
value=`add`
echo $value
echo -n "Finally,try adding three numbers: "
value=`add 10 15 20`
echo $value
function add {
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=`add 10 15`
echo $value
echo -n "Let's try adding just one number: "
value=`add 10`
echo $value
echo -n "Now trying adding no numbers: "
value=`add`
echo $value
echo -n "Finally,try adding three numbers: "
value=`add 10 15 20`
echo $value
3.1.2 在命令行中传递参数给脚本中的函数
#!/bin/bash
function func3 {
echo $[ $1+$2 ]
}
if [ $# -eq 2 ]
then
value=`func3 $1 $2`
echo "The result is $value"
else
echo "Usage: test2 a b"
fi
function func3 {
echo $[ $1+$2 ]
}
if [ $# -eq 2 ]
then
value=`func3 $1 $2`
echo "The result is $value"
else
echo "Usage: test2 a b"
fi
3.2 在函数中处理变量
函数会用两种类型的变量:
A 全局变量
B 局部变量
3.2.1 全局变量
默认情况下,你在脚本中定义的任何变量都是全局变量,在函数外定义的变量可在函数内正常访问
3.2.2 局部变量
不用在函数中使用全局变量,函数内部使用的任何变量都可以被声明成局部变量。要那么做时,只要在变量声明的前面加上local关键字就可以了,也可以在给变量赋值时在赋值语句中使用local关键字,local关键字保证了变量只局限在该函数中,如果脚本中在该函数之外有同样的名字的变量,那么shell将会保证这两个变量的值是分离的。
#!/bin/bash
function func4 {
local temp=$[ $value+5 ]
result=$[ $temp * 2 ]
}
temp=4
value=6
func4
echo "The result is $value"
if [ $temp -gt $value ]
then
echo "temp is larger"
else
echo "temp is smaller"
fi
function func4 {
local temp=$[ $value+5 ]
result=$[ $temp * 2 ]
}
temp=4
value=6
func4
echo "The result is $value"
if [ $temp -gt $value ]
then
echo "temp is larger"
else
echo "temp is smaller"
fi
4. 创建库
很容易发现,在单个脚本中,使用函数可以省去一些键入的工作,但如果你碰巧要在脚本之间使用同一个代码块呢?显然,在每个脚本中都定义一个同样的函数会比较麻烦。有个方法能解决这个问题,bash shell允许创建函数库文件,然后在需要时在多个文件中引用该库文件。这个过程的第一步时创建一个包含脚本中所需函数的共用库文件,如:
/home/zh/work_space/scripts/function/myfuncs
function add {
echo $[ $1+$2 ]
}
function mult {
echo $[ $1 * $2 ]
}
function div {
if [ $2 -ne 0 ]
then
echo $[ $1 /$2 ]
else
echo -1
fi
}
echo $[ $1+$2 ]
}
function mult {
echo $[ $1 * $2 ]
}
function div {
if [ $2 -ne 0 ]
then
echo $[ $1 /$2 ]
else
echo -1
fi
}
使用函数库到关键在于source 命令,source命令会在当前的shell上下文中执行命令,而不是创建一个新的shell来执行命令。可以用source命令
来在shell脚本中运行库文件脚本,这样函数就对脚本可用了。source命令有个快捷别名,称作点操作符(dot operator) ,要在shell 脚本中运行myfuncs库文件,你只需要添加下面这行:
. ./myfuncs
#!/bin/bash
. ./myfuncs
value1=50
value2=10
result1=`add $value1 $value2`
result2=`mult $value1 $value2`
result3=`div $value1 $value2`
echo "The result of add: $result1"
echo "The result of mult: $result2"
echo "The result of div: $result3"
. ./myfuncs
value1=50
value2=10
result1=`add $value1 $value2`
result2=`mult $value1 $value2`
result3=`div $value1 $value2`
echo "The result of add: $result1"
echo "The result of mult: $result2"
echo "The result of div: $result3"
5. 在.bashrc文件中定义函数
bash shell会在每次启动时在主目录查找这个文件,不管是交互式的还是从现有shell中启动一个新的shell
5.1 直接定义函数
5.2 读取库文件脚本
/home/zh/work_space/scripts/function/myfuncs
function add {
echo $[ $1+$2 ]
}
function mult {
echo $[ $1 * $2 ]
}
function div {
if [ $2 -ne 0 ]
then
echo $[ $1 /$2 ]
else
echo -1
fi
}
echo $[ $1+$2 ]
}
function mult {
echo $[ $1 * $2 ]
}
function div {
if [ $2 -ne 0 ]
then
echo $[ $1 /$2 ]
else
echo -1
fi
}
看看效果:
更好的一点是,shell还会将定义好的函数传给子shell进程,这样这些函数会在该shell会话中的任何脚本中也都可以用,如:
#!/bin/bash
value1=50
value2=10
result1=`add $value1 $value2`
result2=`mult $value1 $value2`
result3=`div $value1 $value2`
echo "The result of add: $result1"
echo "The result of mult: $result2"
echo "The result of div: $result3"
value1=50
value2=10
result1=`add $value1 $value2`
result2=`mult $value1 $value2`
result3=`div $value1 $value2`
echo "The result of add: $result1"
echo "The result of mult: $result2"
echo "The result of div: $result3"
【声明】欢迎转载,但请保留文章原始出处:http://blog.csdn.net/yelangjueqi/article/details/51636402