linux 第五章 shell编程及自动化运维–函数

一、函数

概述

函数是一段完成特定功能的代码片段。在Shell中定义的函数就可以使用代码模块化用于复用代码。注意,函数必须先定义才可以使用哦。

本章重点:

传参 $1 $2

局部变量 local

返回值 return 即 $?

一、定义函数

方法一:

函数名(){

函数要实现的功能代码

}

方法二:

function 函数名{

函数要实现的功能代码

}

二、调用函数

函数名

函数名 参数1 参数2

方法一:

[root@localhost] vim function.sh
cat << EOF
1............
2............
3............
4............
5............
EOF
}

caidan

[root@localhost] bash function.sh
1............
2............
3............
4............
5............

方法二

[root@localhost] vim function.sh
function caidan  {
cat << EOF
1............
2............
3............
4............
5............
EOF
}

caidan

[root@localhost] bash function.sh
1............
2............
3............
4............
5............

三、示例

示例1、初识函数

需求:通过shell脚本编写系统工具箱,编写循环脚本,功能菜单

没使用函数的效果(代码冗余,复用率低,高冗余)

#!/bin/bash
#作者:何永斌
#2022 12/26

while :  
do
cat <<EOF                                 #EOF否面绝对不要多打空格,否则会报错
---------系统工具箱-----------
|      1.查看磁盘信息        |
|      2.查看cpu信息         |
|      3.查看内存信息        |
|      4.查看网络信息        |
|      5.查看进程信息        |
|      6.退出工具箱          |
---------系统工具箱-----------
EOF                                        #EOF否面绝对不要多打空格,否则会报错

read -p "请您输入您的选择[1..6]:" num

case $num in
1)
df -hT
read -p "继续查询按Y,退出查询按N:" yu
if [ "$yu" = Y ]
then
	clear
else
	exit 66
fi

;;
2)
uptime

read -p "继续查询按Y,退出查询按N:" yu
if [ "$yu" = Y ]
then
        clear
else
        exit 66
fi

;;
3)
free -m

read -p "继续查询按Y,退出查询按N:" yu
if [ "$yu" = Y ]
then
        clear
else
        exit 66
fi

;;
4)
read -p "请输入您需要查询的网络接口号:"  hao

netstat -anpt | head -2
netstat -anpt | grep $hao

read -p "继续查询按Y,退出查询按N:" yu
if [ "$yu" = Y ]
then
        clear
else
        exit 66
fi

;;
5)
read  -p "请输入您要查询的进程名:"  pss
ps aux | grep $pss

read -p "继续查询按Y,退出查询按N:" yu
if [ "$yu" = Y ]
then
        clear
else
        exit 66
fi

;;
6)
exit 88
;;
*)
echo "请您输入有效的序号。"
;;
esac

done

使用函数之后的代码(代码数量明显减少,复用率高)

#!/bin/bash
#作者:何永斌
#2022 12/26

caidan()  {
cat <<EOF
---------系统工具箱-----------
|      1.查看磁盘信息        |
|      2.查看cpu信息         |
|      3.查看内存信息        |
|      4.查看网络信息        |
|      5.查看进程信息        |
|      6.退出工具箱          |
---------系统工具箱-----------
EOF
}
function queren () {

read -p "继续查询按Y,退出查询按N:" yu
if [ "$yu" = Y ]
then
        clear
else
        exit 66
fi
}


while :  
do
caidan
read -p "请您输入您的选择[1..6]:" num
case $num in
1)
df -hT
uptime
queren
;;
3)
free -m
queren
;;
4)
read -p "请输入您需要查询的网络接口号:"  hao
netstat -anpt | head -2
netstat -anpt | grep $hao
queren
;;
5)
read  -p "请输入您要查询的进程名:"  pss
ps aux | grep $pss
queren
;;
6)
exit 88
;;
*)
echo "请您输入有效的序号。"
;;
esac
done

函数传参

[root@localhost procedures] vim  1.sh
aaa () {
expr $1 \* 12
}

aaa $1
aaa $2
aaa $3
aaa $4

[root@localhost procedures] bash 1.sh  100
1200
2400
3600
4800

示例2、阶乘函数(传参)

c写法

[root@localhost procedures]# cat jiecheng.sh  
#用c
fun1 () {
fff=1
for ((i=1;i<=$1;i++))
do
fff=$[$fff * $i]
done

echo "$1 的阶乘是 $fff" 
}

fun1 $1
fun1 $2
fun1 $3
fun1 $4



[root@localhost procedures]# bash jiecheng.sh   1 2 3 4
1 的阶乘是 1
2 的阶乘是 2
3 的阶乘是 6
4 的阶乘是 24

shell写法

[root@localhost procedures]# cat jiecheng.sh 
#!/bin/bash
fun1 () {
fff=1
for i in `seq $1`
do
	let fff*=$i
done
echo "$1的阶乘是:$fff"
}

fun1 $1
fun1 $2
fun1 $3
fun1 $4


[root@localhost procedures]# bash jiecheng.sh   1 2 3 4
1 的阶乘是 1
2 的阶乘是 2
3 的阶乘是 6
4 的阶乘是 24

示例3、函数传参 数组传参

制作一个简单的阶乘脚本。通过数组给函数传参

[root@localhost procedures]# vim jiecheng.sh
#!/bin/bash
num=(1 2 3 4 5)

array () {
fac=1
for i in $*              #所有参数
do
fac=$[$fac*$i]
done
echo $fac
}

array ${num[*]}
[root@localhost procedures]# bash jiecheng.sh 
120

示例4、函数结果 赋予数组

原来的数组每个元素增加5,新的值在传给新的数组

[root@localhost procedures] vim jiecheng.sh 


#!/bin/bash
num=(1 2 3 4 5)

array () {
local j        #local定义变量仅在函数中有效

for i in $*
do
outarray[j++]=$[$i+5]

done
echo ${outarray[*]}
}

array ${num[*]}

[root@localhost procedures] bash jiecheng.sh 
6 7 8 9 10

二、影响shell程序的内置命令

概览

: 永远为真

true 真

false 假

exit 退出程序

break 退出循环

continue 跳出本次循环

shift 使用位置参数向左移动,默认移动1,可以使用shift2。

需求

通过脚本,输出如下效果

A123456789
B123456789
...
D123456789
[root@localhost procedures] vim 1.sh
#!/bin/bash
for i in {A..D}
do
echo -n $i                    #不输出换行符
        for j in {1..9}
        do
        echo -n  $j
        done
echo                            #再次输出一个回车 
done
[root@localhost procedures] bash 1.sh 
A123456789
B123456789
C123456789
D123456789

总结:循环如果出现了嵌套:外层循环一次,内部循环全部。

跳出5的循环(coutinue)

[root@localhost procedures] vim 1.sh
#!/bin/bash
for i in {A..D}
do
echo -n $i                    #不输出换行符
        for j in {1..9}
        do
                if [ $j -eq 5 ]
                then
                continue
                fi
        echo -n  $j
        done
echo                            #再次输出一个回车 
done

[root@localhost procedures] bash 1.sh 
A12346789
B12346789
C12346789
D12346789

换成break

[root@localhost procedures] vim 1.sh
#!/bin/bash
for i in {A..D}
do
echo -n $i                    #不输出换行符
        for j in {1..9}
        do
                if [ $j -eq 5 ]
                then
        #       continue
                break
                fi
        echo -n  $j
        done
echo                            #再次输出一个回车 
done
[root@localhost procedures] bash 1.sh 
A1234
B1234
C1234
D1234

break 后面跟数字决定跳出几个循环程序

[root@localhost procedures] vim 1.sh
#!/bin/bash
for i in {A..D}
do
echo -n $i                    #不输出换行符
        for j in {1..9}
        do
                if [ $j -eq 5 ]
                then
        #       continue
                break 2      #退出两层循环体
                fi
        echo -n  $j
        done
echo                            #再次输出一个回车 
done
[root@localhost procedures]# bash 1.sh 
A1234
[root@localhost procedures]# vim 1.sh
#!/bin/bash
for i        #如果后面不跟范围,参数会从外部提取
do
let sum+=$i
done
echo "总和为$sum"

[root@localhost procedures]# bash 1.sh  1 2 3 4
总和为10

shift:参数移动

[root@localhost procedures]# vim 1.sh
#!/bin/bash
while [ $# -ne 0  ]   # $#参数的个数
do
let sum+=$1
shift           #如果没有shift的话,程序将一直循环下去。
done
echo "总和为$sum"

[root@localhost procedures] bash 1.sh  1 2 3 4
总和为10
  • 2
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

@何永斌@

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值