<menu id="ycqsw"></menu><nav id="ycqsw"><code id="ycqsw"></code></nav>
<dd id="ycqsw"><menu id="ycqsw"></menu></dd>
  • <nav id="ycqsw"></nav>
    <menu id="ycqsw"><strong id="ycqsw"></strong></menu>
    <xmp id="ycqsw"><nav id="ycqsw"></nav>
  • shell腳本語言的優勢(shell腳本基本語法)


    4.1 條件選擇

    4.1.1 選擇執行if語句

    格式:

    if COMMANDS; then COMMANDS; [ elif COMMANDS; then COMMANDS; ]... [ else
    COMMANDS; ] fi

    單分支

    if 判斷條件;then
       條件為真的分支代碼
    fi

    雙分支

    if 判斷條件; then
        條件為真的分支代碼
    else
        條件為假的分支代碼
    fi

    多分支

    if 判斷條件1; then
        條件1為真的分支代碼
    elif 判斷條件2; then
        條件2為真的分支代碼
    elif 判斷條件3; then
        條件3為真的分支代碼
    ...
    else
        以上條件都為假的分支代碼
    fi

    說明:

    多個條件時,逐個條件進行判斷,第一次遇為“真”條件時,執行其分支,而后結束整個if語句

    if 語句可嵌套

    范例:

    #根據命令的退出狀態來執行命令
    if ping -c1 -W2 station1 &> /dev/null; then    
        echo 'station1 is UP'  
    elif  grep -q 'station1' ~/maintenance.txt;  then    
        echo 'station1 is undergoing maintenance'
    else  
        echo 'station1 is unexpectedly DOWN!'    
        exit 1
    fi

    范例:

    [root@centos8 ~]#cat if_bmi.sh
    #!/bin/bash
    #
    #********************************************************************
    #Author: wangxiaochun
    #QQ: 29308620
    #Date: 2019-12-25
    #FileName: if_bmi.sh
    #URL: http://www.magedu.com
    #Description: The test script
    #Copyright (C): 2019 All rights reserved
    #********************************************************************
    read -p "請輸入身高(m為單位): " HIGH
    if [[ ! "$HIGH" =~ ^[0-2].?[0-9]{,2}$ ]];then echo "輸入錯誤的身高"; exit 1; fi
    read -p "請輸入體重(kg為單位): " WEIGHT
    if [[ ! "$WEIGHT" =~ ^[0-9]{1,3}$ ]];then echo "輸入錯誤的體重"; exit 1; fi
    BMI=`echo $WEIGHT/$HIGH^2|bc`
    if [ $BMI  -le 18 ] ;then
        echo "你太瘦了,多吃點"
    elif [ $BMI  -lt 24 ] ;then
        echo "身材很棒!"
    else
        echo "你太胖了,注意節食,加強運動"
    fi

    4.1.2 條件判斷case語句

    格式:

    case WORD in [PATTERN [| PATTERN]...) COMMANDS ;;]... esac
    case 變量引用 in
    PAT1)
        分支1
         ;;
    PAT2)
        分支2
         ;;
    ...
    *)
        默認分支
         ;;
    esac

    case支持glob風格的通配符:

    *: 任意長度任意字符

    ?: 任意單個字符

    []:指定范圍內的任意單個字符

    |: 或,如 a或b

    范例:

    [root@centos8 script40]#cat case_yesorno.sh
    #!/bin/bash
    #
    #********************************************************************
    #Author: wangxiaochun
    #QQ: 29308620
    #Date: 2019-12-25
    #FileName: case_yesorno.sh
    #URL: http://www.magedu.com
    #Description: The test script
    #Copyright (C): 2019 All rights reserved
    #********************************************************************
    read -p "Do you agree(yes/no)? " INPUT
    INPUT=`echo $INPUT | tr 'A-Z' 'a-z'`
    case $INPUT in
    y|yes)
          echo "You input is YES"
         ;;
    n|no)
          echo "You input is NO"
         ;;
    *)
          echo "Input fales,please input yes or no!"
    esac
    [root@centos8 script40]#cat case_yesorno2.sh
    #!/bin/bash
    #
    #********************************************************************
    #Author: wangxiaochun
    #QQ: 29308620
    #Date: 2019-12-25
    #FileName: case_yesorno.sh
    #URL: http://www.magedu.com
    #Description: The test script
    #Copyright (C): 2019 All rights reserved
    #********************************************************************
    read -p "Do you agree(yes/no)? " INPUT
    case $INPUT in
    [yY]|[Yy][Ee][Ss])
          echo "You input is YES"
         ;;
    [Nn]|[Nn][Oo])
          echo "You input is NO"
         ;;
    *)
          echo "Input fales,please input yes or no!"
    esac

    練習

    1. 編寫腳本 createuser.sh,實現如下功能:使用一個用戶名做為參數,如果指定參數的用戶存在,就顯示其存在,否則添加之;顯示添加的用戶的id號等信息
    2. 編寫腳本 yesorno.sh,提示用戶輸入yes或no,并判斷用戶輸入的是yes還是no,或是其它信息
    3. 編寫腳本 fifiletype.sh,判斷用戶輸入文件路徑,顯示其文件類型(普通,目錄,鏈接,其它文件類型)
    4. 編寫腳本 checkint.sh,判斷用戶輸入的參數是否為正整數

    4.2 循環

    4.2.1 循環執行介紹

    工作積累最常用的shell腳本編程基礎,一文掃盲流程控制語句

    將某代碼段重復運行多次,通常有進入循環的條件和退出循環的條件

    重復運行次數

    循環次數事先已知

    循環次數事先未知

    常見的循環的命令:for, while, until

    4.2.2 for循環

    格式1:

    for 變量名 in 列表;do
            循環體
    done

    執行機制:

    依次將列表中的元素賦值給“變量名”; 每次賦值后即執行一次循環體; 直到列表中的元素耗盡,循環結束

    for循環列表生成方式:

    • 直接給出列表
    • 整數列表:
    {start..end}
    $(seq [start [step]] end)
    • 返回列表的命令:
    $(COMMAND)
    • 使用glob,如:*.sh
    • 變量引用,如:$@,$#

    范例: 九九乘法表

    #!/bin/bash
    for i in {1..9};do
        for j in `seq $i`;do
            echo -e "${j}x${i}=$[i*j]tc"
        done
        echo
    done

    范例:生產案例

    [root@centos8 ~]#cat /data/script40/for_rename.sh
    #!/bin/bash
    #
    #********************************************************************
    #Author: wangxiaochun
    #QQ: 29308620
    #Date: 2020-01-03
    #FileName: /data/script40/for_rename.sh
    #URL: http://www.magedu.com
    #Description: The test script
    #Copyright (C): 2020 All rights reserved
    #********************************************************************
    DIR=/data/test
    cd $DIR
    for FILE in * ;do
        PRE=`echo $FILE | sed -nr 's/(.*).([^.]+)$/1/p'`
    #   SUFFIX=`echo $FILE | sed -nr 's/(.*).([^.]+)$/2/p'`
        mv $FILE $PRE.bak
    done

    范例:M37期面試題,要求將目錄YYYY-MM-DD/中所有文件,移動到YYYY-MM/DD/下

    #1 yyyy-mm-dd10.sh 創建YYYY-MM-DD,當前日期一年前365天到目前共365個目錄,里面有10個文件,$RANDOM.log
    [root@centos8 ~]#cat dir20.sh
    #!/bin/bash
    for i in {1..365};do
          DIR=`date -d "-$i day" +%F`
          mkdir $DIR
          cd $DIR
          for n in {1..10};do
          touch $RANDOM.log
          done
          cd ..
    done
    #2 移動到YYYY-MM/DD/下  
    #!/bin/bash
    #
    DIR=/data/test
    cd $DIR
    for DIR in * ;do
          YYYY_MM=`echo $DIR |cut -d"-" -f1,2`
          DD=`echo $DIR |cut -d"-" -f3`
          [ -d $YYYY_MM/$DD ] || mkdir -p $YYYY_MM/$DD &> /dev/null
          mv $DIR/*   $YYYY_MM/$DD
    done

    格式2

    雙小括號方法,即((…))格式,也可以用于算術運算,雙小括號方法也可以使bash Shell實現C語言風格

    的變量操作

    I=10;((I++))

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

    說明:

    控制變量初始化:僅在運行到循環代碼段時執行一次

    控制變量的修正表達式:每輪循環結束會先進行控制變量修正運算,而后再做條件判斷

    范例:

    #!/bin/bash
    #
    #********************************************************************
    #Author: wangxiaochun
    #QQ: 29308620
    #Date: 2020-01-03
    #FileName: for_sum2.sh
    #URL: http://www.magedu.com
    #Description: The test script
    #Copyright (C): 2020 All rights reserved
    #********************************************************************
    for((sum=0,i=1;i<=100;sum+=i,i++));do                       
            true
    done
    echo $sum

    范例:九九乘法表

    #!/bin/bash
    #
    #********************************************************************
    #Author: wangxiaochun
    #QQ: 29308620
    #Date: 2020-01-03
    #FileName: for_99_2.sh
    #URL: http://www.magedu.com
    #Description: The test script
    #Copyright (C): 2020 All rights reserved
    #********************************************************************
    for ((i=1;i<10;i++));do
       for((j=1;j<=i;j++));do
              echo -e "${j}x${i}=$[i*j]tc"
       done
       echo 
    done

    練習:用 for 實現

    1. 判斷/var/目錄下所有文件的類型
    2. 添加10個用戶user1-user10,密碼為8位隨機字符
    3. /etc/rc.d/rc3.d目錄下分別有多個以K開頭和以S開頭的文件;分別讀取每個文件,以K開頭的輸出為文件加stop,以S開頭的輸出為文件名加start,如K34fifilename stop S66fifilename start
    4. 編寫腳本,提示輸入正整數n的值,計算1+2+…+n的總和
    5. 計算100以內所有能被3整除的整數之和
    6. 編寫腳本,提示請輸入網絡地址,如192.168.0.0,判斷輸入的網段中主機在線狀態
    7. 打印九九乘法表
    8. 在/testdir目錄下創建10個html文件,文件名格式為數字N(從1到10)加隨機8個字母,如:1AbCdeFgH.html
    9. 打印等腰三角形

    10、猴子第一天摘下若干個桃子,當即吃了一半,還不癮,又多吃了一個。第二天早上又將剩下的桃子吃掉一半,又多吃了一個。以后每天早上都吃了前一天剩下的一半零一個。到第10天早上想再吃時,只剩下一個桃子了。求第一天共摘了多少?

    4.2.3 while循環

    格式:

    while CONDITION; do
             循環體
    done

    說明:

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

    進入條件:CONDITION為true

    退出條件:CONDITION為false

    范例:

    #配置發郵件的郵箱
    [root@centos8 ~]#cat .mailrc 
    set from=29308620@qq.com
    set smtp=smtp.qq.com
    set smtp-auth-user=29308620@qq.com
    set smtp-auth-password=esvnhbnqocirbicf
    set smtp-auth=login
    set ssl-verify=ignore
    [root@centos8 ~]#cat while_diskcheck.sh
    #!/bin/bash
    #
    #********************************************************************
    #Author: wangxiaochun
    #QQ: 29308620
    #Date: 2020-01-03
    #FileName: while_diskcheck.sh
    #URL: http://www.magedu.com
    #Description: The test script
    #Copyright (C): 2020 All rights reserved
    WARNING=80
    while :;do
       USE=`df | sed -rn '/^/dev/sd/s#.* ([0-9]+)%.*#1#p' |sort -nr|head -n1`
       if [ $USE -gt $WARNING ];then
          echo Disk will be full from `hostname -I` | mail  -s "disk warning"
    29308620@qq.com
       fi
       sleep 10
    done

    練習:用while實現

    1. 編寫腳本,求100以內所有正奇數之和
    2. 編寫腳本,提示請輸入網絡地址,如192.168.0.0,判斷輸入的網段中主機在線狀態,并統計在線和離線主機各多少
    3. 編寫腳本,打印九九乘法表
    4. 編寫腳本,利用變量RANDOM生成10個隨機數字,輸出這個10數字,并顯示其中的最大值和最小值
    5. 編寫腳本,實現打印國際象棋棋盤
    6. 后續六個字符串:efbaf275cd、4be9c40b8b、44b2395c46、f8c8873ce0、b902c16c8b、ad865d2f63是通過對隨機數變量RANDOM隨機執行命令: echo $RANDOM|md5sum|cut –c1-10后的結果,請破解這些字符串對應的RANDOM值

    無限循環

    while true; do
             循環體
    done

    4.2.4 until循環

    格式:

    until CONDITION; do
             循環體
    done

    說明:

    進入條件: CONDITION 為false

    退出條件: CONDITION 為true

    無限循環

    until false; do
             循環體
    Done

    4.2.4 循環控制語句 continue

    continue [N]:提前結束第N層的本輪循環,而直接進入下一輪判斷;最內層為第1層

    格式:

    while CONDITION1; do
         CMD1
     			...
    		 if CONDITION2; then
     	 	continue
    		 fi
    		 CMDn
    		 ...
    done

    范例:

    [root@centos8 script40]#cat continue_for.sh
    #!/bin/bash
    #
    #********************************************************************
    #Author: wangxiaochun
    #QQ: 29308620
    #Date: 2020-01-03
    #FileName: continue_for.sh
    #URL: http://www.magedu.com
    #Description: The test script
    #Copyright (C): 2020 All rights reserved
    #********************************************************************
    for ((i=0;i<10;i++));do
        for((j=0;j<10;j++));do
                    [ $j -eq 5 ] && continue 2
                    echo $j
         done
         echo ---------------------------
    done
    [root@centos8 script40]#bash continue_for.sh
    0
    1
    2
    3
    4
    0
    1
    2
    3
    4
    0
    1
    2
    3
    4
    0
    1
    2
    3
    4
    0
    1
    2
    3
    4
    0
    1
    2
    3
    4
    0
    1
    2
    3
    4
    0
    1
    2
    3
    4
    0
    1
    2
    3
    4
    0
    1
    2
    3
    4

    4.2.5 循環控制語句 break

    break [N]:提前結束第N層整個循環,最內層為第1層

    格式:

    while CONDITION1; do
        CMD1
    		 ...
     	 	if CONDITION2; then
        break
        fi
        CMDn
        ...
    done

    范例:

    [root@centos8 script40]#cat break_for.sh
    #!/bin/bash
    #
    #********************************************************************
    #Author: wangxiaochun
    #QQ: 29308620
    #Date: 2020-01-03
    #FileName: continue_for.sh
    #URL: http://www.magedu.com
    #Description: The test script
    #Copyright (C): 2020 All rights reserved
    #********************************************************************
    for ((i=0;i<10;i++));do
        for((j=0;j<10;j++));do
              [ $j -eq 5 ] && break 
              echo $j
        done
        echo ---------------------------
    done

    范例:

    [root@centos8 script40]#cat break_for.sh
    #!/bin/bash
    #
    #********************************************************************
    #Author: wangxiaochun
    #QQ: 29308620
    #Date: 2020-01-03
    #FileName: continue_for.sh
    #URL: http://www.magedu.com
    #Description: The test script
    #Copyright (C): 2020 All rights reserved
    #********************************************************************
    for ((i=0;i<10;i++));do
        for((j=0;j<10;j++));do
              [ $j -eq 5 ] && break 2
              echo $j
        done
        echo ---------------------------
    done
    [root@centos8 script40]#bash break_for.sh
    0
    1
    2
    3
    4

    范例:

    [root@centos8 script40]#cat menu.sh
    #!/bin/bash
    #
    #********************************************************************
    #Author: wangxiaochun
    #QQ: 29308620
    #Date: 2020-01-03
    #FileName: menu.sh
    #URL: http://www.magedu.com
    #Description: The test script
    #Copyright (C): 2020 All rights reserved
    #********************************************************************
    sum=0
    COLOR='echo -e 国产精品区一区二区免费