1. gzyueqian
      18529173453
      首頁 > 新聞中心 > > 正文

      兩個很詳細的shell 實例

      更新時間: 2007-05-27 01:47:05來源: 粵嵌教育瀏覽量:788

        
        一般編程步驟

        現在我們來討論編寫一個腳本的一般步驟。任何的腳本都應該具有幫助和輸入參數。并且寫一個偽腳本(framework.sh),該腳本包含了大多數腳本都需要的框架結構,是一個非常不錯的主意。這時候,在寫一個新的腳本時我們只需要執行一下copy命令:

      cp framework.sh myscript

        然后再插入自己的函數。

        讓我們再看兩個例子:

        二進制到十進制的轉換

        腳本 b2d 將二進制數 (比如 1101) 轉換為相應的十進制數。這也是一個用expr命令進行數學運算的例子:


      #!/bin/sh
      # vim: set sw=4 ts=4 et:
      help()
      {
       cat < b2h -- convert binary to decimal

      USAGE: b2h [-h] binarynum

      OPTIONS: -h help text

      EXAMPLE: b2h 111010
      will return 58
      HELP
       exit 0
      }

      error()
      {
        # print an error and exit
        echo "$1"
        exit 1
      }

      lastchar()
      {
        # return the last character of a string in $rval
        if [ -z "$1" ]; then
          # empty string
          rval=""
          return
        fi
        # wc puts some space behind the output this is why we need sed:
        numofchar=`echo -n "$1" | wc -c | sed 's/ //g' `
        # now cut out the last char
        rval=`echo -n "$1" | cut -b $numofchar`
      }

      chop()
      {
        # remove the last character in string and return it in $rval
        if [ -z "$1" ]; then
          # empty string
          rval=""
          return
        fi
        # wc puts some space behind the output this is why we need sed:
        numofchar=`echo -n "$1" | wc -c | sed 's/ //g' `
        if [ "$numofchar" = "1" ]; then
          # only one char in string
          rval=""
          return
        fi
        numofcharminus1=`expr $numofchar "-" 1`
        # now cut all but the last char:
        rval=`echo -n "$1" | cut -b 0-${numofcharminus1}`
      }


      while [ -n "$1" ]; do
      case $1 in
        -h) help;shift 1;; # function help is called
        --) shift;break;; # end of options
        -*) error "error: no such option $1. -h for help";;
        *) break;;
      esac
      done

      # The main program
      sum=0
      weight=1
      # one arg must be given:
      [ -z "$1" ] && help
      binnum="$1"
      binnumorig="$1"

      while [ -n "$binnum" ]; do
        lastchar "$binnum"
        if [ "$rval" = "1" ]; then
          sum=`expr "$weight" "+" "$sum"`
        fi
        # remove the last position in $binnum
        chop "$binnum"
        binnum="$rval"
        weight=`expr "$weight" "*" 2`
      done

      echo "binary $binnumorig is decimal $sum"
      #

        該腳本使用的算法是利用十進制和二進制數權值 (1,2,4,8,16,..),比如二進制"10"可以這樣轉換成十進制:

      0 * 1 + 1 * 2 = 2

        為了得到單個的二進制數我們是用了lastchar 函數。該函數使用wc –c計算字符個數,然后使用cut命令取出末尾一個字符。Chop函數的功能則是移除一個字符。

        文件循環程序

        或許您是想將所有發出的郵件保存到一個文件中的人們中的一員,但是在過了幾個月以后,這個文件可能會變得很大以至于使對該文件的訪問速度變慢。下面的腳本rotatefile 可以解決這個問題。這個腳本可以重命名郵件保存文件(假設為outmail)為outmail.1,而對于outmail.1就變成了outmail.2 等等等等...


      #!/bin/sh
      # vim: set sw=4 ts=4 et:
      ver="0.1"
      help()
      {
        cat < rotatefile -- rotate the file name

      USAGE: rotatefile [-h] filename

      OPTIONS: -h help text

      EXAMPLE: rotatefile out
      This will e.g rename out.2 to out.3, out.1 to out.2, out to out.1
      and create an empty out-file

      The max number is 10

      version $ver
      HELP
        exit 0
      }

      error()
      {
        echo "$1"
        exit 1
      }
      while [ -n "$1" ]; do
      case $1 in
        -h) help;shift 1;;
        --) break;;
        -*) echo "error: no such option $1. -h for help";exit 1;;
        *) break;;
      esac
      done

      # input check:
      if [ -z "$1" ] ; then
      error "ERROR: you must specify a file, use -h for help"
      fi
      filen="$1"
      # rename any .1 , .2 etc file:
      for n in 9 8 7 6 5 4 3 2 1; do
        if [ -f "$filen.$n" ]; then
          p=`expr $n + 1`
          echo "mv $filen.$n $filen.$p"
          mv $filen.$n $filen.$p
        fi
      done
      # rename the original file:
      if [ -f "$filen" ]; then
        echo "mv $filen $filen.1"
        mv $filen $filen.1
      fi
      echo touch $filen
      touch $filen

        這個腳本是如何工作的呢?在檢測用戶提供了一個文件名以后,我們進行一個9到1的循環。文件9被命名為10,文件8重命名為9等等。循環完成之后,我們將原始文件命名為文件1同時建立一個與原始文件同名的空文件。

        調試

        簡單的調試命令當然是使用echo命令。您可以使用echo在任何懷疑出錯的地方打印任何變量值。這也是絕大多數的shell程序員要花費80%的時間來調試程序的原因。Shell程序的好處在于不需要重新編譯,插入一個echo命令也不需要多少時間。

        shell也有一個真實的調試模式。如果在腳本"strangescript" 中有錯誤,您可以這樣來進行調試:

      sh -x strangescript


        這將執行該腳本并顯示所有變量的值。

        shell還有一個不需要執行腳本只是檢查語法的模式。可以這樣使用:

      sh -n your_script

        這將返回所有語法錯誤。

        我們希望您現在可以開始寫您自己的shell腳本,希望您玩得開心。

      免費預約試聽課

      亚洲另类欧美综合久久图片区_亚洲中文字幕日产无码2020_欧美日本一区二区三区桃色视频_亚洲AⅤ天堂一区二区三区

      
      

      1. 中文字幕亚洲乱码 | 五月婷婷亞洲綜合色色 | 最新亚洲中文字幕无线 | 一本色道久久88亚洲精品综合 | 亚洲精品一级在线播放 | 亚洲日韩性爱在线精品视频 |