Linux/unix不同shell环境下数值运算的处理
生活随笔
收集整理的這篇文章主要介紹了
Linux/unix不同shell环境下数值运算的处理
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
在閱讀本文前,您需要對變量替換、命令替換和數值替換有一點認識。 閱讀完本文,您應該獲得解決下列問題的信息: 不同shell(bash,csh,ksh)下如何處理數值的運算
常用來數值運算的命令
關于運算結果精確到幾位小數點的問題 運算方式一:
$[] 適用范圍:只適用于bash,而sh(如solaris的默認shell)、ksh(如IBM AIX的默認shell)、csh都不支持。 注意我們要計算10+2*((3+1)*(5-1)/2)
需要機變一下,通過這種方式
echo $[10+2*$[$[3+1]*$[5-1]/2]]
注意中間不能有空格否則就會被錯誤解析。 [附注] 運算方式五:關于進制的處理 關于進制:表達和使用不同的進制。數字可以表達為二進制數、十進制數和十六進制數等等,范圍從2進制~36進制。
?
我們用下面的形式實現:
$ echo $[8#17]
15
$ echo $[16#b]
11 實際中我們甚至可以計算7進制的一個數6543210的值表示的10進制是多少。
echo $[7#6543210] 注意上面的操作只是bash上的小技巧,ksh和csh都不支持。 運算方式二:
(()) 適用范圍:只適用于bash和ksh,不支持csh。 ((sum=10+2*((((3+1))*((5-1))/2))));echo $sum; 運算方式三:
expr命令
適用范圍:包括bash、ksh、csh、sh的大部分shell,但有一點要特別注意就是一定要轉義shell環境下的特殊字符。 要特別注意:
必須對表達式 (Expression) 參數應用以下規則
用空格隔開每個項;
用 (反斜杠)放在 shell 需要轉義的字符前;
對包含空格和其他特殊字符的字符串 (字符參與運算) 要用引號括起來; expr ( 10 + 2 * ( ( 3 + 1 ) * ( 5 - 1 ) / 2 ) )
通用的做法是:"(" ")" "|" "!" 和 "*" ">" "<"都需要轉義。 更多信息請查看其幫助,man expr 運算方式四:
awk命令 適用范圍:這種方法是一種機變吧,適用于所有系統中包含了awk命令的shell環境,而且支持的數字函數也很多。 使用awk,由于awk的命令內部使用的是類C的,所以也不用考慮括號會被識別為其它子程序的情況。
awk 'BEGIN{sum=10+2*((3+1)*(5-1)/2)} END{print sum}' /dev/null
至于awk都支持哪些數學函數,歡迎大家參照我后續的文章。 運算方式六:關于小數的處理
bc命令 適用范圍:包括bash、ksh、csh、sh的大部分shell。 也許大家都注意到了,上面提到的方式除了使用awk命令以外,運算結果都是被四舍五入過的整數值,但是實際中精確地保留一定位數的小數也很必要,這時我們就要用到bc這個數學工具了。 如果要熟練地使用bc,不只要對bc命令有一定的了解,對于命令替換(Command Substitution)、命令重定向(Input? Redirect & Output? Redirect)也要有清晰的認識。 對于bc命令
$ bc
scale=4?#計算結果保留到小數點后四位
10/2?
5.0000
obase=16?#計算的結果以十六進制表達
ibase=10?#輸入的數值被識別為十進制
10/2
5.000
17/2
8.800
scale=0?#運算結果為整數
17/2
8
quit 這樣我們就可以通過bc命令來計算10+2*((3+1)*(5-1)/2)的值了,并且讓計算結果精確到小數點后的四位。
# echo `echo "scale=4;10+2*((3+1)*(5-1)/2)" | bc `
26.0000
本文轉自xiaoyuwang 51CTO博客,原文鏈接:http://blog.51cto.com/wangxiaoyu/197658,如需轉載請自行聯系原作者
$[] 適用范圍:只適用于bash,而sh(如solaris的默認shell)、ksh(如IBM AIX的默認shell)、csh都不支持。 注意我們要計算10+2*((3+1)*(5-1)/2)
需要機變一下,通過這種方式
echo $[10+2*$[$[3+1]*$[5-1]/2]]
注意中間不能有空格否則就會被錯誤解析。 [附注] 運算方式五:關于進制的處理 關于進制:表達和使用不同的進制。數字可以表達為二進制數、十進制數和十六進制數等等,范圍從2進制~36進制。
?
我們用下面的形式實現:
$ echo $[8#17]
15
$ echo $[16#b]
11 實際中我們甚至可以計算7進制的一個數6543210的值表示的10進制是多少。
echo $[7#6543210] 注意上面的操作只是bash上的小技巧,ksh和csh都不支持。 運算方式二:
(()) 適用范圍:只適用于bash和ksh,不支持csh。 ((sum=10+2*((((3+1))*((5-1))/2))));echo $sum; 運算方式三:
expr命令
適用范圍:包括bash、ksh、csh、sh的大部分shell,但有一點要特別注意就是一定要轉義shell環境下的特殊字符。 要特別注意:
必須對表達式 (Expression) 參數應用以下規則
用空格隔開每個項;
用 (反斜杠)放在 shell 需要轉義的字符前;
對包含空格和其他特殊字符的字符串 (字符參與運算) 要用引號括起來; expr ( 10 + 2 * ( ( 3 + 1 ) * ( 5 - 1 ) / 2 ) )
通用的做法是:"(" ")" "|" "!" 和 "*" ">" "<"都需要轉義。 更多信息請查看其幫助,man expr 運算方式四:
awk命令 適用范圍:這種方法是一種機變吧,適用于所有系統中包含了awk命令的shell環境,而且支持的數字函數也很多。 使用awk,由于awk的命令內部使用的是類C的,所以也不用考慮括號會被識別為其它子程序的情況。
awk 'BEGIN{sum=10+2*((3+1)*(5-1)/2)} END{print sum}' /dev/null
至于awk都支持哪些數學函數,歡迎大家參照我后續的文章。 運算方式六:關于小數的處理
bc命令 適用范圍:包括bash、ksh、csh、sh的大部分shell。 也許大家都注意到了,上面提到的方式除了使用awk命令以外,運算結果都是被四舍五入過的整數值,但是實際中精確地保留一定位數的小數也很必要,這時我們就要用到bc這個數學工具了。 如果要熟練地使用bc,不只要對bc命令有一定的了解,對于命令替換(Command Substitution)、命令重定向(Input? Redirect & Output? Redirect)也要有清晰的認識。 對于bc命令
$ bc
scale=4?#計算結果保留到小數點后四位
10/2?
5.0000
obase=16?#計算的結果以十六進制表達
ibase=10?#輸入的數值被識別為十進制
10/2
5.000
17/2
8.800
scale=0?#運算結果為整數
17/2
8
quit 這樣我們就可以通過bc命令來計算10+2*((3+1)*(5-1)/2)的值了,并且讓計算結果精確到小數點后的四位。
# echo `echo "scale=4;10+2*((3+1)*(5-1)/2)" | bc `
26.0000
本文轉自xiaoyuwang 51CTO博客,原文鏈接:http://blog.51cto.com/wangxiaoyu/197658,如需轉載請自行聯系原作者
總結
以上是生活随笔為你收集整理的Linux/unix不同shell环境下数值运算的处理的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 【BZOJ】1725: [Usaco20
- 下一篇: VMware Converter P2V