Shell 運算和進制轉換
Shell 提供大量的基本運算操作,在腳本中非常有用。Shell 對您提供的算術表達式求值,執行運算展開式,此時使用得出的結果替換表達式。以下面的格式提供運算表達式:
您可以使用 echo
在命令行顯示運算展開式的結果,了解其工作情況。現在嘗試清單 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 之間的任意進制:
通過在 Shell 提示符后鍵入清單 7 中所示的行,嘗試將二進制、八進制、十六進制以及其他進制的數轉換為十進制。
清單 7. 在 Shell 中將任意進制的數以十進制輸出
echo $((2#1101010))
echo $((8#377))
echo $((16#D8))
echo $((12#10))
echo $((36#ZZYY))
|
使用 bc 進行進制轉換
在 Shell 中進行進制轉換的另一個訣竅是使用 bc
,它是一種任意精度運算語言,大多數 UNIX 安裝程序都提供。因為它允許您指定輸出進制,所以當您需要以十進制以外的進制輸出時,這是一種很好的技術。
bc
的特殊變量 ibase
和 obase
分別包含用于輸入和輸出的進制的值。缺省情況下,都被設置為 10。要執行進制轉換,需要改變其中的一個或兩個值,然后提供一個數字。立即嘗試,如清單 8 中所示。
清單 8. 使用 bc 執行進制轉換
$ bc -ql
10
10
obase=16
10
A
ibase=2
10
2
Control-D
$
|
要快速執行進制轉換,可以聯合使用 bc
和 echo
形成快捷的單命令行程序,將給定的值通過管道傳輸給 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
$
|