SHELL腳本攻略(學習筆記)--1.6 數學運算和bc命令

来源:http://www.cnblogs.com/f-ck-need-u/archive/2017/07/25/7231870.html
-Advertisement-
Play Games

本文目錄: 1.6.1 基本整數運算 1.6.2 bc命令高級算術運算 使用let、$(())或$[]進行基本的整數運算,使用bc進行高級的運算,包括小數運算。其中expr命令也能進行整數運算,還能判斷參數是否為整數,具體用法見expr命令全解。 1.6.1 基本整數運算 [root@xuexi t ...



本文目錄:

1.6.1 基本整數運算

1.6.2 bc命令高級算術運算


使用let、$(())或$[]進行基本的整數運算,使用bc進行高級的運算,包括小數運算。其中expr命令也能進行整數運算,還能判斷參數是否為整數,具體用法見expr命令全解

1.6.1 基本整數運算

[root@xuexi tmp]# str=10
[root@xuexi tmp]# let str=str+6  # 等價於let str+=6
[root@xuexi tmp]# let str-=5     # 等價於let str=str-5
[root@xuexi tmp]# echo $str
11

如果想在命令行中做計算,則可以使用$(())或$[]。

[root@xuexi ~]# str=10
[root@xuexi ~]# echo $((str+=6))
16

[root@xuexi ~]# echo $[str=str-6]
10

當然,在為變數賦算術值的時候也可以使用$(())和$[]。

[root@xuexi ~]# str=10
[root@xuexi ~]# str=$((str+=6));echo $str
16

[root@xuexi ~]# str=$[str-=6];echo $str
10

其實,在算數計算過程中,等號右邊的變數是可以帶上$符號的,但等號左邊的變數不允許帶上$符號,因為它是要操作的變數,不是引用變數。例如:

[root@xuexi ~]# let str=$str-1         # 等價於let str=str-1
[root@xuexi ~]# str=$(($str-1))        # 等價於str=$((str-1))
[root@xuexi ~]# srt=$[$str-1]          # 等價於str=$[str-1]
[root@xuexi ~]# echo $((str=$str-1))  # 等價於echo $((str=str-1)),但不能寫成echo $(($str=str-1))
[root@xuexi ~]# echo $[str=$str-1]    # 等價於echo $[str=str-1],但不能寫成echo $[$str=str-1]

還可以自增、自減運算。"++"和"--"表示變數自動加1和減1。但是位置不同,返回的結果是不同的。

x++:先返回結果,再加1

++x:先加1再返回結果

x--:先返回結果,再減1

--x:先減1再返回結果

假如x的初始值為10,則echo $[x++]將顯示10,但在顯示完後(即返回結果之後),x的值已經變成了11,再執行echo $x將返回11。

[root@xuexi ~]# x=10;echo $((x++));echo $x
10
11

如果此時再echo $[x++]仍將返回11,但此時x已經是12了。

[root@xuexi ~]# echo $((x++));echo $x
11
12

再將x變數的初始值初始化為10,則echo $[++x]將顯示11,因為先加1後再賦值給x,echo再顯示x的值。++x完全等價於x=x+1,它們都是先加1後賦值。

[root@xuexi ~]# x=10;echo $((++x));echo $x
11
11

同理自減也是一樣的。

因此,在使用自增或自減進行變數賦值時,需要註意所賦的值是否加減立即生效的。例如:

[root@xuexi ~]# x=10;y=$((x++));echo $y;echo $y
10
10

因為y=$((x++))賦給y的值是加1前的值,雖然賦值結束後,$((x++))已經變成11,但這和y無關。

所以,對於自增自減類的變數賦值應該使用先計算再顯示的"++x"或"--x"的方式。

[root@xuexi ~]# x=10;y=$((++x));echo $y;echo $y
11
11

總結下數值變數的賦值運算的方法:

let i=i-1

let i=$i-1

let i-=1

i=$((i-1))

i=$(($i-1))

i=$[ i - 1 ]

i=$[ $i - 1 ]

echo $((i=i-1))

echo $((i=$i-1))

1.6.2 bc命令高級算術運算

bc可用於浮點數的計算,是linux中的計算器。

以下是一個基本的功能示例:

[root@node1 ~]# bc
b 1.06.95          # 首先輸出bc的版本信息,可以使用-q選項不輸出頭部信息
Copyright 1991-1994, 197, 1998, 2000, 2004, 2006 Free Software Foundation, Inc.
This is free software with ABSOLUTELY NO WARRANTY.
For details type `warranty'.
pie=3.1415   # 可以變數賦值
pie*3*3      # 運算時不需要空格
28.2735
r=3
pie*r*r
28.2735
pie*r^2      # 可以使用冪次方
28.2735
r=3 /* 將半徑設置為3 */  # 還可以使用C語言風格的註釋

輸入quit命令可以退出bc計算器。

還支持自增和自減的功能。

[root@node1 ~]# bc -q
r=3
r++
3
r++
4
++r
6
++r
7
--r
6

bc運算器有一個內建的變數scale,用於表示計算的精度,預設精度為0,所以除法運算的預設結果是整數。

13/(1+3)
3
scale=3
13/(1+3)
3.250

更人性化的功能是可以通過命令替換來實現批處理模式的計算。

它的一般格式參考如下:

var=`echo "option1;option2;...;expression"|bc`

其中options部分一般設置精度scale,和變數賦值,expression部分是計算表達式,最後將它們放在反引號中賦值給變數。如:

[root@node1 ~]# area=`echo "scale=2;r=3;3.1415*r*r"|bc`

[root@xuexi ~]# echo $area
28.2735

由於是在命令行中指定,所以這樣的使用方式限制較多。bc接受使用here string和here document的方式接收參數。最常做法是將它們放置於腳本中。

#!/bin/bash
# script for calculate something
 
var1=haha
var2=hehe
 
value=`bc<<EOF  # 在反引號中使用here string的方式
scale=3
r=3
3.1415*r*r
EOF`
echo $value

以下是計算1+2+...+10的幾種不同方式,要求輸出在屏幕上的結果為"1+2+3+4+5+6+7+8+9+10=計算結果",這是非常不錯的例子。

[root@node1 tmp]# echo $(seq -s "+" 10)=`seq -s "+" 10|bc`
1+2+3+4+5+6+7+8+9+10=55
[root@node1 tmp]# echo $(seq -s "+" 10)=$((`seq -s "+" 10`))
1+2+3+4+5+6+7+8+9+10=55
[root@node1 tmp]# echo $(seq -s "+" 10)=$(seq -s " + " 10|xargs expr)  # 註意"+"" + "
1+2+3+4+5+6+7+8+9+10=55

 

回到系列文章大綱:http://www.cnblogs.com/f-ck-need-u/p/7048359.html

轉載請註明出處:http://www.cnblogs.com/f-ck-need-u/p/7231870.html


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • Hadoop之HDFS 版權聲明:本文為yunshuxueyuan原創文章。如需轉載請標明出處: http://www.cnblogs.com/sxt-zkys/QQ技術交流群:299142667 HDFS介紹 HDFS(Hadoop Distributed File System )Hadoop分 ...
  • 搭建2個節點的hdfs,yarn集群。 namenode和secondarynamenode是分開的,其次rm和namenode位於不同節點。 ...
  • 以管理員的啟動cmd 進入安裝目錄下 輸入: mongod --auth --port 3406 --dbpath=庫地址 --logpath= 全地址 --install --serviceName "自定義名稱" 註:庫地址可只指定到文件夾,LOG地址需指定到具體文件 --auth 啟用權根控制 ...
  • 很多時候,大家都知道,浮點型這個東西,本身存儲就是一個不確定的數值,你永遠無法知道,它是 0 = 0.00000000000000123 還是 0 = 0.00000000000999這樣的東西。也許一開始使用的時候沒有問題,但是有時候做統計的時候,就會看出端倪 簡單的舉個例子,就知道統計的時候,有 ...
  • 一、MySQL數據類型 1.數值型 SMALLINT: 2個位元組 INT: 4個位元組 // age int(10) INTEGER:INT的同義詞 BIGINT : 8個位元組 FLOAT : 4個位元組 DOUBLE : 8個位元組 //score float(10,2) 2.字元串(字元)類型 CHA ...
  • 一、資料庫的基本概念 資料庫: 以一定方式儲存在一起、能為多個用戶共用、具有儘可能小的冗餘度的特點、是與應用程式彼此獨立的數據集合。 DBMS(DataBase Management System,資料庫管理系統)和資料庫。平時談到“資料庫”可能有兩種含義:MSSQLServer、Oracle等某種 ...
  • Jexus 即 Jexus Web Server,簡稱JWS,是Linux平臺上的一款ASP.NET WEB伺服器,是 Linux、Unix、FreeBSD 等非Windows系統架設 ASP.NET WEB 伺服器的核心程式,是企業級ASP.NET跨平臺部署的一種可選方案。與其它WEB伺服器相比, ...
  • gawk 程式是Unix中原始awk程式的GNU版本。gawk程式讓流編輯器邁上了一個新的臺階,它提供了一種編程語言而不只是編輯器命令。在gawk編程語言中,可以完成下麵的事情: (1)定義變數來保存數據; (2)使用算數和字元串操作符來處理數據; (3)使用結構化編程概念(比如if then語句和 ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...