《文末送书》【Linux脚本篇】函数function
目录
🦐博客主页:大虾好吃吗的博客
🦐专栏地址:Linux从入门到精通
函数function
命令的集合,用来完成特定的功能; 提前定义函数,在脚本中任意调用函数名; 使用函数使代码模块化,便于重复使用,增加可读性。
函数定义格式有两种,格式如下:
函数名(){
shell命令
}
function 函数名 {
shell命令
}
在shell脚本中,函数也是可重用的代码块,用于完成某些特定的任务或计算,并且可以在脚本的其他部分调用。可以使用function
关键字来声明一个函数,函数的语法如下:
function function_name {
# function_body
# echo "function_output"
}
其中function_name
是函数的名称,function_body
是实现函数功能的代码块。可选的,可以使用echo
语句向标准输出中输出函数的返回值。
下面是一个简单的例子,它定义了一个名为add_numbers
的函数,接受两个参数,并返回它们的和。
function add_numbers {
sum=$(( $1 + $2 ))
echo $sum
}
在脚本中,可以通过函数名和参数来调用函数。例如:
# 调用 add_numbers() 函数并将返回值存储在变量中
result=$(add_numbers 10 20)
# 打印返回值
echo "The result is: $result"
这将返回 30。如果需要在脚本中调用函数,所以该函数必须在脚本的任何地方都能访问到。通常将函数定义放在脚本的顶部,以便在脚本的任何地方调用它们。
案例一:两种方法定义函数
下面是两种语法格式的使用方法。这只是一个简单的函数格式,下面的会比较绕,如果一个脚本没明白就多研究一下,尽量搞懂再做下一个案例。
[root@daxia sh]# vim fun1.sh
#!/bin/bash
fun1(){
echo "这是第一种定义函数的方法"
}
function fun2 {
echo "这是第二种定义函数的方法"
}
#使用函数
fun1
fun2
[root@daxia sh]# sh fun1.sh
这是第一种定义函数的方法
这是第二种定义函数的方法
案例二:通过位置变量传参
通过位置变量传递hello后面的参数,从而指定echo显示的全部信息。
[root@daxia sh]# vim fun2.sh
#!/bin/bash
fun1(){
echo "hello $1"
}
function fun2 {
echo "hello $*"
}
fun1 $1
fun2 $*
[root@daxia sh]# sh fun2.sh world
hello world
hello world
案例三:函数传参(局部变量)
提前定义函数,在执行函数前添加所需变量,达到函数传递参数,变量传递固定值的效果。
[root@daxia sh]# vim fun3.sh
#!/bin/bash
fun1(){
echo "$i"
}
i=100
fun1
[root@daxia sh]# sh fun3.sh
100
案例四:函数传参(位置变量)
通过位置变量传递给变量“i”,执行function库。
[root@daxia sh]# vim fun4.sh
#!/bin/bash
fun1(){
echo "$i"
}
i=$1
fun1
[root@daxia sh]# sh fun4.sh "你好 我是大虾好吃吗"
你好 我是大虾好吃吗
案例五:多值传参
这个就比较绕了,先定义一个fun1的函数,里面的命令表示打印$1的值。执行脚本后面写入三个值,调用函数时,分别把三个值传给了三个执行的函数,而三个函数的位置变量在echo $1依旧表示$1。所以就一次打印出来10、20、30。
[root@daxia sh]# vim fun5.sh
#!/bin/bash
fun1(){
echo "$1"
}
fun1 $1
fun1 $2
fun1 $3
[root@daxia sh]# sh fun5.sh 10 20 30
10
20
30
学会上面的传参后,在看看下面的多值传参。
#!/bin/bash
fun1(){
echo "$1" "$2" "$3"
}
fun1 $1 $2 $3
daxia=$(fun1 $1 $2 $3)
echo "传参的值:$daxia"
案例六:多值传参计算
定义函数时,使用case语句定义$2为加减乘除,$1和$3表示数值。
[root@daxia sh]# vim fun6.sh
#!/bin/bash
fun1(){
case $2 in
+)
echo $1 + $3 = $(( $1 + $3 ))
;;
-)
echo $1 - $3 = $(( $1 - $3 ))
;;
x)
echo $1 \* $3 = $(( $1 * $3 ))
;;
/)
echo $1 / $3 = $(( $1 / $3 ))
;;
esac
}
fun1 $1 $2 $3
[root@daxia sh]# sh fun6.sh 10 + 20
10 + 20 = 30
[root@daxia sh]# sh fun6.sh 25 / 5
25 / 5 = 5
案例七:函数状态返回值
echo可以返回任何字符串结果,用于返回数据;
return只能返回1-255的整数值,通常用来表示状态:0成功、1失败(这样可以判断自己想要的值,从而执行后面的脚本),前面我们也在使用,就是$?。
[root@daxia sh]# vim fun7.sh
#!/bin/bash
fun1(){
echo 100
return 1
}
result=$(fun1)
echo "函数的状态码是:$?"
echo "函数的返回值是:$result"
[root@daxia sh]# sh fun7.sh
函数的状态码是:1
函数的返回值是:100
案例八:函数return返回值
判断文件是否存在。
[root@daxia sh]# vim fun8-1.sh
#!/bin/bash
file=/etc/passwd
fun1(){
if [ -f $file ];then
return 0
else
return 1
fi
}
fun1
if [ $? -eq 0 ];then
echo "$file 文件存在"
else
echo "$file 文件不存在"
fi
[root@daxia sh]# sh fun8-1.sh
/etc/passwd 文件存在
判断nginx服务是否启动
[root@daxia sh]# vim fun8-2.sh
#!/bin/bash
pid=$$
nginx_run(){
ps -ef |grep nginx |grep -v grep |grep -v $pid &> /dev/null
if [ $? -eq 0 ];then
return 0
else
return 1
fi
}
nginx_run && echo "nginx is running" || echo "nginx is stopped"
[root@daxia sh]# sh fun8-2.sh
nginx is stopped
案例九:输入数值判断并返回对应值
返回指定值要求:0-9返回0,10-19返回1,20-29返回2,其他返回3。
[root@daxia sh]# vim fun9.sh
#!/bin/bash
num(){
read -p "请输入对应的数字:" sz
if [ $sz -ge 0 -a $sz -lt 9 ];then
return 0
elif [ $sz -ge 10 -a $sz -lt 19 ];then
return 1
elif [ $sz -ge 20 -a $sz -lt 29 ];then
return 2
else
return 3
fi
}
num
echo $?
[root@daxia sh]# sh fun9.sh
请输入对应的数字:2
0
[root@daxia sh]# sh fun9.sh
请输入对应的数字:12
1
[root@daxia sh]# sh fun9.sh
请输入对应的数字:22
2
[root@daxia sh]# sh fun9.sh
请输入对应的数字:222
3
案例十:查看系统所用用户
[root@daxia sh]# vim fun10.sh
#!/bin/bash
function get_users
{
users=`cat /etc/passwd | cut -d: -f1`
echo $users
}
user_list=`get_users`
i=1
for u in $user_list
do
echo "The $index user is : $u"
let i++
done
[root@daxia sh]# sh fun10.sh
#省略部分内容
案例十一:调用函数库
这个方法先在文件中定义一个函数或多个函数,执行脚本时指定位置即可。
[root@daxia sh]# vim /root/base_fun
function add
{
echo "`expr $1 + $2`"
}
function reduce
{
echo "`expr $1 - $2`"
}
function multiple
{
echo "`expr $1 \* $2`"
}
function divide
{
echo "`expr $1 / $2`"
}
function sys_load
{
echo "cpu load"
echo
sar -u
echo
echo "memory info"
echo
sar -r
echo
echo "disk usage"
echo
sar -B
echo
}
开始写脚本,在脚本前先指定function库在哪里。
[root@daxia sh]# vim fun11.sh
#!/bin/bash
. /root/base_fun
add 10 20
reduce 90 30
multiple 12 12
divide 12 2
sys_load
[root@daxia sh]# sh fun11.sh
#省略
注意:参与方式如下
本次送书五本:《Python之光:Python编程入门与实战》
文章下方推广公众号或微信搜索大虾好吃吗公众号,公众号发送第五期点击链接即可参与!
更多推荐
所有评论(0)