函数可以确保命令循环执行,可以解决命令多重复的情况,函数用来简化脚本,使脚本可以循环执行
1.函数的语法
(1)方法1
函数名(){
函数体
return n
}
(2)方法2(这样比较规范)
function 函数名(){
函数体
return n
}
练习:实现函数
[root@base1 mnt]# vim function_01.sh
#!/bin/bash
function fun() {
echo " I love English"
}
fun
[root@base1 mnt]# sh function_01.sh
I love English
2.调用函数
[root@base1 mnt]# vim function_02.sh
#!/bin/bash
function fun1() {
echo "I like animals" # 定义和函数内部
}
count=1
while [ $count -le 3 ]
do
fun1 # 调用函数
count=$[ $count + 1 ]
done
echo "end of loop" # 结束循环
echo "end of script" # 结束脚本
[root@base1 mnt]# sh function_02.sh
3.引用函数
每次引用函数时,bash会重新回到函数的定义
注:函数不一定要在最开始定义,但是如果函数在定义前使用,会报错
#举例:
[root@base1 mnt]# vim function_03.sh
#!/bin/bash
count=1 # 定义计数器
echo "Before function definition"
function fun1() {
echo "fun1" # 定义fun1
}
while [ $count -le 5 ]
do
fun1
count=$[ $count + 1 ]
done
echo "End of loop"
fun2 # 调用fun2,但是fun2还没有定义
function fun2() { # 定义fun2
echo "fun2"
}
[root@base1 mnt]# sh function_03.sh
函数名必须是唯一的,如果重新定义了函数。新的函数会覆盖旧的
举例:
[root@base1 mnt]# vim function_04.sh
#!/bin/bash
function fun1() {
echo "fist fun1"
}
fun1
function fun1() {
echo "second fun1"
}
fun1
function fun1() {
echo "third fun1"
}
fun1
echo "End..."
[root@base1 mnt]# sh function_04.sh
4.返回值
(1)默认退出状态码
默认情况下,函数的退出状态码就是函数最后一条命令的返回的退出状态码,用 $? 查看
#举例:
[root@base1 mnt]# vim function_exit_01.sh
#!/bin/bash
function fun1() {
echo "trying to display a non-existent file"
ls -l file &> /dev/null
}
echo "test the function: "
fun1
echo "The exit status is: $?"
[root@base1 mnt]# sh function_exit_01.sh
(2)使用return命令(返回函数特定状态码)
Shell使用return命令来退出函数,并返回特定的退出状态码,返回值在0~255之间
[root@base1 mnt]# vim function_exit_02.sh
10 #!/bin/bash
11 function db1() {
12 read -p "Enter a value:" value
13 echo "doubling the value..."
14 return $[ $value * 2 ]
15 }
16 db1
17
18 echo " The new value is $?"
[root@base1 mnt]# sh function_exit_02.sh
(3)使用函数输出将函数的输出保存在shell变量中,可以获得任何类型的函数输出,并将其保存到变量中
[root@base1 mnt]# vim function_exit_03.sh
#!/bin/bash
function db1() {
read -p "Enter a value:" value
echo $[ $value * 2 ]
}
result=`db1`
echo "The new value is $result"
[root@base1 mnt]# sh function_exit_03.sh
(4)函数中使用变量
可以向函数中传递参数,函数名会在$0变量中定义,函数命令行上的任何参数都会通过$1,$2定义
$# 来判断传给函数的参数数目
练习1:定义算法,当脚本后什么都不输入时,输出-1,当脚本后输入一个数字时,把这个数字扩大2倍,当输入两个数字时,把这两个数字相加
[root@base1 mnt]# vim function_value_01.sh
#!/bin/bash
a=$1 # 第一串字符定义为变量a
b=$2 # 第二串字符定义为变量b
c=$# # 用变量c来记录输入字符的个数
function addem() {
if [ "$c" == 0 ];then
echo "-1" # 当没有输入数字的时候输出-1
elif [ "$c" == 1 ];then
echo $[ a + a ] # 当输入一个数字的时候,把这个数字扩大为二倍
elif [ "$c" == 2 ];then
echo $[ a + b ] # 当输入两个数字的时候,把这两个数字相加
else
echo "error"
fi
}
addem # 调用函数
[root@base1 mnt]# sh function_value_01.sh # 不输入数字
-1
[root@base1 mnt]# sh function_value_01.sh 1 # 输入一个数字
2
[root@base1 mnt]# sh function_value_01.sh 1 2 # 输入两个数字
3
练习2:定义算法,当用户的输入不符合输入要求时,告诉用户具体用法,当输入正确时,计算乘积
[root@base1 mnt]# vim function_value_02.sh
#!/bin/bash
function fun1() {
echo $[ $1 * $2 ]
}
if [ $# -eq 2 ];then
value=`fun1 $1 $2`
echo "The result is $value"
else
echo "Usage:fun1 a b"
fi
[root@base1 mnt]# sh function_value_02.sh 10
Usage:fun1 a b
[root@base1 mnt]# sh function_value_02.sh 10 10
The result is 100
(5)函数不能从命令行获取脚本的参数值
[root@base1 mnt]# vim overall_value.sh
#!/bin/bash
function fun1(){
db1=$[ $value * 2 ]
}
read -p "Enter a value:" value
fun1
echo "The new value is:" $value
[root@base1 mnt]# sh overall_value.sh
2.变量的作用域
(1)全局变量
任何地方都生效的变量,默认情况下,脚本主体内定义全局变量,函数内可以用,函数外也可以
[root@base1 mnt]# vim overall_value_02.sh
#!/bin/bash
function fun1(){
temp=$[ $value + 5 ]
result=$[ $temp *2 ]
}
temp=4 # 这两个变量是全局变量,既可以引用到上面的函数中,也可以引用到下面的条件中
value=6
fun1
echo "The result is $result"
if [ $temp -gt $value ];then
echo "temp is lager"
else
echo "temp is smaller"
fi
[root@base1 mnt]# sh overall_value_02.sh
The result is 22
temp is lager
(2)局部变量
不能被引用到函数外
定义方法:local value
[root@base1 mnt]# vim overall_value_02.sh
#!/bin/bash
function fun1(){
local temp=$[ $value + 5 ] # 定义temp为局部变量
result=$[ $temp *2 ]
}
temp=4 # 这两个变量是全局变量,既可以引用到上面的函数中,也可以引用到下面的条件中
value=6
fun1
echo "The result is $result"
if [ $temp -gt $value ];then # 此处的temP变量是temp=4这个全局变量,并不是fun1中的局部变量
echo "temp is lager"
else
echo "temp is smaller"
[root@base1 mnt]# sh overall_value_02.sh # 和上面全局变量比较,发现了什么不同呢
The result is 22
temp is smaller
练习1:用函数实现计算阶乘
[root@base1 mnt]# vim jc.sh
#!/bin/bash
function jc(){
if [ $1 -eq 1 ];then # 当输入的数字是1时,输出1
echo 1
else
local temp=$[ $1 - 1 ] # 定义局部变量temp
local result=`jc $temp` # 定义局部变量result
echo $[ result * $1 ]
fi
}
read -p "Enter a value: " value
result=`jc $value` # 计算结果
echo "The jc of $value is: $result"
[root@base1 mnt]# sh jc.sh
Enter a value: 5
The jc of 5 is: 120
[root@base1 mnt]# sh jc.sh
Enter a value: 3
The jc of 3 is: 6