shell腳本小練習
shell腳本小練習
說明:
最近寫了一些簡單的小腳本,用到了一些邏輯判斷語句。個人感覺挺好玩的,拿來跟大家分享下。同時也會做一些解釋說明
腳本代碼可能還有待優化,如果有冗余或者錯誤的地方還請批評指正。
目錄:
條件判斷語句
1.1 if語句
1.1.1示例
1.2 case語句
1.2.1示例
循環語句
2.1 for語句
2.1.1 for語句一
2.1.2 for語句二
2.1.3示例
2.2 while語句
2.2.1示例
2.3 until語句
2.3.1示例
2.4 特殊語句(break、無限循環、select)
2.4.1示例
信號捕捉
3.1 trap
3.1.1示例
特殊用法
4.1 while read語句
4.1.1 示例
4.2 select語句
4.2.1 示例
條件判斷語句
1.1 if語句
格式: if COMMANDS; then //if後面緊跟判斷為真的條件,並執行then後的分支代碼COMMANDS,判斷條件與執行代碼之間用分號隔開 COMMANDS [ elif COMMANDS; then COMMANDS; ]... //如果還要進行真的判斷,則使用elif繼續進行,其格式與if相同 else COMMANDS //如果多次判斷為真的條件都失敗,則使用else,並執行為假的操作 fi //以if開頭,以fi結尾
1.1.1 示例
使用if判斷用戶輸入的是整數
#!/bin/bash //“蛇棒”機制,默認shell為bash,此行可以不寫。建議寫上 read -t 30 -p "please input an interger: " int //與用戶交互,提示用戶輸入一個整數,並設置超時時間30miao if [[ "$int" =~ [^0-9]+ ]] ;then //開始if條件的判斷,判斷用戶輸入的是除0-9之外的任意長度任意字符 echo "your input is not available" //如果上述條件為真,就執行打印操作,提示“輸入非法”,並退出腳本 exit else //else表示上述條件判斷都不為真,於是進行為假的操作 echo "$int is interger" //為假的操作打印字符串,即用戶的輸入是整數 exit //緊接著退出腳本 fi unset int //取消變量,養成好的習慣
1.2 case語句
格式: case WORD in //WORD表示變量名,如$var,一般為交互的輸入值,in表示進入判斷主體 PATTERN1) //若WORD與PATTERN1匹配則執行其下的命令,PATTERN1支持通配符,如*、?、[]、|等 COMMANDS ;; PATTERN2) COMMANDS ;; ... *) //如果上述所有PATTERN都不匹配則執行此步驟 COMMANDS ;; esac //以case開頭,以esac結尾
1.2.1 示例
判斷用戶輸入的yes和no,或者y和n,並且大小寫不敏感
#!/bin/bash read -t 30 -p "please input ‘yes‘ or ‘no‘ : " answer case $answer in //$answer為變量,存放的是用戶輸入的信息 [yY]|[yY][eE][sS]) //只指定範圍的任意單個字符,|或者的關系 echo "your choice is : $answer" //也就是說只要輸入的是大小寫yes還是大小寫的y都認為是真的 ;; [nN]|[nN][oO]) echo "your choice is : $answer" ;; *) echo "other" ;; esac unset answer
循環語句
2.1 for語句
2.1.1
格式: for NAME in WORDS ... ; do //NMAE表示變量,不加$,將WORDS賦值給NAME,執行COMMANDS操作 COMMANDS //如果循環條件不再滿足,則不會執行此命令而是直接退出 done //以for開頭,以done結尾
2.1.2
格式: for (( exp1; exp2; exp3 )); do /第一exp1為變量初始化,第二exp2判斷條件為真 COMMANDS //第三執行COMMANDS命令,第四exp3為變量修正表達式 done //知道exp2條件判斷不再滿足,才退出循環
2.1.3 示例
計算1到100之間,能被3整除的所有數之和
#!/bin/bash for i in {1..100} ;do //依次為變量i賦值1到100,也就是說i得到一個數值就進行一次循環體操作,循環100次 let n=i%3 if [ "$n" -eq 0 ] ;then //嵌套if條件判斷 let sum+=i //sum+=i,就是sum=sum+i,即sum值加i fi done echo "sum=$sum" unset i n sum
#!/bin/bash #計算從0加到用戶輸入數字的總和 read -t 30 -p "please input a digit: " num if [[ "$num" =~ ^[1-9]([0-9]?)+$ ]] ;then //判斷用戶輸入的是至少一位的正整數 for (( i=0;i<=num;i++ )) ;do //此處用的是for的第二種格式,對i初始化賦值為0,只要i小於用戶輸入的數字就繼續執行循環,每次循環結束i值加一 let sum+=i done else //如果用戶輸入的不是正整數,則提示錯誤並退出 echo "input error" exit fi echo "sum=$sum" unset i num sum
2.2 while語句
格式: while COMMANDS; do //當COMMANDS為真的時候,才會執行循環體 COMMANDS done //以while開頭,以done結尾
2.2.1 示例
計算100以內的正奇數之和
#!/bin/bash i=1 //首先為變量i賦值,因為while的變量是直接拿來用的,所以必須提前賦值 sum=0 while (( i <= 100 )) ;do //當變量i值小於等於100時就進入循環體,但是並不是執行循環100次 let sum+=i i=$[i+2] //因為變量i每次增加2,所以循環體只是在i為奇數情況下執行 done echo "sum=$sum" unset i sum
2.3 until語句
與while判斷條件相反,其他操作一樣
until COMMANDS; do //當COMMANDS為假的時候,才會執行循環體 COMMANDS done //以until開頭,以done結尾
2.3.1 示例
#!/bin/bash i=0 //變量i賦初值為0 until (( i > 10 )) ;do //直到變量i的值大於10,才終止循環 let i++ if [ "$i" -eq 5 ] ;then continue else echo "num is $i" fi done unset i
2.4 特殊語句
無限循環
格式: while true ; do //當為真的時候一直執行循環體 循環體 done 或者 until false ; do //當為假的時候一直執行循環體 循環體 done
循環控制continue、break、shift
continue: 用於循環體中 退出本次循環,不執行後面的操作,直接進入下一次循環 break: 用於循環體中 退出本層循環,直接進入下一層循環,如果只有一層循環則退出腳本 shift: 將參數列表向左移,默認移動一次
2.4.1 示例
每3秒鐘檢查一次hacker用戶是否登陸,登陸的化就退出腳本
#!/bin/bash while true ;do //無限循環 sleep 3 //休眠3秒,也就是每3秒執行一次下述操作 if who|grep "^hacker\>" > /app/login.log ;then //如果hacker用戶登陸就執行下述操作 break //退出本層循環,由於本腳本只有一層循環,所以直接退出腳本。continue只是退出一次循環,並不退出整個循環,所以依然在腳本運行 fi done
#!/bin/bash #用戶輸入至少兩個數字,最終列出最大與最小值 [ -z "$1" ] && echo "you must input at least two digit" && exit //與運算,用戶必須輸入至少兩個數字 max=$1 //給最大值變量賦初值 min=$1 //給最小值變量賦初值 while [ -n "$1" ] ;do num=$1 //變量num只是最大值與最小值變量之間的過渡容器 if (( num > max )) ;then max=$[num] //冒泡排序,取出最大值 shift //用戶輸入列表左移一次,即最左邊的數字已經被覆蓋了,其後面的數字變為第一個數值 elif (( num < min )) ;then min=$[num] //冒泡排序,取出最小值 shift else shift fi done echo "max is $max" echo "min is $min" unset max min num
信號捕捉
3.1 trap語句
kill -l或者trap -l可以查看系統定義好的指令信號,比如ctrl+c是終止的意思,其對應的指令信號是2) SIGINT
而trap可以修改這些指令信號,使其臨時失效
3.1.1 示例
#!/bin/bash #trap的觸發指令替代原信號指令int,‘‘內的是觸發指令,也就是替代原指令的 trap ‘echo " you can not kill"‘ int //當for循環體執行時,ctrl+c對應的int指令就會被echo命令替代,也就是說ctrl+c失效了 trap -p //列出自定義信號的操作 for (( i=1;i<=10;i++ )) ;do echo "$i" sleep 0.5 done #‘‘表示忽略原信號int trap ‘‘ int //當執行int終止信號時,是失效的,循環體會繼續運行 trap -p for (( i=11;i<=20;i++ )) ;do echo "$i" sleep 0.5 done #‘-’表示恢復原信號int的終止功能,即ctrl + c trap ‘-‘ int //恢復原信號,此時ctrl+c可以生效了 trap -p for (( i=21;i<=30;i++ )) ;do echo "$i" sleep 0.5 done unset i
特殊用法
4.1 while read語句
格式: while read line; do //遍歷文件的每一行,將文件每一行賦值給變量line,然後執行循環體,read是關鍵字 循環體 done < /PATH/FILE
4.1.1 示例
掃描/etc/passwd文件每一行,如發現GECOS字段為空,則填充用戶名和單位電話,並提示該用戶的GECOS信息修改成功
#!/bin/bash while read line ;do //read讀入passwd文件的每一行,並賦值給line,執行下述循環體 GECOS=`echo $line | cut -d ":" -f 5` //取出passwd每一行的描述字段,並賦值變量GECOS name=`echo $line | cut -d ":" -f 1` //取出用戶名,並賦值變量name if [ -z "$GECOS" ] ;then //判斷描述字段$GECOS空則為真 chfn -f "$name" -p "1234567890" $name &> /dev/null //條件為真則修改用戶描述,用chfn命令專門修改描述信息 echo "$name modify success" fi done < /etc/passwd //遍歷此文件的每一行 unset GECOS name
4.2 select語句
select variable in list do 循環體命令 done
select循環主要用於創建菜單,按數字順序排列菜單項,並顯示PS3提示,與用戶交互
用戶輸入菜單的對應數字,則執行其對應的命令
用戶輸入被保存在內置變量REPLY中
4.2.1 示例
#!/bin/bash PS3="-->" select menu in 拉面 燴面 羊肉湯 蓋飯 餃子; do //變量menu被賦值為後面的菜單項 case $REPLY in //用戶的輸入存放在$REPLY中 1) //當用戶輸入1,即$REPLY值為1時,執行1對應的命令echo,也就是說拉面的價格是$10 echo "\$10" echo $menu //當用戶輸入1時,對應的菜單項是拉面,所以此處打印是“拉面” ;; 2) echo "\$20" ;; 3) echo "\$30" ;; 4) echo "\$40" ;; 5) echo "\$50" ;; *) break ;; esac done
結束
本文出自 “高攀” 博客,轉載請與作者聯系!
shell腳本小練習