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