bash shell 循環語句的使用

條件選擇if語句

      if語句是選擇執行的,條件滿足則執行,不滿足則退出,if語句也可嵌套,就是if語句里面也可以在進行if語句

單分支

if 判斷條件;then

statement1

fi

 

雙分支

if 判斷條件;then

條件為真得分支

else

條件為假的分支

fi

 

多分支語句

if 判斷條件1;then

if-true

elif 判斷條件2;then

if-true

elif 判斷條件3;then

if true

中間省略

else

all-false

fi

逐一對條件進行判斷,第一次遇到為真的條件時,執行其分支,而后結束真個if語句

 

條件判斷:case語句

case  變量引用 in

pattern1)

分支1

;;

pattern2)

分支2

;;

……

*

默認分支

;;

esac

注意:每個分之后必須要跟兩個分號,結束符是case的反寫也就是esac,case也支持glob風格的通配符 *:任意長度的任意字符,?:任意單個字符,[]:指定范圍內的任意單個字符

a|bab

 

示例

1、  寫一個腳本/root/bin/createuser.sh,實現如下功能:使用一個用戶名做為參數,如果指定參數的用戶存在,就顯示其存在,否則添加之;顯示添加的用戶的id號等信息

    使用if的雙分支語句來判斷用戶是否存在,如果存在就不執行添加用戶,反之,則添加,并顯示信息

#!/bin/bash

#

read -p "please input a username :" User

        if [ id -u $User &>/dev/null ] ; then

         echo "$User is exists…"

    else

         useradd $User

         id $User

fi

1.jpg

 

2、  寫一個腳本/root/bin/yesorno.sh,提示用戶輸入yesno,并判斷用戶輸入的是yes還是no,或是其它信息

這里使用到的是case語句,用戶輸入yes或no返回相應的信息,這里需要考慮腳本的健壯性,yes或no需要大小寫隨機組合也可以使Y|y|N|n等返回信息,這里可以使用通配符,但還有一種更簡單的方法,就是使用tr命令將用戶輸入的不管大寫小寫,統統轉換成小寫即可

#!/bin/bash

#

read -p "please input (yes |no) :" A

case $A in

[yY]|[yY][eE][Ss])

echo "The user input a $A"

 ;;

[nN]|[[nN][oO])

echo  "The user input  a  $A"

  ;;

*)

echo "The user input other message" ;;

esac

#!/bin/bash

#

read -p "please input (yes |no) :" A

case $A in

echo $A |tr 'A-Z'  'a-z'

y|yes)

echo "The user input a $A"

 ;;

n|no)

echo  "The user input  a  $A"

  ;;

*)

echo "The user input other message" ;;

esac

    

2.jpg   

 

3、  寫一個腳本/root/bin/filetype.sh,判斷用戶輸入文件路徑,顯示其文件類型(普通,目錄,鏈接,其它文件類型)

判斷文件類型的前提是文件或目錄需要事先存在,首先就要判斷文件存在與否,存在則往下執行,否則退出

    #!/bin/bash

    #

    read -p "please input a filepath:"  File

    [ ! -e $File ] && echo "$File is not exist " && exit 4

    if [ -d $File ] ; then

             echo "$File is a directory"

    elif [ -h $File ] ;then

             echo "$File is a link file "

    elif [ -f $File ] ;then

             echo "$File is a common file"

    else

             echo "$File is  the other file…"

    fi

        3.jpg

 

4、  寫一個腳本/root/bin/checkint.sh,判斷用戶輸入的是否為正整數

使用變量來匹配字符串,匹配是否是屬于正整數當中的某個數字,符合則顯示為正整數,否則顯示不是

    #!/bin/bash

    #

    read -p "please input a number: "  Num

    if [[ "$Num" =~ ^[1-9][0-9]*$ ]] ;then

         echo "The Num is a integer"

    else

         echo " The Num is not a integer"

    fi

    4.jpg

 

    5、判斷用戶user是否存在,如果不在將其創建

    if id user1&>/dev/null ;then

            echo “user1 is exists..”

    else

            useradd user1

    fi

        5.jpg

 

 

 

循環

  將某代碼重復執行多少次,重復運行多少次,循環次數事先已知,循環次數實現未知,有進入條件和退出條件

 

shell的循環語句有如下幾種:

for循環

for 變量名  in  列表 ;do

循環體

done

 

執行機制:依次將列表中的元素賦值給“變量名”,每次復制后執行一次循環體;知道列表中的元素耗盡,循環結束

列表生成方式

直接給出列表

整數列表 {start..end},$(seq [start  [stop]  end]起始值,步徑,結束值

返回列表的命令$(command)

使用glob,如:*.sh

變量引用:

$@,$*(兩者的區別在使用引號時,前者表示的不是一個整體,后者表示所有的位置變量是一個整體)

 

while

while 條件判斷;do

循環體

done

條件判斷:循環控制條件;進入循環之前,先做一次判斷;每一次循環之后會再次做判斷;條件為true,則執行一次循環;知道條件測試狀態為false終止循環,因此條件判斷一般有循環控制變量;而此變量的值會在循環體不斷被修正

進入條件:判斷條件為true

退出條件:判斷條件為false

 

until

until 條件判斷;do

循環體

done

進入條件:判斷條件 false,剛好跟for,while相反

退出條件:判斷條件為true

 

 

示例:

1、  /etc/rc.d/rc3.d目錄下分別有多個以K開頭和以S開頭的文件;分別讀取每個文件,以k開頭的文件輸出為文件加stop ,以S開頭的文件輸出為文件名加start;

#!/bin/bash

for i in `ls /etc/rc.d/rc3.d/`  ;  do

    if [[ $i =~ ^S.* ]] ;then

            echo  “$i start”

    elif [[ $=~^K.* ]] ; then

            echo “$i stop “

    else

            echo “unknow file”

    fi

done

        5.jpg

 

2、寫一個腳本,提示輸入正整數n的值,計算1+2+3+n的總和

方法一:使用for循環

    #!/bin/bash

    declare i=1

    declare -i sum=0

    read –p “please input a number:’ Num

        for i in  [ 1  $Num ] ; do

                let sum+=$i

        done

        echo $sum

 

方法二:使用while循環

    #!/bin/bash

    #

    declare –i sum=0

    declare –I i=1

    whle  [ $i –le 100 ];do

            let sum+=$i

            let i++

    done

    echo “The sum is $sum”

 

方法三:使用until循環

    #!/bin/bash

    #

    declare –i i=0

    until [ $i –gt 100 ] ;do

            let sum+=$i

            let i++

   done

   echo “The sum is $sum”

 6.jpg

 

 

3、  寫一個腳本,提示請輸入網絡地址,如192.168.0.0,判斷輸入的網段中主機在線狀態

方法一:使用for循環

    #!/bin/bash

    #

    read –p “please input a ipv4 address: “ IP

    A=`echo $IP |cut  -d . –f1-3`

    for I in {1..255}

    if ping  -c1 –W1 $A.$i  &>/dev/null; then

            echo “$A.$i is up “

            let up++     #計算能ping通的主機數量

    else

            echo “$A.$i is down”

            let down++   #計算不能ping通的主機數量

    fi

done

echo  “The host $A.$i  has  $up  up”

echo  “The host $A.$i  has  $down  down”

方法二:使用while循環

    #!/bin/bash

    #

    declare –I i=0

    while [ $i –le 254 ];do

        if ping  -c1 –W1 10.1.252.$i  &>/dev/null ;then

                echo “10.1.252.$i is up “

                let up++

        else

                echo “10.1.252.$i is down “

                let down ++

        fi

                let i++

done

echo  “The host $A.$i  has  $up  up”

echo  “The host $A.$i  has  $down  down”

 方法三:使用until循環

    #!/bin/bash

    #

    declare –I i=0

    until [ $i –gt 254 ];do

        if ping  -c1 –W1 10.1.252.$i  &>/dev/null ;then

                echo “10.1.252.$i is up “

                let up++

       else

                echo “10.1.252.$i is down “

                let down ++

       fi

                let i++

done

echo  “The host 10.1.252.$i  has  $up  up”

echo  “The host 10.1.252.$i  has  $down  down”

 7.jpg

 

4、  打印九九乘法表

使用循環依次打印,首先得有9行,定義一個變量取值范圍的1-9,然后就是列,找出99乘法表的規律,比如我行的初始值是1,那么我第一列只打印一個公式,列的取值范圍是小于行的數,依次循環,當我行的值8是,那么我的列的取值范圍也是1-8,內循環,從1*8,內部循環第一結束之后,列的數依次加一循環,當列的值大于行的值時,就退出內部循環,行的值再來加一,一直加到行的值大于9就停止循環

方法一:使用for循環

 for循環實現

    #!/bin/bash

    #

    for i in {1..9};do

            for a in  $(seq 1 $i) ;do

            echo –en “${a}x${i}=$[a*i]\t”

            done

    echo

    done

 

方法二:使用while循環

    #!/bin/bash

    #

    declare –I i=1

    while [ $i –le 9 ];do

    declare –I a=1

            while [ $a –le $i ];do

                echo -ne "${a}x${i}=$[a*i]\t"

                let a++

        done

    echo

                let i++

    done

 

方法三:使用until循環

    #!/bin/bash

    #

    declare –I i=1

    until [ $i –gt 9 ];do

    declare –I a=1

            until [ $a –gt $i ];do

            echo -ne "${a}x${i}=$[a*i]\t"

                let a++

        done

        echo

                let i++

    done

 8.jpg

 

5、  利用變量RANDOM生成10個隨機數字,輸出這個10數字,并顯示其中的最大者和最小者

首先定義最大值和最小值相等,之后隨即生成一個數字,將最大值與隨機數作比較,如果隨機數大于最大值,將隨機數的值賦給最大值,那么最小值也是如此,將最小值與隨機數作比較,如果隨機數的值小于最小值,將隨機數的值賦給最小值,最終最大值和最小值也就出來了

    #!/bin/bash

    #

    max=$RANDOM

    min=$max

    for I in {1..10};do

    rdm=$RANDOM

    echo –ne “$rdm\t”

        if [ $rdm –gt $max ] ; then

                max=$rdm

        elif [ $rdm –lt $min ] ;then

                min=$rdm

        fi

    done

    echo

    echo “The max number is $max”

    echo “The min number is $min”

 

方法二:使用while循環

    #!/bin/bash

    #

    declare –I i=1

    while [ $i  le 10] ;do

    rdm=$RANDOM

    echo –ne “$rdm\t”

        if [ $i –eq 1 ] ;then

            max=$RANDOM

            min=$max

                if [ $rdm –gt $max ] ; then

                        max=$rdm

                elif [ $rdm –lt $min ] ;then

                        min=$rdm

                fi

    done

    echo

    echo “The max number is $max”

    echo “The min number is $min”

 

方法三:使用until循環

    #!/bin/bash

    #

    declare –I i=1

    until [ $i –gt 10 ] ;do

    rdm=$RANDOM

    echo –ne “$rdm\t”

            if [ $i –eq 1 ] ;then

                    max=$RANDOM

                    min=$max

            elif [ $rdm –gt $max ] ; then

                    max=$rdm

            elif [ $rdm –lt $min ] ;then

                    min=$rdm

            fi

    done

    echo

    echo “The max number is $max”

    echo “The min number is $min”

 9.jpg

6、  打印國際象棋棋盤

方法一:使用for循環

國際棋盤的規律就是,顏色是交替出現的,這時可以用奇偶數來進行判斷,當行和列取模作差運算等于就說明是偶數,打印一個顏色,如果為奇數打印另一種顏色,顏色的控制利用空格加背景色來控制

    #!/bin/bash

    #

    for in in {1..10}; do

            for a in {1..10};do

                if [ $[a%2 – i%2 ] –eq 0 ] ;then

                         echo  -ne  "\033[40m  \033[0m"

                     else

                         echo echo  -ne  "\033[42m  \033[0m"

                     fi    

                         let a++

             done

         echo

                         let i++

         done

 

         方法二:使用while循環

    #!/bin/bash

    #

    declare –I i=1

    while [ $i –le 10 ]; do

    declare –I a=1

            while [ $a –le 10 ];do

                    if [ $[a%2 – i%2 ] –eq 0 ] ;then

                                 echo  -ne  "\033[40m  \033[0m"

                         else

                                 echo echo  -ne  "\033[42m  \033[0m"

                         fi

                                 let a++

                 done

         echo

         let i++

         done

 11.jpg

 

7、  每隔3秒鐘到系統上獲取已經登錄的用戶的信息;如果發現用戶hacker登錄,則將登錄時間和主機記錄于日志/var/log/login.log,并提示該用戶退出系統。

     #!/bin/bash
    #
    a=`who |grep "^hacker\>" |tr -s  ' ' '%' |cut -d % -f3-4|tr '%'  ' '`
    tty=`who |grep "^hacker\>"|awk -F ' ' '{print $2}'`
    host=` who |grep "^hacker\>" |cut -d \( -f2|cut -d \) -f1`
    until  false  ; do
        who |grep "^hacker\>"
                if [ $? -eq 0 ] ; then
                        echo   "$a\n$host" |write hacker  $tty
                fi
    
    sleep 3
    done

    12.jpg

 

8、  隨機生成10以內的數字,實現猜字游戲,提示比較大或小,相等則退出

    #!/bin/bash

    #

    declare -i i=0

    read -p "please input a number:"   Num

        until [ $Num -gt 10 ] ;do

            a=`echo $[RANDOM%11]`

                                 

                  lif [[ $Num -gt $a ]] ;then

                            echo "upper"

                            exit 3

                    elif [[ $Num -lt $a ]];then

                           echo "lower"

                            exit 4

                elif [[ $Numb -eq $a ]];then

                        echo "your are write"

                        exit 5

                fi

        done
13.jpg

    9、打印等腰三角形

   找出 等腰三角形的規律,下面一行跟上面的一行,相差2個字符,于是公式就是行數*2-1,這里還要控制前面的空白字符,不然打印出來的就不是等腰三角形,還需要找出空白字符的規律,空白字符的規律是總的行數減去當前行數得出的就是空白的字符數

1.jpg

    #!/bin/bash
    #
    read -p "please input a number " n
            for i in `seq  $n`; do
                    for a in `seq $[$n-$i]`;do
                           echo   -n " "
            done
            for b in `seq $[ i*2-1 ]`;do
                    echo -n "#"
            done
    echo
    done

    14.jpg

總結:上面的各種例子當中,都是用到循環來使用,有時也需要用if條件判斷,以達到最終實現要表現的效果,所以要熟悉掌握使用各種循環之間的嵌套

原創文章,作者:fszxxxks,如若轉載,請注明出處:http://www.www58058.com/37328

(0)
fszxxxksfszxxxks
上一篇 2016-08-18
下一篇 2016-08-18

相關推薦

  • sed基本用法詳解

    一、sed介紹:        sed是非交互式的編輯器,同時又是面向字符流的,一次處理一行文本。當前輸入的行被緩存至一個被稱為模式空間(pattern space)的內存空間中,與給定的模式進行比對,若不匹配,則將內容輸出至屏幕,之后讀取第二行;若匹配,則執行編輯命令,命令執行完成后,將模式空間中…

    Linux干貨 2016-08-10
  • linux 文件管理類命令及功能用法

    第一題:Linux上的文件管理類命令都有哪些,其常用的使用方法及相關示例演示。 文件管理類的命令有: cd,ls,touch,mldir,cp,mv,rm,rmdir,pwd,tree 使用方法 (1),cd命令用來切換工作目錄至dirname。其中dirName表示法可為絕對路徑或相對路徑。 常用格式: cd #進入用戶家目錄 cd~ #進入用戶家目錄 c…

    Linux干貨 2017-07-09
  • 第四周作業

    1、復制/etc/skel目錄為/home/tuser1,要求/home/tuser1及其內部文件的屬組和其它用戶均沒有任何訪問權限。 [root@wlm ~]# useradd tuser1 [root@wlm ~]# cp -r etc/skel/ /home/tuser1/…

    Linux干貨 2016-11-21
  • Linux 第八天: 練習和作業

    Linux 第八天: (08月09日) 練習和作業       1刪除/etc/grub2.cfg所有以空白開頭的行行首空白字符 sed 's#^[[:space:]]\+##' /etc/grub2.cfgsed -r 's@^[[:space:]]+@@' /etc/grub2.cfg…

    Linux干貨 2016-08-11
  • RPM及YUM工具介紹及使用(上)

    寫在前面 常見的計算機硬件平臺大致可以為分:x86、x86_64、amd64、ppc、arm、aarch64。軟件平臺,在Linux界則是指不同的Linux發行版。 Linux系統中的軟件(非源碼)由于都是在不同的硬件+軟件平臺開發編譯完成之后發布的,因此同一個軟件會區分硬件和軟件環境而有不同的軟件包。在安裝軟件時應該選擇與自己的硬件和軟件平臺一致的軟件包進…

    Linux干貨 2016-12-26
  • 函數式編程

    當我們說起函數式編程來說,我們會看到如下函數式編程的長相: 函數式編程的三大特性: immutable data 不可變數據:像Clojure一樣,默認上變量是不可變的,如果你要改變變量,你需要把變量copy出去修改。這樣一來,可以讓你的程序少很多Bug。因為,程序中的狀態不好維護,在并發的時候更不好維護。(你可以試想一下如果你的程序有個復雜的狀態,當以后別…

    Linux干貨 2016-08-15
欧美性久久久久