shell 編碼語句


編碼語句分類:

  順序執行
  選擇執行
  循環執行

選擇執行:if

if 語句格式:
      if 判斷條件       then       條件為真時分支代碼        fi
      
if 判斷條件;then       條件為真時分支代碼       else       條件為假時分支代碼       fi

      if 判斷條件;then
        條件為真時分支代碼
      elif 判斷條件;then
        條件為真時分支代碼
      ...

      else
        條件為假時分支代碼
      fi


for 循環(循環次數已知)

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

        循環體:依賴於調用變量來實現其變化;

        循環可以嵌套;

        退出條件:遍歷列表完成

for的第二種使用格式 :
        for ((初始條件;測試條件;修改表達式)); do
            循環體
        done

while循環(循環次數未知)

while格式:


        while 測試條件; do
            循環體
        done

        測試條件為真,進入循環;測試條件為假,退出循環;
        測試條件一般通過變量來描述,需要在循環體不變量地改變變量的值,以確保某一時刻測試條件為假,進而結束循環;

while循環:遍歷文本文件

   格式:

        while read 變量名; do
            循環體
        done < /path/to/somefile

        變量名,每循環一次,記憶了文件中一行文本

until循環(循環次數未知)

until格式:


        until 測試條件; do
            循環體
        done

        測試條件為假,進入循環;測試條件為真,退出循環;
        測試條件一般通過變量來描述,需要在循環體不變量地改變變量的值,以確保某一時刻測試條件為真,進而結束循環;

case語句:有多個測試條件時,case語句會使得語法結構更明晰

case語句格式:
      case 變量引用 in   PATTERN1)   分支1   ;; PATTERN2) 分支2 ;; ... *) 分支n ;; esac PATTERN:類同於文件名通配機制,但支持使用|表示或者; a|b: a或者b *:匹配任意長度的任意字符 ?: 匹配任意單個字符 []: 指定范圍內的任意單個字符

 實例

創建 Linux 系統賬戶及密碼

    #!/bin/bash
    useradd    "$1" 
    echo "$2"  |  passwd  ‐‐stdin  "$2"

    
備份日志

    #!/bin/bash
    # 每周 5 使用 tar 命令備份/var/log 下的所有日志文件
    tar    -czf    log-`date +%Y%m%d`.tar.gz    /var/log 

    
監控內存和磁盤容量當小於給定值時報警

    #!/bin/bash
    # 實時監控本機內存和硬盤剩余空間,剩余內存小於500M、根分區剩余空間小於1000M時,發送報警郵件給root管理員
     
    # 提取根分區剩余空間
    disk_size=$(df / | awk '/\//{print $4}')
    # 提取內存剩余空間
    mem_size=$(free | awk '/Mem/{print $4}')
    while :
    do
    # 注意內存和磁盤提取的空間大小都是以 Kb 為單位
    if  [  $disk_size -le 512000 -a $mem_size -le 1024000  ]
    then
        mail  ‐s  "Warning"  root  <<EOF
        Insufficient resources,資源不足
    EOF
    fi
    done


猜數字游戲
    #!/bin/bash
    # RANDOM 為系統自帶的系統變量,值為 0‐32767的隨機數,生成一個 100 以內的隨機數
    num=$[RANDOM % 100 + 1]
    echo "$num"

    while :
    do 
        # 使用 read 提示用戶猜數字
        read -p "請輸入你猜的數據:" guess
        if [ $num -eq $guess ]
            then
                echo "恭喜你猜對了"
                exit
        elif [ $num -lt $guess ]
            then
                echo "你猜大了"
        else
                echo "你猜小了"
        fi
    done 


檢測本機當前用戶是否為超級管理員,如果是管理員,則使用 yum 安裝 vsftpd,如果不是,則提示您非管理員

    #!/bin/bash
    #使用字串對比
    if [ $USER     == "root" ]
        then
            yum -y install tree 
    else
        echo "當前用戶無權限"
    fi


    檢測用戶UID,(root用戶UID為0)
    if [ $user -eq 0 ];then
        yum -y install tree
    else
        echo "當前用戶無權限"
    fi


#編寫腳本:提示用戶輸入用戶名和密碼,腳本自動創建相應的賬戶及配置密碼。如果用戶不輸入賬戶名,則提示必須輸入賬戶名並退出腳本;如果用戶不輸入密碼,則統一使用默認的123456 作為默認密碼。

    #!/bin/bash
    read -p "請輸入用戶名: " user
    #使用‐z 可以判斷一個變量是否為空,如果為空,提示用戶必須輸入賬戶名,並退出腳本,退出碼為 2
    #沒有輸入用戶名腳本退出后,使用$?查看的返回碼為 2
    if [ -z $user ];then
        echo "該賬戶已存在"
        exit 2
    fi
    #使用 stty ‐echo 關閉 shell 的回顯功能
    stty -echo
    read -p "請輸入密碼: " pass
    #使用 stty  echo 打開 shell 的回顯功能
    stty echo
    pass=${pass:‐123456}
    useradd "$user"
    echo "$pass" | passwd ‐‐stdin "$user"


輸入三個數並進行升序排序

    #!/bin/bash
    # 依次提示用戶輸入 3 個整數,腳本根據數字大小依次排序輸出 3 個數字
    read -p "請輸入一個整數:" num1
    read -p "請輸入一個整數:" num2
    read -p "請輸入一個整數:" num3
    # 不管誰大誰小,最后都打印 echo "$num1,$num2,$num3"
    # num1 中永遠存最小的值,num2 中永遠存中間值,num3 永遠存最大值
    tmp=0
    # 如果 num1 大於 num2,就把 num1 和和 num2 的值對調,確保 num1 變量中存的是最小值
    if [ $num1 -gt $num2 ];then   
        tmp=$num1
        num1=$num2
        num2=$tmp
    fi
    # 如果 num1 大於 num3,就把 num1 和 num3 對調,確保 num1 變量中存的是最小值
    if [ $num1 -gt $num3 ];then   
          tmp=$num1
          num1=$num3
          num3=$tmp
    fi
    # 如果 num2 大於 num3,就把 num2 和 num3 對標,確保 num2 變量中存的是小一點的值
    if [ $num2 -gt $num3 ];then
          tmp=$num2
          num2=$num3
          num3=$tmp
    fi
    echo "排序后數據為:$num1,$num2,$num3"
    

    
石頭、剪刀、布游戲

    #!/bin/bash
    # 編寫腳本,實現人機<石頭,剪刀,布>游戲
    game=(石頭 剪刀 布)
    num=$[RANDOM%3]
   
     
    echo "請根據下列提示選擇您的出拳手勢"
    echo "1.石頭"
    echo "2.剪刀"
    echo "3.布"
     
    read -p "請選擇 1‐3:" person
    case  $person  in
    1)
      if [ $num -eq 0 ]
      then
        echo "平局"
        elif [ $num -eq 1 ]
        then
          echo "你贏"
      else
        echo "計算機贏"
      fi;;
    2)   
      if [ $num -eq 0 ]
      then
        echo "計算機贏"
        elif [ $num -eq 1 ]
        then
          echo "平局"
      else
        echo "你贏"
      fi;;
    3)
      if [ $num -eq 0 ]
      then
        echo "你贏"
        elif [ $num -eq 1 ]
        then
          echo "計算機贏"
      else
        echo "平局"
      fi;;
    *)
      echo "必須輸入 1‐3 的數字"
    esac


編寫腳本測試 192.168.4.0/24 整個網段中哪些主機處於開機狀態,哪些主機處於關機狀態(for 版本)

    #!/bin/bash
    # 編寫腳本測試 192.168.4.0/24 整個網段中哪些主機處於開機狀態,哪些主機處於關機
    # 狀態(for 版本)
    for i in {1..254}
    do
        # 每隔0.3秒ping一次,一共ping2次,並以1毫秒為單位設置ping的超時時間
           ping ‐c 2 ‐i 0.3 ‐W 1 192.168.4.$i  &>/dev/null
        if  [ $? -eq 0 ];then
               echo "192.168.4.$i is up"
           else
               echo  "192.168.4.$i is down"
           fi
    done

    
# (while 版本)
    
    #!/bin/bash 
    i=1
    while [ $i -le 254 ]
    do
        ping ‐c 2 ‐i 0.3 ‐W 1 192.168.4.$i  &>/dev/null
        if  [ $? -eq 0 ];then
            echo "192.168.4.$i is up"
        else
            echo  "192.168.4.$i is down"
        fi
        let i++
    done


# 狀態(多進程版)
    #!/bin/bash
    #定義一個函數,ping 某一台主機,並檢測主機的存活狀態
    myping(){
    ping ‐c 2 ‐i 0.3 ‐W 1 $1  &>/dev/null
    if  [ $? -eq 0 ];then
        echo "$1 is up"
    else
        echo "$1 is down"
    fi
    }
    for i in {1..254}
    do
        myping 192.168.4.$i &
    done

 

備份日志

    #!/bin/bash
    # 每周 5 使用 tar 命令備份/var/log 下的所有日志文件
    tar    -czf    log-`date +%Y%m%d`.tar.gz    /var/log 

    
監控內存和磁盤容量當小於給定值時報警

    #!/bin/bash
    # 實時監控本機內存和硬盤剩余空間,剩余內存小於500M、根分區剩余空間小於1000M時,發送報警郵件給root管理員
     
    # 提取根分區剩余空間
    disk_size=$(df / | awk '/\//{print $4}')
    # 提取內存剩余空間
    mem_size=$(free | awk '/Mem/{print $4}')
    while :
    do
    # 注意內存和磁盤提取的空間大小都是以 Kb 為單位
    if  [  $disk_size -le 512000 -a $mem_size -le 1024000  ]
    then
        mail  ‐s  "Warning"  root  <<EOF
        Insufficient resources,資源不足
    EOF
    fi
    done



#!/bin/bash
# RANDOM 為系統自帶的系統變量,值為 0‐32767的隨機數,生成一個 100 以內的隨機數
num=$[RANDOM % 100 + 1]
echo "$num"

while :
do 
    # 使用 read 提示用戶猜數字
    read -p "請輸入你猜的數據:" guess
    if [ $num -eq $guess ]
        then
            echo "恭喜你猜對了"
            exit
    elif [ $num -lt $guess ]
        then
            echo "你猜大了"
    else
            echo "你猜小了"
    fi
done 


檢測本機當前用戶是否為超級管理員,如果是管理員,則使用 yum 安裝 vsftpd,如果不是,則提示您非管理員

#!/bin/bash

#使用字串對比
if [ $USER     == "root" ]
    then
        yum -y install tree 
else
    echo "當前用戶無權限"
fi


檢測用戶UID,(root用戶UID為0)
if [ $user -eq 0 ];then
    yum -y install tree
else
    echo "當前用戶無權限"
fi


# 編寫腳本:提示用戶輸入用戶名和密碼,腳本自動創建相應的賬戶及配置密碼。如果用戶不輸入賬戶名,則提示必須輸入賬戶名並退出腳本;如果用戶不輸入密碼,則統一使用默認的123456 作為默認密碼。
#!/bin/bash

read -p "請輸入用戶名: " user
#使用‐z 可以判斷一個變量是否為空,如果為空,提示用戶必須輸入賬戶名,並退出腳本,退出碼為 2
#沒有輸入用戶名腳本退出后,使用$?查看的返回碼為 2
if [ -z $user ];then
       echo "該賬戶已存在"
     exit 2
fi
#使用 stty ‐echo 關閉 shell 的回顯功能
stty -echo
read -p "請輸入密碼: " pass
#使用 stty  echo 打開 shell 的回顯功能
stty echo
pass=${pass:‐123456}
useradd "$user"
echo "$pass" | passwd ‐‐stdin "$user"


輸入三個數並進行升序排序

    #!/bin/bash
    # 依次提示用戶輸入 3 個整數,腳本根據數字大小依次排序輸出 3 個數字
    read -p "請輸入一個整數:" num1
    read -p "請輸入一個整數:" num2
    read -p "請輸入一個整數:" num3
    # 不管誰大誰小,最后都打印 echo "$num1,$num2,$num3"
    # num1 中永遠存最小的值,num2 中永遠存中間值,num3 永遠存最大值
    tmp=0
    # 如果 num1 大於 num2,就把 num1 和和 num2 的值對調,確保 num1 變量中存的是最小值
    if [ $num1 -gt $num2 ];then   
        tmp=$num1
        num1=$num2
        num2=$tmp
    fi
    # 如果 num1 大於 num3,就把 num1 和 num3 對調,確保 num1 變量中存的是最小值
    if [ $num1 -gt $num3 ];then   
          tmp=$num1
          num1=$num3
          num3=$tmp
    fi
    # 如果 num2 大於 num3,就把 num2 和 num3 對標,確保 num2 變量中存的是小一點的值
    if [ $num2 -gt $num3 ];then
          tmp=$num2
          num2=$num3
          num3=$tmp
    fi
    echo "排序后數據為:$num1,$num2,$num3"
    

    
石頭、剪刀、布游戲

    #!/bin/bash
    # 編寫腳本,實現人機<石頭,剪刀,布>游戲
    game=(石頭 剪刀 布)
    num=$[RANDOM%3]
   
     
    echo "請根據下列提示選擇您的出拳手勢"
    echo "1.石頭"
    echo "2.剪刀"
    echo "3.布"
     
    read -p "請選擇 1‐3:" person
    case  $person  in
    1)
      if [ $num -eq 0 ]
      then
        echo "平局"
        elif [ $num -eq 1 ]
        then
          echo "你贏"
      else
        echo "計算機贏"
      fi;;
    2)   
      if [ $num -eq 0 ]
      then
        echo "計算機贏"
        elif [ $num -eq 1 ]
        then
          echo "平局"
      else
        echo "你贏"
      fi;;
    3)
      if [ $num -eq 0 ]
      then
        echo "你贏"
        elif [ $num -eq 1 ]
        then
          echo "計算機贏"
      else
        echo "平局"
      fi;;
    *)
      echo "必須輸入 1‐3 的數字"
    esac


編寫腳本測試 192.168.4.0/24 整個網段中哪些主機處於開機狀態,哪些主機處於關機狀態(for 版本)

    #!/bin/bash
    # 編寫腳本測試 192.168.4.0/24 整個網段中哪些主機處於開機狀態,哪些主機處於關機
    # 狀態(for 版本)
    for i in {1..254}
    do
        # 每隔0.3秒ping一次,一共ping2次,並以1毫秒為單位設置ping的超時時間
           ping ‐c 2 ‐i 0.3 ‐W 1 192.168.4.$i  &>/dev/null
        if  [ $? -eq 0 ];then
               echo "192.168.4.$i is up"
           else
               echo  "192.168.4.$i is down"
           fi
    done

    
    
    #!/bin/bash

# (while 版本) 
i=1
while [ $i -le 254 ]
do
       ping ‐c 2 ‐i 0.3 ‐W 1 192.168.4.$i  &>/dev/null
       if  [ $? -eq 0 ];then
           echo "192.168.4.$i is up"
    else
           echo  "192.168.4.$i is down"
       fi
       let i++
done


#!/bin/bash
# 狀態(多進程版)
 
#定義一個函數,ping 某一台主機,並檢測主機的存活狀態
myping(){
ping ‐c 2 ‐i 0.3 ‐W 1 $1  &>/dev/null
if  [ $? -eq 0 ];then
    echo "$1 is up"
else
    echo "$1 is down"
fi
}
for i in {1..254}
do
       myping 192.16


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM