目录
创建函数
前言
函数:起个名字在代码中任何位置使用的代码块,提高脚本开发效率,降低代码重复率
①函数的语法格式
格式一
function name {
commands
}
格式二
name() {
commands
}
说明:
>>>函数名name是用字母、数字、下划线构成,不能以数字开头,一般以函数功能去命名
例如验证用户账号密码的函数 "username_password_check"
案例:用两种格式定义并使用函数
[bei@localhost test]$ cat func.sh
#!/bin/bash
#the first function
function func_01 {
echo "This is func_01"
}
#the second function
func_02() {
echo "This is func_02"
}
#using the function func_01
func_01
#using the function func_02
func_02
[bei@localhost test]$ bash func.sh
This is func_01
This is func_02
案例:函数出现重名时,以最新的函数为准,后续的函数调用都会使用新定义的函数
[bei@localhost test]$ cat func.sh
#!/bin/bash
#the first function
function func {
echo "This is func_old"
}
#the second function
func() {
echo "This is func_new"
}
#using the function func
func
[bei@localhost test]$ bash func.sh
This is func_new
案例:函数调用要在函数定义之后
[bei@localhost test]$ cat func.sh
#!/bin/bash
#using a function before the function definition
func
function func {
echo "This is a function"
}
[bei@localhost test]$ bash func.sh
func.sh: line 3: func: command not found
注意:如果在函数定义之前使用函数,会收到一条错误消息
②返回值
>>>bash shell会把函数当成一个小型的脚本,当函数运行结束时会返回一个退出状态码
>>>可以使用三种方式去获取退出状态码
默认退出状态码
>>>获取默认退出状态码,即在函数执行完成后,立即获得$?的值,此时获得的是函数最后一条命令的退出状态码
>>>但是默认退出状态码,无法知道函数其他命令是否成功执行
案例
[bei@localhost test]$ cat func.sh
#!/bin/bash
function func {
echo "This is a function"
haha
}
func
echo "$?"
[bei@localhost test]$ bash func.sh
This is a function
func.sh: line 4: haha: command not found
127
使用return命令
>>>使用return命令可以返回特定的退出状态码,允许指定一个整数来定义函数的退出状态码
案例
[bei@localhost test]$ cat func.sh
#!/bin/bash
function func {
read -p "Enter a value: " value
echo "doubling the value"
return $[ $value * 2 ]
}
func
echo "return the value : $?"
[bei@localhost test]$ bash func.sh
Enter a value: 50
doubling the value
return the value : 100
>>>func函数会将变量value的输入值翻倍并返回结果,但是返回值在0~255之间,若大于255,对256取余
[bei@localhost test]$ bash func.sh
Enter a value: 300
doubling the value
return the value : 88
使用函数输出
案例
[bei@localhost test]$ cat func.sh
#!/bin/bash
function func {
read -p "Enter a value: " value
echo $[ $value * 2 ]
}
result=`func`
echo "The doubled value : $result"
[bei@localhost test]$ bash func.sh
Enter a value: 50
The doubled value : 100
[bei@localhost test]$ bash func.sh
Enter a value: 300
The doubled value : 600
说明
>>>函数func用echo语句显示计算结果
>>>result=`func`,这个命令将func函数的输出赋给$result变量,而不是查看退出状态码
③传递参数
>>>bash shell会将函数当成一个小型的shell脚本来对待:
这就意味着:我们可以像在命令行执行脚本时通过位置参数的方式将参数传递给函数
基本格式
function func {
$1
$2
}
func parameter1 parameter2
说明:传入$1的值是获取parameter1的值,传入$2的值是获取parameter2的值,而不是获取命令行参数
案例:
[bei@localhost test]$ cat func.sh
#!/bin/bash
function func {
echo "the first function parameter is : $1"
echo "the second function parameter is : $2"
}
echo "the first script parameter is : $1"
echo "the second script parameter is : $2"
func para1 para2
[bei@localhost test]$ bash func.sh hello world
the first script parameter is : hello
the second script parameter is : world
the first function parameter is : para1
the second function parameter is : para2
说明:要区别第一个$1,$2和第二个$1,$2 ,
第一个$1,$2是脚本的位置参数,它获取的是命令行的位置参数
第二个$1,$2是函数的位置参数,它获取的是紧跟在调用函数时,函数名后面的位置参数,即此脚本的最后一条命令
④在函数中处理变量
>>>变量处理关键点:变量的作用域问题,作用域即为在什么情况下变量可见
>>>在函数中定义的变量和普通变量的作用域是不同的
>>>在函数中,变量可分为两类:全局变量和局部变量
全局变量:
在shell脚本中任何地方都有效的变量(但是shell脚本结束后,变量也会失效,这点与系统的全局变量要区分)
在脚本的主体部分定义的全局变量,函数中可以调用
函数中定义的全局变量,在脚本中主体部分可以读取
默认情况下,在脚本中定义的任何变量都是全局变量
局部变量:
函数内部使用变量,在声明前加上local关键词即可成为局部变量
变量只限于在函数中使用 (当需要在函数内部使用变量时,使用局部变量避免与外部变量弄混)
案例
[bei@localhost test]$ cat func.sh
#!/bin/bash
function func {
local val=10
val=$[ $val + 1 ]
echo "the value of \$val is $val in function"
}
read -p "please enter a value: " val
echo "the value of \$val is $val before deal by function"
func
echo "the value of \$val is $val after deal by function"
[bei@localhost test]$ bash func.sh
please enter a value: 1
the value of $val is 1 before deal by function
the value of $val is 11 in function
the value of $val is 1 after deal by function
说明: val=$[ $val + 1 ]这个命令处理的是局部变量val,局部变量val的值10加1得到11,
而同名的全局变量val并不会被处理,它的值为1,调用完函数后它的值仍为1,这就是使用了local关键字的作用
说明:
>>>以上内容是本人学习的总结
>>>如还有错误,请留言,指正
>>>亦可分享自己的想法,互相学习