shell腳本編程進階總結


       這兩天學習了shell腳本編程進階,作為一枚文科生,小編覺得...恩..腳本很燒腦.....,不過小編還是做了些題,稍作總結后,呈給各位看官,內容如下:

一、條件選擇if語句

選擇執行: 

注意:if語句可嵌套 

單分支

   if 判斷條件;then

      條件為真的分支代碼

   fi

雙分支

   if 判斷條件; then

      條件為真的分支代碼

   else

      條件為假的分支代碼

   fi

多分支

if 判斷條件1; then

   條件為真的分支代碼

elif 判斷條件2; then

   條件為真的分支代碼

elif 判斷條件3; then

   條件為真的分支代碼

else

   以上條件都為假的分支代碼

fi

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

  1 #!/bin/bash
  2 read -p "please input username:" username
  3    useradd $username  &> /dev/null
  4    if [ $? -eq 0 ];then
  5         echo "add $username user" && id $username
  6    else                                                                          
  7         echo "the user already exits"                                                   
  8   fi

 

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

  1 #!/bin/bash
  2 read -p "please input a digit:" int
  3 if [[ $int =~ (^[0-9]*[1-9][0-9]*$) ]];then
  4   echo "this digit is positive integer"
  5 else
  6   echo "this digit is not positive integer"                                      
  7 fi

二、條件判斷case語句

語法格式:

case 變量引用 in

PAT1)

    分支1

    ;;

PAT2)

    分支2

    ;;

...

*)

    默認分支

    ;;

esac

3、編寫腳本/root/bin/yesorno.sh,提示用戶輸入yes或no, 並判斷用戶輸入的是yes還是no,或是其它信息

  1 #!/bin/bash
  2 read -p "can i help you? yes or no " ans
  3 case $ans in
  4 [yY][eE][sS]|[yY])
  5          echo "ok,come on"
  6          ;;
  7 [nN][oO]|[nN])
  8          echo "no,thanks"
  9          ;;
  10 *)
  11          echo "byebye"
  12          ;;
  13 esac

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

  1 #!/bin/bash
  2 read -p "please input file path:" path  
  3 a=`ls -l $path|grep -o "^."`    #腳本里面不能使用別名,所以用ls -l
  4 case $a in
  5 -)
  6  echo "common file"
  7  ;;
  8 d)
  9  echo "directory file"
  10  ;;
  11 l)
  12  echo "linked file"
  13  ;;
  14 *)
  15  echo "other file"
  16  ;;
  17 esac

三、for循環

語法格式:

for 變量名 in 列表;do

   循環體

done

執行機制:

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

for循環列表生成方式:

  (1)直接給出列表

  (2)整數列表:

      (a){start..end}

      (b)$(seq [start [step]] end)

  (3)返回列表的命令

      $(COMMAND)

  (4)使用glob,如:*.sh

  (5)變量引用;

      $@, $*

5、編寫腳本,提示輸入正整數n的值,計算1+2+…+n的總和

  1 #!/bin/bash
  2 read -p "please input a positive integer:" n
  3 i=1
  4 sum=0
  5 for i in `seq 1 $n`;do
  6    if [[ $n =~ (^[0-9]*[1-9][0-9]*$) ]];then  #判斷n是否為正整數
  7        let sum+=i
  8    else
  9        echo "a wrong int" && exit
  10    fi
  11        let i++                                                                   
  12 done
  13 echo "sum is $sum"

6、計算100以內所有能被3整除的整數之和

  1 #!/bin/bash
  2 sum=0
  3 i=1
  4 for i in {1..100};do
  5     if [ $[$i%3] -eq 0 ];then
  6        let sum+=i
  7     fi
  8        let i++
  9 done
  10 echo $sum

7、打印九九乘法表

  1 #!/bin/bash                                                                      
  2 for i in {1..9};do
  3      for j in `seq 1 $i`;do
  4      echo -n "$i*$j=$[i*j] "
  5      done
  6      echo
  7 done

8、打印等腰三角形

  1 #!/bin/bash                                                                                                         
  2 . functions
  3 read -p "please input line:" line
  4 is_digit $line
  5 #i=*的個數 s=空格個數 l=當前行數
  6 [ $? -ne 0 ] && exit
  7 # 循環打印
  8 for l in `seq 1 $line`;do
  9          for s in `seq 1 $[$line-$l]`;do
  10                  echo -en " "
  11          done
  12            for i in `seq 1 $[2*$l-1]`;do
  13                if [ $i -eq 1 ];then
  14                  color=$[RANDOM%7+31]  #定義一個31到37的隨機顏色
  15                    echo -en "\e[1;${color};5m*\e[0m"  #1代表高亮顯示,5m代表閃爍
  16                elif [ $i -eq $[$l*2-1] ];then
  17                    echo -en "\e[1;${color};5m*\e[0m"
  18                else
  19                    echo -en "*"
  20                fi
  21           done
  22 echo
  23 done

四、while循環

語法格式:

while CONDITION; do

    循環體

 done

CONDITION:循環控制條件;進入循環之前,先做一次判斷;每一次循環之后會再次做判斷;條件為“true”,則執行一次循環;直到條件測試狀態為“false”終止循環

因此:CONDTION一般應該有循環控制變量;而此變量的值會在循環體不斷地被修正

進入條件:CONDITION為true

退出條件:CONDITION為false

9、編寫腳本,求100以內所有正奇數之和

    1 #!/bin/bash
  2 i=1
  3 sum=0
  4 while [ $i -le 100 ];do
  5     if [ $[$i%2] -ne 0 ];then
  6        let sum+=i
  7     fi
  8        let i++
  9 done
 10 echo "sum is $sum"

10、編寫腳本,利用變量RANDOM生成10個隨機數字,輸出 這個10數字,並顯示其中的最大值和最小值

  1 #!/bin/bash
  2 i=1
  3 a=$RANDOM
  4 max=$a
  5 min=$a
  6 while [ $i -le 10 ];do
  7       [ $max -lt $a ] && max=$a
  8       [ $min -gt $a ] && min=$a
  9 a=$RANDOM
 10     echo "$a"
 11     let i++
 12 done
 13 echo "max is $max"
 14 echo "min is $min"

11、編寫腳本,實現打印國際象棋棋盤

 1 #!/bin/bash                                                                      
  2 red="\e[41m  \e[0m"
  3 white="\e[47m  \e[0m"
  4 for i in `seq 1 8`;do    #這里定義了一個8行的棋盤
  5          if [ $[i%2] -eq 0 ];then    #判斷是否為偶行
  6              for j in {1..4};do    #四個偶數行就循環四遍紅白色
  7                 echo -en "$red$white"
  8              done
  9          else
 10              for j in {1..4};do    #四個奇數行循環白紅行
 11               echo -en "$white$red"
 12              done
 13          fi
 14          echo
 15 done

12、后續六個字符串:efbaf275cd、4be9c40b8b、 44b2395c46、f8c8873ce0、b902c16c8b、ad865d2f63 是通過對隨機數變量RANDOM隨機執行命令: echo $RANDOM|md5sum|cut –c1-10 后的結果,請破解這些字符串對應的RANDOM值

 1 #!/bin/bash
  2 key_num_array=(efbaf275cd 4be9c40b8b 44b2395c46 f8c8873ce0 b902c16c8b ad865d2f63)  #將這些字符串賦值到數組里,方便調用
  3 for true_num in `seq 0 65535`;do   #RANDOM值為0~65535
  4     key_num=`echo $true_num | md5sum | cut -c 1-10`
  5     for num in  ${key_num_array[*]}; do
  6         if [ "$key_num" == "$num" ];then
  7             echo "$num --> $true_num" 
  8         fi                                                                       
  9     done
 10 done

五、Until循環(與while條件相反,比較少用)

語法格式:

until CONDITION; do

循環體 

done 

進入條件: CONDITION 為false 

退出條件: CONDITION 為true

13、每隔3秒鍾到系統上獲取已經登錄的用戶的信息;如果發 現用戶hacker登錄,則將登錄時間和主機記錄於日志 /var/log/login.log中,並退出腳本

 1 #!/bin/bash                                                                      
  2 until who |grep "^hacker\>";do
  3  sleep 3
  4 done
  5  who|egrep -o "^hacker.*"|sed -r 's/^hacker[[:space:]]+'// >> /app/hacker.log   #小編這里記錄於這個路徑
  6  echo "you should logout"| mail hacker

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

 1 #!/bin/bash                                                                      
  2 num=$[$RANDOM%10+1]
  3 read -p "please guess:" i
  4 until [ $num -eq $i ]; do
  5    if [ $i -lt $num ]; then
  6         echo "less,guess again"
  7    else
  8         echo "bigger,guess again"
  9    fi
 10 read -p "please guess:" i
 11 done
 12 echo "guess succeed!";exit

六、循環控制語句continue

用於循環體中 

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

語法格式:

while CONDTIITON1; do

CMD1

...

if CONDITION2; then

continue

fi

CMDn

...

Done

 舉例奇數相加並跳過51

  1 #!/bin/bash
  2 for((i=1,sum=0;i<=100;i++));do #奇數相加
  3     [ $i -eq 51 ] && continue  #結束本輪循環,就是跳過51執行下面的奇數53  
  4     [ $[i%2] -eq 1 ] && let sum+=i
  5  done 
  6  echo "sum is $sum"                                                              
  7  unset i sum

七、循環控制語句break

用於循環體中 

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

語法格式:

while CONDTIITON1; do

CMD1

...

if CONDITION2; then break

fi

CMDn

...

Done

舉例結束點餐

 1 #!/bin/bash                                                                                                         
  2 cat << EOF
  3 1 yangroufan
  4 2 mifan
  5 3 hulatang
  6 4 jiaozi
  7 5 lamian
  8 6 huimian
  9 7 exit
 10 EOF
 11 while true;do
 12 read -p "please choose: " wufan
 13 case $wufan in
 14 1|4)
 15       echo "price 20"
 16       ;;
 17 2|5)
 18       echo "price 15"
 19       ;;
 20 3|6)
 21       echo "price 10"
 22       ;;
 23 7)
 24       break  #輸入7就直接退出這個循環
 25       ;;
 26 *)
 27       echo "no this option"
 28       ;;
 29 esac
 30 done

八、循環控制shift命令

shift [n] 

用於將參量列表 list 左移指定次數

參量列表 list 一旦被移動,最左端的那個參數就從列表中刪 除。while 循環遍歷位置參量列表時,常用到 shift

舉例:

  1 #!/bin/bash                                                                                                         
  2 while (( $# > 0 ));do
  3   echo $*
  4   shift
  5 done

九、select與case

select 循環主要用於創建菜單,按數字順序排列的,它是個無限循環,因此要記住用 break 命令退 出循環,或用 exit 命令終止腳本。也可以按 ctrl+c 退出循環 

select 經常和 case 聯合使用

舉例創建菜單並退出菜單: 

  1 #!/bin/bash                                                                                                         
  2 select menu in yangroufan gaojiaofan huimian hulatang quit;do
  3 case $REPLY in
  4 1|3)
  5    echo "price is 20"
  6    ;;
  7 2|4)
  8    echo "price is 15"
  9    ;;
  10 5)
  11    break
  12    ;;
  13 *)
  14    echo "no this option"
  15    ;;
  16 esac
  17 done

十、信號捕捉trap :捕捉到信號后自定義處理

trap '觸發指令' 信號

自定義進程收到系統發出的指定信號后,將執行觸發指令 ,而不會執行原操作 trap '' 信號 忽略信號的操作 

trap '-' 信號 恢復原信號的操作 

trap -p 列出自定義信號操作

舉例打印數字捕捉信號

 1 #!/bin/bash                                                                                                         
  2 trap 'echo press ctrl+c' 2   #提示按了ctrl+c
  3 for((i=0;i<10;i++));do
  4   sleep 1
  5  echo $i
  6 done
  7 trap '' INT   #不提示
  8  for((i=10;i<15;i++));do
  9      sleep 1
  10     echo $i
  11    done
  12 trap '-' 2    #恢復ctrl+c的停止作用
  13    for((i=15;i<20;i++));do
  14      sleep 1
  15     echo $i
  16    done

        腳本雖難,寫好了則“一勞永逸”。好了,到這里小編關於腳本這一節的分享就結束了,歡迎大家評論,多多指教哦。


免責聲明!

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



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