Linux-shell-算術運算{expr、bc、dc、(( ))和[ ]}

來源:互聯網
上載者:User

在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- ╰_╯]$ $[  + 

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.