shell之case语句与函数

一、case语句

1.1 语法结构

case var in     定义变量;var代表是变量名
pattern 1)      模式1;用 | 分割多个模式,相当于or
    command1     需要执行的语句
    ;;         两个分号代表命令结束
pattern 2)
    command2
    ;;
pattern 3)
    command3
    ;;
          *)       default,不满足以上模式,默认执行*)下面的语句
    command4
    ;;
esac          esac表示case语句结束
#pattern表示需要匹配的模式

1.2 应用案例

1)脚本传不同值做不同事

① 需求:
当给程序传入start、stop、restart三个不同参数时分别执行相应命令!

② 实现:

#!/bin/bash
case $1 in 
	start|S)
		service httpd start &> /dev/null && echo "httpd 启动成功"
	;;
	stop|T)
		service httpd stop &> /dev/null && echo "httpd 停止成功"
	;;
	restart|R)
		service httpd restart &> /dev/null && echo "httpd 重启成功"
	;;
	*)
		echo "请输入对应的值(start|stop|restart)……"	
	;;
esac
2)根据用户需求选择做事

① 需求:
脚本提示让用户输入需要管理的服务名,然后提示用户需要对服务做什么操作,如启动,关闭等操作!

② 实现:

#!/bin/bash
read -p "请输入你需要管理的服务名称(httpd|vsftpd):" service
case $service in
	vsftpd|ftp)
	read -p "请选择需要执行的指令(start|stop|restart):" action1
	case $action1 in 
		start)
			service vsftpd start &> /dev/null && echo "${service}服务已经启动成功"
		;;
		stop)
			service vsftpd stop &> /dev/null && echo "${service}服务已经停止成功"
		;;
		restart)
			service vsftpd restart &> /dev/null && echo "${service}服务已经重启成功"
		;;
	esac
	;;
	httpd|apache)
	read -p "请选择需要执行的指令(start|stop|restart):" action2
	case $action2 in 
		start)
			service httpd start &> /dev/null && echo "${service}服务已经启动成功"
		;;
		stop)
			service httpd stop &> /dev/null && echo "${service}服务已经停止成功"
		;;
		restart)
			service httpd restart &> /dev/null && echo "${service}服务已经重启成功"
		;;
	esac
	;;
esac
3)菜单提示让用户选择需要做的事

① 需求:
模拟一个多任务维护界面,当执行程序时先显示总菜单,然后进行选择后做相应的操作!如下:

**********请选择*********
h   显示命令帮助
f   显示磁盘分区
d   显示磁盘挂载
m   查看内存使用
u   查看系统负载
q   退出程序
*************************

② 实现:

#!/bin/bash
#打印菜单
menu(){
cat <<END
    h   显示命令帮助
    f   显示磁盘分区
    d   显示磁盘挂载
    m   查看内存使用
    u   查看系统负载
    q   退出程序
END
}
menu
while true
do
read -p "请输入你的操作[h for help]:" var1
case $var1 in
    h)
    menu
    ;;
    f)
    read -p "请输入你要查看的设备名字[/dev/sdb]:" var2
    case $var2 in
        /dev/sda)
        fdisk -l /dev/sda
        ;;
        /dev/sdb)
        fdisk -l /dev/sdb
        ;;
    esac
    ;;
    d)
    lsblk
    ;;
    m)
    free -m
    ;;
    u)
    uptime
    ;;
    q)
    exit
    ;;
esac
done

二、函数

2.1 函数简介

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

2.2 定义函数

1)方法一
函数名()
{
  函数体(一堆命令的集合,来实现某个功能)   
}
2)方法二
function 函数名()
{
   函数体(一堆命令的集合,来实现某个功能)
   echo hello
   echo world
}

函数中return说明:
1)return可以结束一个函数。类似于循环控制语句break结束当前循环。执行循环体后的代码;
2)return默认返回函数中最后一个命令状态值,也可给定参数值,范围是0~256之间;
3)如果没有return命令,函数将返回最后一个指定的退出状态值;

2.3 调用函数

1)当前命令行调用
$ vim 1.sh 
#!/bin/bash
hello(){
echo “hello lzj $1”
hostname
}
menu(){
cat <<-EOF
1.mysql
2.web
3.app
4.exit
EOF
}
$ source 1.sh
$ hello 888
“hello lzj 888”
localhost.localdomain
$ menu
1.mysql
2.web
3.app
4.exit
2)定义到用户的环境变量中
$ vim ~/.bashrc
文件中增加如下内容:
hello(){
echo "hello lzj $1"
hostname
}
menu(){
cat <<-EOF
1. mysql
2. web
3. app
4. exit
EOF
}

注意:当用户打开bash的时候会读取该文件
3)脚本中调用
$ vim 2.sh
#!/bin/bash
#打印菜单
source ./1.sh
menu(){
cat <<-EOF
        h       显示帮助
        f       显示磁盘分区
        d       显示磁盘挂载
        m       查看内存使用
        u       查看系统负载
        q       退出程序
        EOF
}
menu
$ sh 2.sh 
h	显示帮助
f	显示磁盘分区
d	显示磁盘挂载
m	查看内存使用
u	查看系统负载
q	退出程序
4)应用示例

① 需求:
1)写一个脚本收集用户输入的基本信息(姓名、性别、年龄)。如果不输入,一直提示输入;
2)最后根据用户的信息输出相对应的内容;

② 实现:

#!/bin/bash
#该函数实现用户如果不输入内容则一直循环知道用户输入位置,并且将用户输入的内容打印出来
input_fun(){
  input_var=""
  output_var=$1
  while [ -z $input_var ]
  do
    read -p "$output_var" input_var
  done
  echo $input_var
}
#调用函数并且获取用户的姓名、性别、年龄分别负责赋值给name、sex、age
name=$(input_fun 请输入您的姓名:)
sex=$(input_fun 请输入您的性别:)
age=$(input_fun 请输入您的年龄:)
#根据用户输入的性别进行匹配判断
case $sex in
  man)
  if [ $age -gt 18 -a $age -le 35 ];then
    echo "年轻有为!加油"
  elif [ $age -gt 35 ];then
    echo "有点老了"
  else
    echo "太小了!"
  fi
  ;;
  woman)
    echo "小姐姐"
  ;;
esac
*************** 当你发现自己的才华撑不起野心时,就请安静下来学习吧!***************
原文地址:https://www.cnblogs.com/lvzhenjiang/p/14199030.html