until、while、case、select等語句的使用方法

前面已經給大家介紹了while等基本的使用方法,這樣給大家介紹循方式的另一種方式以及while、until特殊用法。

1、until格式

until condition ;do
    循環體
done

進入條件:如果判斷條件是false,纔會進入循環體執行。
退出條件:如果判斷條件是true,則不會進入循環體執行。

注意:這跟之前講的while是有區別的,如果初學者來說,這裏容易搞混。

示例:求100以內所有正整數之和

#!/bin/bash
#
declare -i i=1
declare -i sum=0
until [ $i -gt 100 ] ;do
    let sum+=$i
    let i++
done
echo "sum:$sum"

示例:打印99乘法表

#!/bin/bash
#
declare -i i=1
declare -i j=1
until [ -j -gt 9 ];do
    until [ $i -gt $j ];do
            echo -n -e "$i*$J=$[$i*$J]\t"
            let i++
    done
    echo
    let i=1
    let j++
done

2、循環控制語句(用於循環體中)中特殊的用法
continue[n]:提前結束第N層的本輪循環,而直接進入下一輪判斷

    while condition;do
        CMD1
        CMD2
        ...
        if condition2;then
            continue
        fi
        COM
     done

break[n]:提前結束第N層的循環

    while condition;do
        CMD1
        CMD2
        ...
        if condition2;then
            break
        fi
        COM
     done

示例:求100之內所有偶數之和,要求循環遍歷100以內的所有正整數

#!/bin/bash
#
declare -i i=0
declare -i sum=0

until [ $i -gt 100 ];do
    let i++
    if [ $[$i%2] -eq 1 ];then
            continue
    fi
    let sum+=$i
done
echo "Sum $sum;"

3、創建死循環
如果我們想判斷一個循環體,當循環體滿足某一個條件就推出,可以結合continue或break這兩個命令。

while true;do
    循環體
done

until false;do  
    循環體
done                 

示例:每個3秒鐘到系統上獲取已經登錄的用戶的信息,如果docker登錄了,則記錄於日誌中,並退出;

#!/bin/bash
#
read -p "enter a user name "username
while true;do
    if who |grep "^$username" &>/dev/null;then
            break
    fi
    sleep 3
done

echo "$username is logged." >>/tmp/usr.log

第二種方法

#!/bin/bash
#
read -p "enter a user name "username
until  who |grep "^$username" &>/dev/null;do
    sleep 3
done

echo "$username is logged." >>/tmp/usr.log

4、while循環的特殊用法(遍歷文件的每一行)

while read line ;do
    循環體
done </PATH/FROM/SOMEFILE
一次讀取/PATH/FROM/SOMEFILE文件中的每一行,且將行賦值給變量line;

示例:找出其ID號爲偶數的所有用戶,顯示其用戶及ID號

#!/bin/bash
#
while read line ;do
    if [ $[`echo $line |cut -d: -f3`%2] -eq 0 ];then
            echo -e -n "userName:`echo $line |cut -d: -f1`\t"
            echo "uid:`echo $line |cut -d: -f3`"
    fi
done < /etc/passwd

5、for循環的特殊格式:

for((控制變量初始化;條件判斷表達式;控制變量的修正表達式));do
    循環體
done

控制變量初始化:僅在運行到循環代碼段時執行一次;
控制變量修改表達式:每輪循環結束會先進行控制變量修正運算,而後再做條件判斷;

示例:求100以內所有正整數之和

declare -i sum=0
for((i=1;i<=100;i++));do
    let sum+=$i
done
echo "Sum $sum"

示例:99乘法表

#!/bin/bash
#
for((j=1;j<=9;j++));do
    for((i=1;i<=j;i++));do
        echo -e -n "${i}*${j}=$[$i*$j]\t"
    done
done

寫一個腳本,完成如下任務
(1)顯示一個如下菜單:
cpu)show cpu information;
mem)show memory information;
disk)show disk information;
quit)quit
(2)提示用戶選擇項;
(3)顯示用戶選擇的內容;
進一步地,並顯示完成後不退出腳本;而是提示用戶繼續顯示其他內容;知道使用quit方始退出;

#!/bin/bash
#
while true ;do
    while [ "$option" != 'cpu' -a "$option" != 'mem' -a "$option" != 'disk' -a
"$option" != 'quit' ];do
    read -p  "wrong option,enter a option: " option
    done

    case "$option" in
            cpu)
                    lscpu
            ;;
            mem)
                    cat /proc/meminfo
            ;;
            disk)
                    fdisk -l
            ;;

            quit)
                    echo "quit ..."
                    break
            ;;
    esac
    read -p "Please enter option again: " option
done

5、條件判斷:case語句

case 變量引用 in
pat1)
    分支1
;;
pat2)
    分支2
    ;;
...
*)
    默認分支
esac

練習:寫一個腳本,完成如下要求
(1)腳本可接受參數:start,stop,restart,status
(2)如果參數非此四者之一,提示使用格式後報錯退出
(3)如果是start:則創建/var/lock/subsys/script_name,並顯示“啓動成功”
如果實現已經停止過了,如何處理
(4)如果是stop:則刪除/var/lock/subsys/script_name,並顯示“停止成功”
如果本來就沒有start,如何處理
(5)如果是status,則
如果/var/lock/subsys/script_name文件存在,則顯示“script_name is running…”
如果/var/lock/subsys/script_name不存在,則顯示“script_name is stopped…”
其中:script_name爲當前腳本名

#!/bin/bash
#

script=$0
read -p "Enter a option: " option
    echo "wrong option."
    read -p "Enter a option: " option

done

case $option in
    start)
    touch /var/lock/subsys/$script
    echo "$script is running..."
    ;;
    stop)
    rm -rf /var/lock/subsys/$script
    echo "$script is stopped..."
    ;;
    status)
            if [ -e $script ];then
                    echo "$script is running..."
            else
                    echo "$script is stopped..."
            fi
    ;;
    *)
            echo "quit..."
            ;;
esac

6、select
在bash腳本中還有自動生成菜單的工具,select。select循環主要用於創建菜單,按數字排列的菜單將顯示的標準錯誤上,並顯示PS3提示符,等待用戶輸入。用戶輸入菜單列表中的某個數字,執行相應的命令。用戶輸入被保存在內置變量REPLY中。
格式:

select variable [in list];do
    循環體
done

注意:select是個死循環,要使用break命令退出循環,或用exit命令終止腳本,或ctrl+c退出循環。
示例:

#!/bin/bash
#
select menu in beijing tianjin shanghai nanjin taiyuan zhengzhou;do
    case $menu in
            beijing)
                    echo "captical..."
                    ;;
            tianjing)
                    echo "locate on hebei"
                    ;;
            shanghai)
                    echo "I want to this place."
                    ;;
            nanjin)
                    echo "I like this place."
                    ;;
            taiyuan)
                    echo "I live in this place."
                    ;;
            zhengzhou)
                    echo "big place."
                    ;;
            *)
                    echo "quit..."
    esac
    break
done

7、信號捕捉

在linux中常常會發送一些信號,執行某種操作,信號捕捉是接受到這種指令,當時不知行這種指令,執行自己定義的指令。

trap ' ' 信號  忽略這種信號的操作
trap '-' 信號  恢復原信號的操作
trap -p 列出自定義信號操作 
trap '指令' 信號

[root@centos7~]#trap -l #所有信號
1) SIGHUP 2) SIGINT 3) SIGQUIT 4) SIGILL 5) SIGTRAP
6) SIGABRT 7) SIGBUS 8) SIGFPE 9) SIGKILL 10) SIGUSR1
11) SIGSEGV 12) SIGUSR2 13) SIGPIPE 14) SIGALRM 15) SIGTERM
16) SIGSTKFLT 17) SIGCHLD 18) SIGCONT 19) SIGSTOP 20) SIGTSTP
21) SIGTTIN 22) SIGTTOU 23) SIGURG 24) SIGXCPU 25) SIGXFSZ
26) SIGVTALRM 27) SIGPROF 28) SIGWINCH 29) SIGIO 30) SIGPWR
31) SIGSYS 34) SIGRTMIN 35) SIGRTMIN+1 36) SIGRTMIN+2 37) SIGRTMIN+3
38) SIGRTMIN+4 39) SIGRTMIN+5 40) SIGRTMIN+6 41) SIGRTMIN+7 42) SIGRTMIN+8
43) SIGRTMIN+9 44) SIGRTMIN+10 45) SIGRTMIN+11 46) SIGRTMIN+12 47) SIGRTMIN+13
48) SIGRTMIN+14 49) SIGRTMIN+15 50) SIGRTMAX-14 51) SIGRTMAX-13 52) SIGRTMAX-12
53) SIGRTMAX-11 54) SIGRTMAX-10 55) SIGRTMAX-9 56) SIGRTMAX-8 57) SIGRTMAX-7
58) SIGRTMAX-6 59) SIGRTMAX-5 60) SIGRTMAX-4 61) SIGRTMAX-3 62) SIGRTMAX-2
63) SIGRTMAX-1 64) SIGRTMAX

示例:

#!/bin/bash
trap 'echo “signal:SIGINT"'  int
trap -p
for((i=0;i<=10;i++));do
    sleep 1
    echo $i
done

trap ''  int
trap -p
for((i=11;i<=20;i++));do
    sleep 1
    echo $i
done

trap '-'  int
trap -p
for((i=21;i<=30;i++));do
    sleep 1
    echo $i
done
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章