編碼語句分類:
順序執行
選擇執行
循環執行
選擇執行: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