目录

🍭函数function

🍭案例一:两种方法定义函数

🍭案例二:通过位置变量传参

🍭案例四:函数传参(位置变量)

🍭案例五:多值传参

🍭案例六:多值传参计算

🍭案例七:函数状态返回值

🍭案例八:函数return返回值

🍭案例九:输入数值判断并返回对应值

🍭案例十:查看系统所用用户

🍭案例十一:调用函数库


   🦐博客主页:大虾好吃吗的博客

   🦐专栏地址: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编程入门与实战》

文章下方推广公众号或微信搜索大虾好吃吗公众号,公众号发送第五期点击链接即可参与!

GitHub 加速计划 / li / linux-dash
6
1
下载
A beautiful web dashboard for Linux
最近提交(Master分支:3 个月前 )
186a802e added ecosystem file for PM2 4 年前
5def40a3 Add host customization support for the NodeJS version 4 年前
Logo

旨在为数千万中国开发者提供一个无缝且高效的云端环境,以支持学习、使用和贡献开源项目。

更多推荐