1. 程式人生 > >shell指令碼中的數值運算

shell指令碼中的數值運算

shell中的變數沒有如c語言中字元型、整型、浮點型的區分,預設將變數賦值當做字元,怎樣才能讓shell將變數賦值當做數值型呢,答案是用$ 和[], []包含的數學算式可以被shell正確識別。

例1:

[[email protected] ~]# cat  test.sh

#!/bin/bash
var1=100
var2=200
var3=$[$var1+$var2]
echo $var3

[[email protected] ~]# sh test.sh

300

這樣是不是實現我們想要的結果了呢,其實shell中還提供了一個數學運算的命令 expr(evaluate expression),他可以進行加減乘除還有比較運算,不過很可惜的是不支援浮點型運算。還有一個缺陷就是expr命令中的運算子可能會有其他含義如*,必須要使用反斜槓進行轉義,這讓人很不爽。不過不用擔心,有問題就會有聰明的人來解決的,一個功能強大的計算器可以供我們在shell中使用,這就是bc。可以檢視man手冊來了解關於它的詳細用法。這裡僅介紹一下bc在shell中的呼叫。bc是一個外部命令,要在shell使用的話我們要使用反引號

以把結果賦給變數。

例2:
[[email protected] ~]# cat  test2.sh
#!/bin/bash
var1=`echo "scale=4;10/3"|bc`
echo $var1
[[email protected] ~]# sh test2.sh
3.3333



看一下它是如何工作的,首先我們要把數學表示式傳遞給bc,很簡單我們通過管道完成。你也看到了表示式裡面不只有表示式還有個scale,它使用來設定小數位數,不過為什麼跟運算結果不符呢,如上所示,應該有四位小數,(有待解決)。轉向正題,有了bc以後,變得方便了很多。可是還是有些不太令人滿意的地方,對於每一個運算表示式都要通過管道傳參的方式似乎有些繁瑣,我們可以使用內建重定向的方法,內建重定向允許從命令列直接重定向資料,在shell指令碼中,使用如下方式
varible=`bc <<EOF
options
statements
expressions
EOF
`

EOF用來表明資料的開始和結束,需要注意的是同樣需要使用反引號將結果賦給變數。expressions中可以使用bc內部變數和shell中的變數,bc內部變數只在bc內部有效。不能用於shell指令碼中。運算表示式中引用shell變數需加$引用符,bc內部變數不加$.

bc的功能遠不止以上所述,詳細用法請參考man手冊。


相關推薦

shell指令碼數值運算

shell中的變數沒有如c語言中字元型、整型、浮點型的區分,預設將變數賦值當做字元,怎樣才能讓shell將變數賦值當做數值型呢,答案是用$ 和[], []包含的數學算式可以被shell正確識別。 例1: [[email protected] ~]# cat  

shell指令碼如何處理浮點運算

bash中不能處理浮點運算 let只能處理整數運算 要想處理浮點運算,可以藉助bc 或者 awk #!/bin/bash num="0.5" num1="6" #sacle用於控制小數點後出現的位數 tmp=$(echo "scale=2;$n

shell指令碼使用if和bc比較變數值和指定值

【預備知識】 假如我有個日誌檔案,每天會往裡追加。日誌摘要如下—— 2018-06-12 09:08:56,105 - hdfs.client - INFO - Renaming ‘/apps/wps_prt_feature/business_info/20

shell指令碼的數學運算,重定向,alias

1. 整數運算:#!/bin/bashnum1=4num2=5let result1=num1+num2echo $result1let num1++let num2--result2=$[ num1 + num2 ]result3=$[ $num1 + 10 ]echo $

shell指令碼的for迴圈和while迴圈

基礎for迴圈有三種:         ①直接寫-------例如:for  i   in  1,2,3,4(注:i 是變數; in是在什麼地方;do和done之間是迴圈體)         &n

學習Linux shell指令碼連線字串的方法

這篇文章主要介紹了Linux shell指令碼中連線字串的方法,如果想要在變數後面新增一個字元,可以用一下方法: 程式碼如下: $value1=home $value2=${value1}"=" echo $value2 把要新增的字串變數新增{},並且需要把$放到外面。 這樣輸出的結果

shell指令碼$的用處

1.$0 獲取當前執行的shell指令碼的檔名,包括路徑。[[email protected] ~]# vi test.sh[[email protected] ~]# cat test.shecho $0[[email protected] ~]# sh test.shtest

shell指令碼關於getopts的使用方法

例子: while getopts ":e:s:pd:l" arg; do   case $arg in   e)        ghs_env=$OPTARG       ;;   s)  

Shell 指令碼的檔名匹配和命令執行

理解下 shell 指令碼中的檔名匹配和命令執行的順序與結果。我們學習這個的目的是可以熟悉的在 shell 指令碼中寫出快速的找到檔案的命令。它可以匹配檔名中的任何字串,匹配檔名中的單個字元以及匹配檔名中的字母或數字符號。         首先我們來看看匹配檔案的符號

Shell 指令碼執行mysql語句

分享一下我老師大神的人工智慧教程!零基礎,通俗易懂!http://blog.csdn.net/jiangjunshow 也歡迎大家轉載本篇文章。分享知識,造福人民,實現我們中華民族偉大復興!        

Linux/Unix shell 指令碼呼叫SQL RMAN指令碼

分享一下我老師大神的人工智慧教程!零基礎,通俗易懂!http://blog.csdn.net/jiangjunshow 也歡迎大家轉載本篇文章。分享知識,造福人民,實現我們中華民族偉大復興!        

shell指令碼的函式與子shell

shell指令碼中的函式與子shell 原文https://www.jianshu.com/p/7db79d7997b5 函式 函式的使用 bash中也有函式。一個函式就是一個子程式,是用於實現一串操作的程式碼塊。bash中的函式的形式如下: functi

Shell指令碼併發執行緒以及併發數的控制

http://blog.chinaunix.net/uid-8478094-id-3995108.html Shell指令碼中併發執行緒以及併發數的控制 主要記錄一下Shell指令碼中的命令的併發和序列執行。 預設的情況下,Shell指令碼中的命令是序列執行的,必須等到前一條命令

shell指令碼向hive動態分割槽插入資料

  set hive.exec.dynamic.partition=true;                     #開啟動態分割槽,預設是falseset hive.exec.dyn

shell 指令碼獲取命令的輸出

這個主要介紹的方法是獲取命令的輸出內容,而不是命令執行成功與否的返回值。 通常情況下,在shell指令碼中需要獲取命令的輸出內容,然後根據輸出內容判斷下一步的執行操作。 比較常用的一種方式就是, 匹配命令輸出的內容中是否存在某些關鍵字,選擇執行的不同動作。 比較常用的一種方式就是

shell指令碼的讀檔案(while read line)與寫檔案(here document)

shell指令碼中如何讀取外部檔案並進行相關操作呢?正規化如下,是要背滴: while read line; do process $line done < file 如何在寫中將內容寫入新檔案呢,要用到here document,一種特殊的重定向技術,小范式如下,也

shell指令碼計算時間差

1. 獲取開始、結束時間(獲取當前時間) timer_start=`date "+%Y-%m-%d %H:%M:%S"` timer_end=`date "+%Y-%m-%d %H:%M:%S"` 2. 計算時間差 duration=`echo eval $(($(date

shell指令碼case select 的使用

#!/bin/bash # case echo "1.Install PHP" echo "2.Install Mysql" echo "3.Install Nginx" read -p "please input your digit:" digit case "$digit" in

shell指令碼字串比較和數字比較和檔案測試

(1) 字串比較: 作用:測試字串是否相等,長度是否為零,字串是否為NULL。 常用的字串比較符號如下。 =:比較兩個字串是否相同,相同則為“是”。 !=:比較兩個字串是否相同,不同則為“是”。 -n:比較字串的長度是否大於0,如果大於0則為“是”。 -z:比較字串的長度是否等於

shell 指令碼set -e選項作用範圍

        編寫shell指令碼沒多久,對於其許多命令的具體用法還不太熟悉。最近剛好有需求,就嘗試用指令碼去實現。其中就有用到set -e選項。         在用這個命令之前,也查過其功能,描述比較簡單:就是當命令以非零狀態退出時,則退出shell。主要作用是,當指令