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.www58058.com/38683

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

相關推薦

  • 正則表達式簡述

    bashshell中的正則表達式         俗話說,工欲善其事,必先利其器。由于很多Linux的文本處理工具普遍使用到了正則表達式,因此,不理解正則表達式就無法愉快的從事Linux日常系統管理。那什么是正則表達式呢?         正則表達式(Regu…

    Linux干貨 2015-05-23
  • shell腳本編程2

    八、條件選擇if語句     注:if語句可嵌套     單分支         if 判斷條件;then        &nbs…

    Linux干貨 2016-08-22
  • 詳解 /etc/inittab 文件

    當內核初始化后,就會啟動第一個進程 init,init進程會進行一系列的系統初始化工作,init是根據什么來進行初始化的? init 會讀取/etc/inittab文件(針對CentOS 5 系列),執行里面的內容來進行初始化工作,這個文件是一定的格式。 獲取inittab文件的幫助,輸入 man inittab 命令 過濾掉空白行和以#號開始的行,內容如下…

    Linux干貨 2015-03-10
  • 第10周作業(上)

    第10周作業 1、請詳細描述CentOS系統的啟動流程(詳細到每個過程系統做了哪些事情)。CentOS系統啟動詳細的過程如下(以CentOS7為例): 加電自檢(POST)按下電源開關,BIOS系統隨即開始加電自檢,檢查CPU、內存、主板及各接口、硬盤、鍵盤、光驅等,檢測它們的好壞。 讀取啟動順序檢查完成后,BIOS會根據預先設定好的啟動順序去挨個尋找可引導…

    Linux干貨 2017-01-03
  • proxy_pass轉發路徑

    一、引言 在nginx中配置proxy_pass時,proxy_pass后面的路徑最后面加“/”和不加“/”會有所區別。加“/”時,nginx不會代理location部分,不加“/”時,nginx會同時代理location部分。下面通過實驗來證明。 二、實驗 實驗環境簡要說明:     node1為httpd服務器(1…

    Linux干貨 2017-01-12
  • 重返課堂

    1.學習目的: i. IT業發展日新月異,當前所掌握的知識已無法滿足工作需要。 ii. IT行業更新飛快,這就要求從業人員不斷的去學習,不斷的完善自己,才不至于被淘汰。 iii. 在這個大數據、云計算為王的時代,掌握Linux是入行“敲門磚”。 iv. 年齡已大,把握住人生不多的專門學習的機會,再博一次。 2.淺識Linux i. linux為何? Linu…

    2018-03-26
欧美性久久久久