shell编程之函数和case多条件分支语句

函数介绍

函数介绍:

shell 中允许将一组命令集合语句形成一段可用代码,这些代码块称为shell函数。给这段代码起个名字称为函数名,后续可以直接调用该段代码的功能

即将完后一个功能的代码进行命名和封装,后续按需调用

函数的优点:

  • 代码模块化,调用方便,节省内存

  • 代码模块化,代码量少,排错简单

  • 代码模块化,可以改变代码的执行顺讯

函数的调用:

  • 直接键入函数名就可以调用
  • 可以用;分割函数名进行调用

函数语法定义

  • 需要有一个主调函数,对其他功能函数进行调用

函数语法格式:

函数格式:
	语法一:
#l		函数名 () {
#l		代码块
#l		return N
#l		}


	语法二:
#l		function 函数名 {
#l			代码块
#l			return N
#l			}


#l	函数中return的说明:
	1. return可以结束一个函数,类似循环控制语句break
	2. return默认返回函数中最后一个命令的退出状态,也可以给定参数值,该参数值的范围是0~256
	3. 如果没有return命令,函数将返回最后一个shell的退出值

调用函数说明:

编写脚本:
	# vim function.sh
		[root@server ~]# vim function.sh
			#!/bin/bash
			# Desc:函数的调用方式
			
			# 自定义函数
			a () {
			cat <<EOF
			        鲁迅先生警言
			                 ———— 周树人
			    猛兽总是独行,牛羊才成群结队。
			EOF
			     echo
			}
			
			
			function b {
			for i in 1;do
			    echo
			    echo "这句话确实是我说的"
			done
			}
			
			
			# 调用函数			
			b;a;a
			b


运行脚本:
	# sh function.sh
		[root@server ~]# sh function.sh

			这句话确实是我说的
			        鲁迅先生警言
			                 ———— 周树人
			    猛兽总是独行,牛羊才成群结队。
			
			        鲁迅先生警言
			                 ———— 周树人
			    猛兽总是独行,牛羊才成群结队。
			
			
			这句话确实是我说的

return 返回值的说明:

编写脚本:
	设置return,不给定返回状态:
		# vim return.sh
			[root@server ~]# vim return.sh
				#!/bin/bash
				# Desc:函数的调用方式				
				# 自定义函数
				a () {
				        echo "11111"
				        xxx
				
				        return
				        echo "22222"
				}
				# 调用函数
				a

运行脚本:
	返回结果:
		# sh return.sh		=>	return 后面一条语句没有打印,结束函数执行
			[root@server ~]# sh return.sh
				11111
				return.sh: line 7: xxx: command not found
	查看return状态值:
		# echo $?			 
			[root@server ~]# echo $?	
				127

-------------------------------------------------------------------------------------

	设置return,给定返回状态:
		# vim return.sh
			[root@server ~]# vim return.sh
				...
				return 123
				....

	运行脚本:
		返回结果:
			# sh return.sh
				[root@server ~]# sh return.sh
					11111		
					return.sh: line 7: xxx: command not found
		查看return状态值:
			# echo $?
				[root@server ~]# echo $?
					123

通过函数编写功能脚本

  • 通过函数方式编写一个监控物理内存使用率、系统负载情况、监控网卡流量、磁盘使用率的小脚本,要求按Q才退出
#!/bin/bash
# 物理内存使用率函数
Mem () {
# 分别获取物理内存的使用率和总量
        Memory_use=`free|egrep "Mem"|tr -s " "|cut -d " " -f3`
        Memory_total=`free|egrep "Mem"|tr -s " "|cut -d " " -f2`
# 使用率为两个数相除
        Memory_usage=`echo "scale=2;$Memory_use*100/$Memory_total"|bc`
        cat <<EOF
           磁盘使用率
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
EOF

        echo  "磁盘使用率:${Memory_usage}%"
}



# 查看系统 1 5 15 分钟的负载情况函数
System_load () {

        load=`uptime|tr -d "," |tr -s " "|cut -d " " -f 11-13`
        cat <<EOF
                系统负载状态
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
EOF
        echo "当前系统1 5 15分钟负载状态:$load"
}



# 监控网卡流量函数
function nic {
# 监控网卡总出入流量
        nic_in_totle1=`ifconfig ens33|egrep "RX packets"|tr -s " "|cut -d " " -f6`
        nic_out_totle1=`ifconfig ens33|egrep "TX packets"|tr -s " "|cut -d " " -f6`
        sleep 1
        nic_in_totle2=`ifconfig ens33|egrep "RX packets"|tr -s " "|cut -d " " -f6`
        nic_out_totle2=`ifconfig ens33|egrep "TX packets"|tr -s " "|cut -d " " -f6`
# 网卡每秒流量是下一秒减去上一秒
        nic_in_secon=`expr $nic_in_totle2 - $nic_in_totle1`
        nic_out_secon=`expr $nic_out_totle2 - $nic_out_totle1`


        cat <<EOF
         网卡每秒流入流出量
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
EOF
        echo -e "网卡流入:$nic_in_secon/s\t\t网卡流出:$nic_out_secon/s"
}



# 监控磁盘使用率函数
function disk {
# 移除虚拟文件系统,获取磁盘和其使用率
        disk_use=`df -mh|egrep -v "tmpfs"|tr -s " "|cut -d " " -f1,5`
        cat <<EOF
                磁盘使用率
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
EOF
        echo "$disk_use"
}



function main {

cat  <<EOF
           系统监控系小脚本
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

1)监控系统物理内存使用率

2)监控系统1 5 15 分钟负载状态

3)监控网卡每秒流入流出状态

4)查看系统磁盘使用率

EOF

echo -n "请输需要查看的监控标识 [按Q退出]:"
read ch
if [ "$eq" = "Q" ];then
        exit
fi


while [ "$ch" != "Q" ]
do

        if [ $ch -eq 1 ];then
                clear
                Mem
                sleep 3
                main
        elif [ $ch -eq 2 ];then
                clear
                System_load
                sleep 3
                main

        elif [ $ch -eq 3 ];then
                clear
                nic
                sleep 3
                main

        elif [ $ch -eq 4 ];then
                clear
                disk
                sleep 3
                main

        else
                clear
                echo "请输入1-4或和按Q退出"
                sleep 3
                main
        fi
done
}

# 调用主调函数
main

case语句

case条件分支语句介绍

在生产环境中,总会遇到一个问题需要根据不同的状况来执行不同的预案。那么要处理这样的问题就要先根据可能出现的情况来写相应的预案,根据出现的情况加载不同的源。

case 语句: 条件分支语句,根据用户给予的条件和自己预设的条件去匹配,匹配成功则执行对应条件下的代码

应用场景: 主调函数中多条件匹配

注意:

  • case 不能做条件的比较运算
  • case 在实际应用中如果没有*)这个条件也可以选择不写

case 条件分支语句语法格式:

#		case $变量名 in			=>	取变量内容,和预设的条件匹配
#l		条件1)				=>	条件可以是多个,用 | 分割条件
#l				代码块		=>	满足条件执行此代码块
#l				;;		=>	该代码块执行结束

#l		条件2=>	上一个条件不满足执行下一个条件判断,满足则执行...
#l				代码块
#l				;;
#l		...
#l		*)					=>	如果条件都不匹配则执行代码块x
#l				代码块x
#l				;;
#l		esac			=>	结束case多条件分支语句

编写一个简单的case语句:

  • 根据用户输入的性别条件条件返回内容
#!/ein/bash

read -p "请输入你的性别:" gender

case $gender in|man|x|X|male)

     echo "先生您好,欢迎来到德莱联盟"
;;|women|y|Y|remale)

        echo "女士您好,欢迎来到购物广场"
;;
*)
        echo "请输入性别选项"
        echo "选项为:男或者女、male或remale"
;;
esac

用case语句编写一个相亲小脚本:

要求:
将用户输入的姓名、性别、年龄、婚姻状况、房车状况,通过条件输出,用case再嵌套case的用法

#!/bin/bash
read -p "姓名:" name
read -p "性别:" gender

case $gender in|male)
  read -p "请输入你的年龄:" boy_age

   if ((boy_age>=18));then
      read -p "您结婚了吗?" boy_marry

           case $boy_marry in
           没结||no)
              read -p "你有房有车吗?" house_car

                case $house_car in|yes)
                    echo "$name 先生,恭喜你,您条件符合,今晚8:00请到富贵酒店3号桌,那里将有一位女性与你共享晚餐!"
                ;;
                没有|no)
                   echo "$name 先生对不起,您不符合条件"
                ;;
                *)
                   echo "请正确输入有无房车。选项为有或没有"
                ;;
                esac

           ;;
           结了|yes)
               echo "结婚了还来相亲,告你老婆去!"
           ;;
           *)
               echo "请输入结没结婚,选项为yes和no"
           ;;
           esac

   elif ((boy_age<18));then
      echo "$name 小毛孩,你不满你十八岁,恕不招待"
   fi

;;|remale)
        echo "$name 女士您好,我们这里只招待男性"
;;
*)
  echo "请输入您的姓名和性别,性别选项可选男或女"
;;
esac
  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值