常用鏈接

          統計

          最新評論

          Shell 運算和進制轉換(轉)

          Shell 運算和進制轉換

          Shell 提供大量的基本運算操作,在腳本中非常有用。Shell 對您提供的算術表達式求值,執行運算展開式,此時使用得出的結果替換表達式。以下面的格式提供運算表達式:

          $(( expression ))
                                  

          您可以使用 echo 在命令行顯示運算展開式的結果,了解其工作情況?,F在嘗試清單 5 所顯示的結果。


          清單 5. Bourne Shell 中的運算展開式
                               
                                  $ echo $((10+40))
                                  50
                                  $ echo $((5*(3+3)))
                                  30
                                  

          您還可以將展開式分配給變量。嘗試清單 6 所顯示的結果。


          清單 6. 將運算展開式分配給 Shell 變量
                               
                                  $ myvar = 10
                                  $ echo $myvar
                                  10
                                  $ echo $(($myvar-2))
                                  8
                                  $ myvar = $(($myvar+5))
                                  $ echo $myvar
                                  15
                                  $ result = $(($myvar-10))
                                  $ echo $result
                                  5
                                  $
                                  

          表 2 列出了在大多數 Bourne 以及與 Bourne 兼容的 Shell中可以使用的運算符。正如上面第二個示例,使用圓括號括起來的語句有更高的優先級。實際上,Shell 算術優先級通常根據 C 語言的規則來確定。


          表 2. Shell 條件表達式
          運算符 描述
          +
          -
          *
          /
          % 求余
          < 小于(1 代表真,0 代表假)
          <= 小于等于(1 代表真,0 代表假)
          > 大于(1 代表真,0 代表假)
          >= 大于等于(1 代表真,0 代表假)
          << 按位向左移位:將給定的整數或第一個表達式向左移動第二個表達式表示的位數
          >> 按位向右移位:將給定的整數或第一個表達式向右移動第二個表達式表示的位數




          回頁首


          使用 Shell 運算進行進制轉換

          假定在您的腳本中有一些數字,您需要以另外的進制處理這些數字。使用 Shell 運算可以很容易地自動實現這類轉換。一種情況是使用 Shell 運算把一個數字從給定的進制轉換位十進制。如果數字以運算展開式的形式提供,那么假定它帶有十進制符號,除非 它前面帶有 0(這種情況假定是八進制)或 0x(這種情況假定是十六進制)。鍵入以下內容以得到一些八進制和十六進制值的十進制輸出:

          $ echo $((013))
                                  $ echo $((0xA4))
                                                  

          您還可以使用以下格式指定 2 到 64 之間的任意進制:

          $((BASE#NUMBER))
                                  

          通過在 Shell 提示符后鍵入清單 7 中所示的行,嘗試將二進制、八進制、十六進制以及其他進制的數轉換為十進制。


          清單 7. 在 Shell 中將任意進制的數以十進制輸出
                               
                                  echo $((2#1101010))
                                  echo $((8#377))
                                  echo $((16#D8))
                                  echo $((12#10))
                                  echo $((36#ZZYY))
                                  

          使用 bc 進行進制轉換

          在 Shell 中進行進制轉換的另一個訣竅是使用 bc,它是一種任意精度運算語言,大多數 UNIX 安裝程序都提供。因為它允許您指定輸出進制,所以當您需要以十進制以外的進制輸出時,這是一種很好的技術。

          bc 的特殊變量 ibaseobase 分別包含用于輸入和輸出的進制的值。缺省情況下,都被設置為 10。要執行進制轉換,需要改變其中的一個或兩個值,然后提供一個數字。立即嘗試,如清單 8 中所示。


          清單 8. 使用 bc 執行進制轉換
                               
                                  $ bc -ql
                                                      10
                                  10
                                  obase=16
                                                      10
                                  A
                                  ibase=2
                                                      10
                                  2
                                  
                                                           Control-D
                                                      
                                  $
                                  

          要快速執行進制轉換,可以聯合使用 bcecho形成快捷的單命令行程序,將給定的值通過管道傳輸給 bc。鍵入清單 9 中顯示的內容。


          清單 9. Shell 單命令行 bc 程序
                               
                                  $ echo 'obase=16; 47' | bc
                                  2F
                                  $ echo 'obase=10; ibase=16; A03' | bc
                                  2563
                                  $
                                  

          警告:當您設置 bc 的輸入進制以后,輸入 bc 的所有數字都使用該進制,包括您提供用于設置輸出進制的數字。因此最好先設置輸出進制,否則可能會產生意想不到的結果,如清單 10 中所示。


          清單 10. 設置輸入和輸出進制的先后順序的重要性
                               
                                  $ echo 'ibase=16; obase=10; A' | bc
                                  A
                                  $ echo 'ibase=16; obase=A; A' | bc
                                  10
                                  $
                                  

          posted on 2008-07-09 14:46 九寶 閱讀(1654) 評論(0)  編輯  收藏 所屬分類: Linux

          主站蜘蛛池模板: 尼玛县| 安陆市| 荥经县| 纳雍县| 禹城市| 隆尧县| 聂拉木县| 通渭县| 泽库县| 宣化县| 墨玉县| 天气| 温泉县| 南投县| 镇雄县| 铜梁县| 禹城市| 勃利县| 呼图壁县| 鹤山市| 黄浦区| 堆龙德庆县| 永仁县| 新昌县| 红河县| 报价| 开平市| 军事| 临泉县| 彭水| 莱州市| 南郑县| 玉龙| 苏尼特右旗| 曲麻莱县| 无极县| 呼伦贝尔市| 丰城市| 资兴市| 常宁市| 东明县|