shell脚本编程学习笔记-case语句

1.case结构条件语句语法

case语句实际上就是规范的多分支if语句

case “字符串变量”in

值1)指令1…

;;

值2)指令2…

;;

*)指令3…

esac

中文编程语法:

case “找女朋友条件”in

有房)嫁给你…

;;

你爸是李刚)嫁给你…

;;

努力吃苦)可以考虑先谈朋友…

;;

*)good bye!!!

esac

2.简单case脚本

输入1、2、3分别输出对应的值

[[email protected] jiaobenlianxi]# cat case01.sh
#!/bin/bash
usage() {
echo "USAGE:$0 {1|2|3}" contents
exit 1
}

num() {
case "$1" in
1)echo "1"
;;
2)echo "2"
;;
3)echo "3"
;;
*)usage
esac
}

main() {
    if [ $# -ne 1 ];then
    usage
    fi
    num $1
}

main $*

3.执行脚本打印一个水果菜单如下:

a.apple

b.pear

c.banana

d.cherry

当用户选择水果的时候,打印告诉它选择的水果是什么并给选择的水果加上颜色。要求case语句实现。

[[email protected] jiaobenlianxi]# cat menufruit.sh
#!/bin/bash
RED_COLOR=‘\E[1;31m‘
GREEN_COLOR=‘\E[1;32m‘
YELLOW_COLOR=‘\E[1;33m‘
BLUE_COLOR=‘\E[1;34m‘
PINK=‘\E[1;35m‘
SHAN=‘\E[31;5m‘  提示闪烁功能结合 echo –e 使用
RES=‘\E[0m‘
menu(){
cat <<EOF
 1.[ apple ]
 2.[ pear ]
 3.[ bananan ]
 4.[ cherry ]
 5.exit
EOF
    read -p "Please input a fruit:" fruit
}

usage(){
    echo -e ${SHAN}"please select the exitnum behind"${RES}
    echo "==========================================="
}

fruit(){
case "$fruit" in
    1)echo -e "${RED_COLOR} apple $RES"
;;
    2)echo -e "${GREEN_COLOR} pear $RES"
;;
    3)echo -e "${YELLOW_COLOR} bananan $RES"
;;
    4)echo -e "${BLUE_COLOR} cherry $RES"
;;
    5)
    exit
;;
    *)usage
esac
}
main(){
    while true
    do
        menu
        fruit
    done
}
Main

4.作业

已知nginx管理命令为:

启动:/usr/local/nginx/sbin/nginx

停止:/usr/local/nginx/sbin/nginx –s stop

重新加载:/usr/local/nginx/sbin/nginx –s reload

请用case脚本模拟nginx服务启动关闭:

/etc/init.d/nginx {start|stop|restart|reload}

并实现可通过chkconfig管理。

实战操作:

其实很简单,我们可以分四个模块第一个模块是启动服务模块,第二个模块是关闭服务模块,第三个模块是重启服务模块,第四个模块是平滑重启模块。先用函数分别实现这四个模块,在调用这些函数即可,最后就是设置开机自启,这就需要用chkconfig命令了。首先需要将我们写的启动脚本放到/etc/init.d/下面,然后在放到开机自启动下面。

我们先把启动脚本重命名,然后放到/etc/init.d/下面并给执行权限。

[[email protected] jiaobenlianxi]# cp nginx.sh nginx
[[email protected] jiaobenlianxi]# cp nginx /etc/init.d/
[[email protected] jiaobenlianxi]# chmod +x /etc/init.d/nginx
[[email protected] jiaobenlianxi]# ll /etc/init.d/nginx
 -rwxr-xr-x. 1 root root 981 4月   2 04:16 /etc/init.d/nginx

添加开机自启动

在添加开机自启动之前我们需要知道服务的服务自启动一般在哪个运行级别。
以network为例,查看network服务开机启动运行级别

[[email protected] jiaobenlianxi]# chkconfig --list network
network 0:关闭    1:关闭    2:启用    3:启用    4:启用    5:启用    6:关闭

等级:

0:关机;

1:单用户模式;

2:多用户模式,没有NFS;

3:标准多用户模式;

4:不可用;

5:X11,图形界面模式;

6:重启。

上面是在命令行查看network的开机启动运行级别,下面我们在network启动脚本查看,network的开机自启动级别。

[[email protected] jiaobenlianxi]# head -5 /etc/init.d/network
#! /bin/bash
#
# network   Bring up/down networking
#
# chkconfig: 2345 10 90
# description: Activates/Deactivates all network interfaces configured to \

我们看上面的chkconfig这一行,这个很重要它定义了开机的启动顺序默认都是2345,10代表的是服务开机启动顺序,90代表的是服务的关机启动顺序我们将chkconfig和description这一行 复制到/etc/init.d/下的nginx的启动脚本中。我们先去/etc/rc.d/rc3.d/里面找一下没有用到的开机启动顺序,我们看S20是没有的我们就将nginx的开机启动顺序设为20。关闭顺序同理也是一样的,这里就不演示了关机顺序以大写K开头,我们将nginx的关机顺序设为16。

[[email protected] logs]# ll /etc/rc.d/rc3.d/ |grep S19
lrwxrwxrwx. 1 root root 17 12月 30 04:10 S19rpcgssd -> ../init.d/rpcgssd
[[email protected]heng logs]# ll /etc/rc.d/rc3.d/ |grep S20

脚本代码如下:

[[email protected] jiaobenlianxi]# cat nginx.sh
#!/bin/bash
# chkconfig: 2345 20 16
# description: nginx is a http server
#Date: 2018-04-07
#Author: Create by linzhongniao
#Mail: [email protected]
#Function:This scripts function is Nginx startup script.
#Version: 1.1  

if [ -f /etc/init.d/functions ];then
     . /etc/init.d/functions
fi
pidfile=/usr/local/nginx/logs/nginx.pid
SHAN=‘\E[31;5m‘
RES=‘\E[0m‘
nginx=/usr/local/nginx/sbin/nginx
RETVAL=0
linzhongniao() {
    RETVAL=$?
    if [ $RETVAL -eq 0 ];then
      action "Nginx is $1" /bin/true
    else
      action "Nginx is $1" /bin/true
    fi
}

start() {
    if [ -f $pidfile ];then
        echo -e ${SHAN}"nginx is running"${RES}
    else
        $nginx
        linzhongniao started
    fi
    return $RETVAL
}
stop() {
    if [ ! -f $pidfile ];then
        echo -e  ${SHAN}"nginx is stopped"${RES}
    else
        $nginx -s stop
        linzhongniao stopped
    fi
    return $RETVAL
}

restart() {
    printf "Restarting Nginx ...\n"
    stop
    sleep 2
    start
}

reload() {
    if [ ! -f $pidfile ];then
        echo -e ${SHAN}"Can‘t open $pidfile,no such file or directory"${RES}
    else
        $nginx -s reload
        linzhongniao reload
    fi
    return $RETVAL
}

usage() {
    echo -e ${SHAN}"USAGE:$0 {start|stop|restart|reload}"${RES}
}

main() {
case "$1" in
  start)
    start
    ;;
  stop)
    stop
    ;;
  restart)
    restart
    ;;
  reload)
    reload
    ;;
  *)usage
    exit $RETVAL
    esac
}
main $1
exit $RETVAL

最后我们把它加载到chkconfig里面,完成nginx服务开机自启动

[[email protected] init.d]# chkconfig nginx on
[[email protected] init.d]# chkconfig --list nginx
nginx   0:关闭    1:关闭    2:启用    3:启用    4:启用    5:启用    6:关闭
关闭开机自启动
[[email protected] init.d]# chkconfig nginx off
[[email protected] init.d]# chkconfig --list nginx
nginx   0:关闭    1:关闭    2:关闭    3:关闭    4:关闭    5:关闭    6:关闭

5.case语句小结

(1)case语句相当于多分支的if语句。case语句优势更规范、易读。

(2)case语句适合变量值少,并且固定的数字或字符串的集合。(1,2,3)或(start,stop,restart)。

(3)系统服务启动脚本传参多使用case语句,参考/etc/init.d/rsyslog的启动脚本。

(4)所有case语句都可以使用if实现,但是case语句更规范清晰一些。

(5)case语句一般适合于服务的启动脚本。

(6)case的变量的值如果已知固定的start/restart/stop的元素比较适合。

语句小结:

(1)case主要是写启动脚本,范围较窄。

(2)if取值判断、比较、应用广泛。

6.学习系统脚本

多向系统脚本学习

/etc/init.d/functions

函数库functions详解:http://www.cnblogs.com/image-eye/archive/2011/10/26/2220405.html

/etc/rc.d/rc.sysinit

/etc/init.d/rpcbind

/etc/init.d/nfs

/etc/init.d/httpd

原文地址:http://blog.51cto.com/10642812/2095468

时间: 2024-10-07 05:06:54

shell脚本编程学习笔记-case语句的相关文章

Linux Shell脚本编程学习笔记和实战

http://www.1987.name/141.html shell基础 终端打印.算术运算.常用变量 Linux下搜索指定目录下特定字符串并高亮显示匹配关键词 从键盘或文件中获取标准输入 [read命令] 文件的描述符和重定向 数组.关联数组和别名使用 函数的定义.执行.传参和递归函数 条件测试操作与流程控制语句 获取时间日期格式和延时 [date.sleep命令] 内部字段分隔符IFS和脚本的调试DEBUG 显示.读取或拼接文件内容 [cat命令] 文件查找与打印文件列表 [find命令]

shell脚本编程学习笔记(1)

在linux上编程,离不开shell,计划好好看看shell编程,并在这里做些笔记以供有相同兴趣的人分享,主要参考<shell脚本学习指南>. 学习shell脚本编程之前,需要了解脚本编程语言和编译型语言的概念. 一般很多中型.大型的程序是用编译型语言写成的,比如C.C++.Java等.这类程序从源代码编译成目标代码,直接通过计算机执行.编译型语言执行效率比较高,大多运作于底层,处理的是字节.整数.浮点数等机器层级的对象,因此实现一个具体的功能,比如"将一个目录里的所有文件复制到另外

shell脚本编程学习笔记-shell脚本编程基础介绍

一. Shell脚本介绍及第一个规范shell脚本说明 1.1 shell脚本简介 1.1.1 shell是什么? shell是一个命令解释器它在操作系统的最外层负责直接与用户对话把用户的输入解释给操作系统并处理各种各样的操作系统的输入结果输出到屏幕返回给用户,这种对话可以是交互是的(从键盘输入命令可以立即得到shell的回应)或非交互(脚本的方式). 下图中×××的部分就是shell处于操作系统的位置. 1.1.2什么是shell脚本 当linux命令或语句不在命令行下执行(严格的说命令行执行

shell脚本编程基础之case语句

基础简介 脚本编程分为: 面向过程 选择结构:if语句,单分支.双分支.多分支:case语句 控制过程:顺序结构(默认) 循环结构 面向对象 case语句结构 case VAR_NAME in var_value1) #value被当做字符一个一个进行比较的:可以使用a-z,A-Z,0-9,[abc] statement1 ... ;; var_value2) statement2 ... ;; *) statement ... ;; esac case示例 Example1: #!/bin/b

shell脚本编程学习笔记-while循环

1.当型循环和直到型循环 While使用的不多,一般守护进程程序或始终循环执行会用,其他循环运算都用for代替. 1.1 当型和直到型循环语法 (1)while条件语句 语法: While 条件 do 指令-. done 手机充值:发短信扣费,充值100,每次扣1角5,当费用低于1角5分就不能发了. (2)until条件语句 语法: until 条件 do 指令- Done 提示:只循环一次,应用场景不多,了解就好. 1.2 当型和直到型循环基本范例 休息命令:sleep休息1秒,usleep1

shell脚本编程学习笔记(3)sed命令的使用

本文主要参考<sed&awk>. 我们平时使用的编辑器,比如vi,是交互式的编辑器,就是想修改哪个地方,就先定位到哪个地方,通常通过移动光标来完成.而sed是一个非交互式的面向字符流的编辑器,或者叫流编辑器.sed直接处理输入流并将结果送到标准输出.sed通过解释脚本来工作,该脚本指定了将要执行的动作. sed每次从输入文件中读取一个输入行,生成该输入行的备份,并且对改备份执行脚本中指定的指令操作.因此,对输入行所做的改动不会影响到真正的输入行.并且,sed的工作模式,是每次处理输入流

shell脚本编程学习笔记(四)shell操作数据库

一.数据库基本操作 1)登录mysql服务器:mysql -u root -p 密码 2)查看数据库:show databases 3)查看表:show tales from db; 4)查看表结构:desc table; 5)创建表:create table table(); 6)查看表数据:select * from table; 7)插入数据:insert into table(f1,f2) values('v1','v2'); 8)删除数据:delete from table where

shell脚本编程学习笔记-整数二次元比较操作符

1.1 下表为常用二次元比较操作符 我们也可以通过man test查看 提示 (1) "<"符号是小于的意思,if[[ "$a"<"$b" ]], if[[ "$a"\<"$b" ]].在单括号中需要转义,因为在shell也用<和>做重定向. (2) ">"符号是大于的意思,if[[ "$a"> "$b"

shell脚本编程学习笔记-逻辑操作符

1.1 下表为逻辑操作符 提示: !中文意思是反:与一个逻辑值相反的逻辑值. -a中文意思是与(&&):两个逻辑值都为真返回值才为真,反之为假. -o中文意思是或(or):两个逻辑值只要一个为真,返回值为真. 结论: (1)-a和&&的运算规则:只有两端都是1才为真相当于乘法运算. 真 true 1 假 false 0 And 1*0=0 And 0*1=0 And 1*1=1 And 0*0=0 只有两端都是1才为真,and交集 (2)-o或||两端都是0才为假,任何一端