歡迎光臨
每天分享高質量文章

Linux 命令列下的數學運算 | Linux 中國

有幾個有趣的命令可以在 Linux 系統下做數學運算: expr、factor、jot 和 bc 命令。
— Sandra Henry-stocker


致謝
編譯自 | https://www.networkworld.com/article/3268964/linux/how-to-do-math-on-the-linux-command-line.html 
 作者 | Sandra Henry-stocker
 譯者 | Andy Song (pinewall) ? ? 共計翻譯:7 篇 貢獻時間:49 天

有幾個有趣的命令可以在 Linux 系統下做數學運算: exprfactorjot 和 bc 命令。

可以在 Linux 命令列下做數學運算嗎?當然可以!事實上,有不少命令可以輕鬆完成這些操作,其中一些甚至讓你大吃一驚。讓我們來學習這些有用的數學運算命令或命令語法吧。

expr

首先,對於在命令列使用命令進行數學運算,可能最容易想到、最常用的命令就是 expr運算式expression。它可以完成四則運算,也可以用於比較大小。下麵是幾個例子:

變數遞增

  1. $ count=0

  2. $ count=`expr $count + 1`

  3. $ echo $count

  4. 1

完成簡單運算

  1. $ expr 11 + 123

  2. 134

  3. $ expr 134 / 11

  4. 12

  5. $ expr 134 - 11

  6. 123

  7. $ expr 11 * 123

  8. expr: syntax error      <== oops!

  9. $ expr 11 \* 123

  10. 1353

  11. $ expr 20 % 3

  12. 2

註意,你需要在 * 運運算元之前增加 \ 符號,避免語法錯誤。% 運運算元用於取餘運算。

下麵是一個稍微複雜的例子:

  1. participants=11

  2. total=156

  3. share=`expr $total / $participants`

  4. remaining=`expr $total - $participants \* $share`

  5. echo $share

  6. 14

  7. echo $remaining

  8. 2

假設某個活動中有 11 位參與者,需要頒發的獎項總數為 156,那麼平均每個參與者獲得 14 項獎項,額外剩餘 2 個獎項。

比較

下麵讓我們看一下比較的操作。從第一印象來看,陳述句看似有些怪異;這裡並不是設定數值,而是進行數字比較。在本例中 expr 判斷運算式是否為真:如果結果是 1,那麼運算式為真;反之,運算式為假。

  1. $ expr 11 = 11

  2. 1

  3. $ expr 11 = 12

  4. 0

請讀作“11 是否等於 11?”及“11 是否等於 12?”,你很快就會習慣這種寫法。當然,我們不會在命令列上執行上述比較,可能的比較是 $age 是否等於 11

  1. $ age=11

  2. $ expr $age = 11

  3. 1

如果將數字放到引號中間,那麼你將進行字串比較,而不是數值比較。

  1. $ expr "11" = "11"

  2. 1

  3. $ expr "eleven" = "11"

  4. 0

在本例中,我們判斷 10 是否大於 5,以及是否大於 99。

  1. $ expr 10 \> 5

  2. 1

  3. $ expr 10 \> 99

  4. 0

的確,傳回 1 和 0 分別代表比較的結果為真和假,我們一般預期在 Linux 上得到這個結果。在下麵的例子中,按照上述邏輯使用 expr 並不正確,因為 if 的工作原理剛好相反,即 0 代表真。

  1. #!/bin/bash

  2. echo -n "Cost to us> "

  3. read cost

  4. echo -n "Price we're asking> "

  5. read price

  6. if [ `expr $price \> $cost` ]; then

  7. echo "We make money"

  8. else

  9. echo "Don't sell it"

  10. fi

下麵,我們執行這個指令碼:

  1. $ ./checkPrice

  2. Cost to us> 11.50

  3. Price we're asking> 6

  4. We make money

這顯然與我們預期不符!我們稍微修改一下,以便使其按我們預期工作:

  1. #!/bin/bash

  2. echo -n "Cost to us> "

  3. read cost

  4. echo -n "Price we're asking> "

  5. read price

  6. if [ `expr $price \> $cost` == 1 ]; then

  7. echo "We make money"

  8. else

  9. echo "Don't sell it"

  10. fi

factor

factor 命令的功能基本與你預期相符。你給出一個數字,該命令會給出對應數字的因子。

  1. $ factor 111

  2. 111: 3 37

  3. $ factor 134

  4. 134: 2 67

  5. $ factor 17894

  6. 17894: 2 23 389

  7. $ factor 1987

  8. 1987: 1987

註:factor 命令對於最後一個數字沒有傳回更多因子,這是因為 1987 是一個質數

jot

jot 命令可以建立一系列數字。給定數字總數及起始數字即可。

  1. $ jot 8 10

  2. 10

  3. 11

  4. 12

  5. 13

  6. 14

  7. 15

  8. 16

  9. 17

你也可以用如下方式使用 jot,這裡我們要求遞減至數字 2。

  1. $ jot 8 10 2

  2. 10

  3. 9

  4. 8

  5. 7

  6. 5

  7. 4

  8. 3

  9. 2

jot 可以幫你構造一系列數字組成的串列,該串列可以用於其它任務。

  1. $ for i in `jot 7 17`; do echo April $i; done

  2. April 17

  3. April 18

  4. April 19

  5. April 20

  6. April 21

  7. April 22

  8. April 23

bc

bc 基本上是命令列數學運算最佳工具之一。輸入你想執行的運算,使用管道傳送至該命令即可:

  1. $ echo "123.4+5/6-(7.89*1.234)" | bc

  2. 113.664

可見 bc 並沒有忽略精度,而且輸入的字串也相當直截了當。它還可以進行大小比較、處理布林值、計算平方根、正弦、餘弦和正切等。

  1. $ echo "sqrt(256)" | bc

  2. 16

  3. $ echo "s(90)" | bc -l

  4. .89399666360055789051

事實上,bc 甚至可以計算 pi。你需要指定需要的精度。

  1. $ echo "scale=5; 4*a(1)" | bc -l

  2. 3.14156

  3. $ echo "scale=10; 4*a(1)" | bc -l

  4. 3.1415926532

  5. $ echo "scale=20; 4*a(1)" | bc -l

  6. 3.14159265358979323844

  7. $ echo "scale=40; 4*a(1)" | bc -l

  8. 3.1415926535897932384626433832795028841968

除了透過管道接收資料並傳回結果,bc還可以互動式執行,輸入你想執行的運算即可。本例中提到的 scale 設定可以指定有效數字的個數。

  1. $ bc

  2. bc 1.06.95

  3. Copyright 1991-1994, 1997, 1998, 2000, 2004, 2006 Free Software Foundation, Inc.

  4. This is free software with ABSOLUTELY NO WARRANTY.

  5. For details type `warranty'.

  6. scale=2

  7. 3/4

  8. .75

  9. 2/3

  10. .66

  11. quit

你還可以使用 bc 完成數字進位制轉換。obase 用於設定輸出的數字進位制。

  1. $ bc

  2. bc 1.06.95

  3. Copyright 1991-1994, 1997, 1998, 2000, 2004, 2006 Free Software Foundation, Inc.

  4. This is free software with ABSOLUTELY NO WARRANTY.

  5. For details type `warranty'.

  6. obase=16

  7. 16      <=== entered

  8. 10      <=== response

  9. 256     <=== entered

  10. 100     <=== response

  11. quit

按如下方式使用 bc 也是完成十六進位制與十進位制轉換的最簡單方式之一:

  1. $ echo "ibase=16; F2" | bc

  2. 242

  3. $ echo "obase=16; 242" | bc

  4. F2

在上面第一個例子中,我們將輸入進位制(ibase)設定為十六進位制(hex),完成十六進位制到為十進位制的轉換。在第二個例子中,我們執行相反的操作,即將輸出進位制(obase)設定為十六進位制。

簡單的 bash 數學運算

透過使用雙括號,我們可以在 bash 中完成簡單的數學運算。在下麵的例子中,我們建立一個變數,為變數賦值,然後依次執行加法、自減和平方。

  1. $ ((e=11))

  2. $ (( e = e + 7 ))

  3. $ echo $e

  4. 18

  5. $ ((e--))

  6. $ echo $e

  7. 17

  8. $ ((e=e**2))

  9. $ echo $e

  10. 289

允許使用的運運算元包括:

  1. + -     加法及減法

  2. ++ --   自增與自減

  3. * / %   乘法、除法及求餘數

  4. ^       指數運算

你還可以使用邏輯運運算元和布林運運算元:

  1. $ ((x=11)); ((y=7))

  2. $ if (( x > y )); then

  3. > echo "x > y"

  4. > fi

  5. x > y

  6. $ ((x=11)); ((y=7)); ((z=3))

  7. $ if (( x > y )) >> (( y > z )); then

  8. > echo "letters roll downhill"

  9. > fi

  10. letters roll downhill

或者如下方式:

  1. $ if [ x > y ] << [ y > z ]; then echo "letters roll downhill"; fi

  2. letters roll downhill

下麵計算 2 的 3 次冪:

  1. $ echo "2 ^ 3"

  2. 2 ^ 3

  3. $ echo "2 ^ 3" | bc

  4. 8

總結

在 Linux 系統中,有很多不同的命令列工具可以完成數字運算。希望你在讀完本文之後,能掌握一兩個新工具。


via: https://www.networkworld.com/article/3268964/linux/how-to-do-math-on-the-linux-command-line.html

作者:Sandra Henry-Stocker[2] 選題:lujun9972 譯者:pinewall 校對:wxy

本文由 LCTT 原創編譯,Linux中國 榮譽推出

贊(0)

分享創造快樂

© 2024 知識星球   網站地圖