select与case组合循环

select与case:

格式:

select variable in list

do

循环体命令

done

例1:

   

#!/bin/bash

PS3="what do you want: "

select i in a b c d         #在例2中省略的部分

do

        case $i in

        a)

        echo aa

        break                 #break是退出循环

        ;;

        b)

        echo bb

        break

        ;;

        c)

        echo cc

        break

        ;;

        d)

        echo dd

        break

        esac

done

结果:

[root@localhost bin]# ./select.sh

1) a

2) b

3) c

4) d

what do you want: 2

bb

select 循环主要用于创建菜单,按数字顺序排列的菜单项将显示在标准错误上,并显示PS3 提示符,等待用户输入

用户输入菜单列表中的某个数字,执行相应的命令。

用户输入被保存在内置变量REPLY 中。

select 是个无限循环,因此要记住用break 命令退出循环,或用exit 命令终止脚本。也可以按ctrl+c 退出循环。

select 经常和case 联合使用。

与for 循环类似,可以省略in list ,此时使用位置参量。

  return可以结束函数,此刻函数中的变量也被终止。



例1也可以写成例2的形式

例2

#!/bin/bash

PS3="what do you want: "

select i

do

        case $i in

        a)

        echo aa

        break

        ;;

        b)

        echo bb

        break

        ;;

        c)

        echo cc

        break

        ;;

        d)

        echo dd

        break

        esac

done

结果:

[root@localhost bin]# ./select1.sh a b c         #与例1相比,这里需要写参数

1) a

2) b

3) c

what do you want: 3

cc

练习:

1、写一个服务脚本/root/bin/testsrv.sh,完成如下要求

(1) 脚本可接受参数:start, stop, restart, status

(2) 如果参数非此四者之一,提示使用格式后报错退出

(3) 如是start:则创建/var/lock/subsys/SCRIPT_NAME, 并显示“启动成功”

考虑:如果事先已经启动过一次,该如何处理?

(4) 如是stop:则删除/var/lock/subsys/SCRIPT_NAME, 并显示“停止完成”

考虑:如果事先已然停止过了,该如何处理?

(5) 如是restart,则先stop, 再start

考虑:如果本来没有start,如何处理?

(6) 如是status, 则如果/var/lock/subsys/SCRIPT_NAME文件存在,则显示“SCRIPT_NAMEis running…”

如果/var/lock/subsys/SCRIPT_NAME文件不存在,则显示“SCRIPT_NAME is stopped…”

其中:SCRIPT_NAME为当前脚本名

#/bin/bash

read -p "which service :" name

basename=`basename $name`

dirname=`dirname $name`

start () {

        if [ -f $name ] ; then

            echo "$basename is running"

        else

            touch $name

            echo "$basename starting success"

        fi

}

stop () {

        if [ -f $name ] ; then

            rm -f $name

            echo "$basename stopping"

        else

            echo "$basename does not work"

        fi

}

restart() {

        stop

        start

}

status() {

        if [ -f $name ] ; then

            echo "$basename is running" 

        else

            echo "$basename is stopped"

        fi

}

PS3="you can choose num: "

select i in start restart stop status quit

do

case $i in

start)

        start

#       break

        ;;

stop)

        stop

#       break

        ;;

restart)

        restart

#       break

        ;;

status)

        status

#       break

        ;;

quit|q|Q)

        exit

        ;;

esac

done

原创文章,作者:zebra930,如若转载,请注明出处:http://www.178linux.com/38683

(0)
zebra930zebra930
上一篇 2016-08-22
下一篇 2016-08-22

相关推荐

  • 正则表达式详解​

      正则表达式详解 一、概述   GREP(global search regular expression(RE) and print out theline),是一种强大的文本搜索工具,它能使用正则表达式搜索文本,并把匹配的行打印出来。Unix的grep家族包括grep、egrep和fgrep。利用这些返回值就可进行一些自动化的文本处…

    Linux干货 2015-05-11
  • 马哥教育网络班21期+第8周课程练习

    1、请描述网桥、集线器、二层交换机、三层交换机、路由器的功能、使用场景与区别。 集线器 集线器也称HUB,工作在OSI七层结构的第一层物理层,属于共享型设备,接收数据广播发出,在局域网内一般都是星型连接拓扑结构,每台工作站都连接到集线器上。 由于集线器的带宽共享特性导致网络利用效率极低,一般在大中型的网络中不会使用到集线器。 网桥 网桥(Bridge)也称桥…

    Linux干货 2016-09-01
  • linux内核(kernel)版本号的意义

      在linux下有一个目录,即/usr/src/kernels/目录,下面记载着一个linux系统的内核文件, 例如:2.6.18-164.el5-x86_64、2.6.18-8.el5-x86_64和2.6.18-194.el5-x86_64等,这些文件编号意味着什么呢?例如2.6.18代表着什么?el5代表着什么?x86_64又代表着什么? …

    Linux干货 2016-01-14
  • Jerry的学习计划/目标/宣言

    学习计划 按照班主任给的计划进度来,多动手做实验。 目标 勇敢做自己,做更好的自己 宣言 能不能成为高富帅,日后是否能愉快地装逼,就看这半年!

    Linux干货 2016-10-24
  • LAMP+logzilla+sphinx+syslog-ng实现集中日志管理(第一版)[原创]

    一、前言        目前查看系统日志比较被动,遇到系统不正常或故障时才会主动去检查服务器系统日志,这样一来不能及时了解系统的运行情况,因此部署Logzilla+sphine+syslog-ng来弥补这不足。以下为安装、部署平台详细步骤。(Logzilla是什么新东西?其实前身就是php-syslog-ng,引用作者…

    Linux干货 2015-03-27
  • parted使用说明

    一.为什么使用parted命令     传统的MBR(Master Boot Record)分区方式,有一个局限:无法支持超过2TB的硬盘分区(单个分区超过2TB)。     GPT(GUID Partition Table)的分区表很好的解决了这个问题,但在Linux系统中,传…

    Linux干货 2015-04-13