在Linux下做算術運算時你是如何進行的呢?是不是還在用expr呢?你會說我還會bc還有其它的呢!
閑話不多扯,幹正事!
expr
expr在使用中要注意一些書寫,如運算式中量和運算子號之間的空格及一些運算子號需要轉義,還有一點需要記住,expr只適用於整數之間的運算!
運算式
expr的help文檔中關於運算式部分如下:
ARG1 |& ARG2 若兩邊的值都不為0 或為空白,則返回ARG1,否則返回 <<==!=>=>+-*/% ARG2 計算 ARG1 與ARG2 相除之餘數
這一部分相信大家用的最多,也對這些比較瞭解了,下面我們用一個運算式來說明:
$ + - \* / + \( - \) \*
通過結果相信你已知道expr的計算規律,它與我們日常所理解的數學運算式一樣,括弧的優先順序最高,然後是“*”、“/”,而且每個數或符號都需要用空格分隔,結果也是整數。
字串
expr還可以對字串進行操作:
match 字串 運算式等於
1)match
expr中的expr match $string substring命令在string字串中匹配substring字串(substring字串可以是Regex),然後返回匹配到的substring字串的長度,若找不到則返回0。
下面我們來個執行個體:
┌[--/ ::+][~-LTS- ╰_╯]$str=--/ ::+][~-LTS- ╰_╯]$ match .*
.*5匹配了6個字元。
2)substr
在shell中可以用{string:position}和{string:position:length}進行對string字串中字元的抽取。第一種是從position位置開始抽取直到字串結束,第二種是從position位置開始抽取長度為length的子串。而用expr中的expr substr $string $position $length同樣能實現上述功能。
執行個體:
┌[--/ ::+][~-LTS- ╰_╯]$str=--/ ::+][~-LTS- ╰_╯]$ ${str: --/ ::+][~-LTS- ╰_╯]$ ${str::--/ ::+][~-LTS- ╰_╯]$ substr
從中可以看出{string:position}和{string:position:length}從0開始計數,而expr substr $string $position $length從1開始。
3)index
expr中的expr index $string substring索引命令功能在字串$string上找出substring中字元第一次出現的位置,若找不到則expr index返回0。注意它匹配的是字元而非字串。
執行個體:
┌[--/ ::+][~-LTS- ╰_╯]$str=--/ ::+][~-LTS- ╰_╯]$ index --/ ::+][~-LTS- ╰_╯]$ index
4)length
計算字串的長度。我們可以用awk中的length(s)進行計算。我們也可以用echo中的echo ${#string}進行計算,當然也可以expr中的expr length $string 求出字串的長度。
┌[--/ ::+][~-LTS- ╰_╯]$str=--/ ::+][~-LTS- ╰_╯]$--/ ::+][~-LTS- ╰_╯]$ length
bc
重點來了!
bc是一種任意精度的計算語言,注意是一種語言,它提供了一些文法結構,比如條件判斷、迴圈等,可以說是很強大的,但是我在實際中還沒有找到需要這個用途的場合 。另外一個用途就是用來進行進位轉換。
上面我們介紹的expr之支援整數運算,但對於浮點運算就無能為力了,而且expr不能進行指數運算,而都有bc這些都不再話下。
參數
我們先來瞭解幾個有用的參數:
---q 進入bc互動模式時不再輸出版本等多餘的資訊。
特殊變數
ibase,obase 用於進位轉換,ibase是輸入的進位,obase是輸出的進位,預設是十進位;
scale 小數保留位元,預設保留0位。
互動模式
在shell命令列直接輸入bc及能進入bc語言的互動模式。
$bc -l -/ = /= ^ *a()
非互動模式
bc也可以進行非互動運算,方法是與echo一起使用。
┌[--/ ::+][~-LTS- ╰_╯]$ |bc --/ ::+][~-LTS- ╰_╯]$ |bc -l --/ ::+][~-LTS- ╰_╯]$ |bc --/ ::+][~-LTS- ╰_╯]$ |
更多參考man文檔!
dc
可能你曾經知道有此命令,也可能你還不知道。dc相比與bc要複雜,但是簡單操作還是比較簡單。簡單的說dc是一直壓棧操作,和bc一樣,它也可以互動使用,或者與echo一起配合使用。
它也支援浮點運算。
但是現在我還沒有想到這種壓棧式算術運算有什麼有點。
互動模式
┌[--/ ::+][~/-LTS---*-/-+*
還有其他命令如:
還有其它可以參考對應man文檔。
非互動模式
一個算式讓你就看的差不多了。
┌[--/ ::+][~/-LTS- ╰_╯]$ |
算式是:(4 * 3 + 2 - 1)。
是不是很簡單!
(( )) & [ ]
這兩個在shell中比較常見,這兩個和expr命令有些類似,也是用於整數計算。
他們支援的運算子號有如下:
|+ ||&+ &&< <= == != >= > + - * / %
帶+號的兩個運算子其實是shell支援的運算子。
這兩個對與expr的優點是:運算子號全部不需要轉義。
我們一味的在shell中用那些別人沒用過的命令來做同一件事,但不要忘了(( ))和[ ]是shell中常見的,而且非常實用,但並非是你常用的!
執行個體:
┌[--/ ::+][~/-LTS- ╰_╯]$ $(( + --/ ::+][~/-LTS- ╰_╯]$ $(( * --/ ::+][~/-LTS- ╰_╯]$ $(( - ---/ ::+][~/-LTS- ╰_╯]$ $(( % --/ ::+][~/-LTS- ╰_╯]$ $[ % --/ ::+][~/-LTS- ╰_╯]$ $[ - ---/ ::+][~/-LTS- ╰_╯]$ $[ * --/ ::+][~/-LTS- ╰_╯]$ $[ +