bc command

昨天在工作中遇到这么一个问题, 在shell中比较浮点数和整数的大小. 原本以为用shell的比较符号(-lt之类的)就可以, 没想到一试不行.
问了度娘后才发现, shell原则上是不支持浮点数计算的.
因为着急用, 就随便找了个帖子说可以这么比:

expr $a \> $b

我没test就直接先push到公司的repo了, reviewer估计也没用过, 看了下就merge了.
今天跑脚本才发现根本就不能这么用啊, holy shit. 最后找到了bc这个神器, 问了下度娘, 都没什么好文章. 索性就直接上官网看manual.
好了, 废话说了一大堆, 现在来说说bc吧:)

首先, bc可以是交互性的, 也支持在管道符后面使用.
所以一些复杂的有关浮点数的运算, 完全可以结合expect脚本, 个人感觉会很方便. 如果用awk算, 估计会吐...
像我昨天遇到的普通运算完全就可以用管道啦.
一般来说在脚本中可以这么用:

a=$(bc << EOF
  28.3 * 55.8
  EOF)

bc可以说totally就是一门语言. 有变量, 有逻辑控制, 亦有函数.

基本元素

  • 数字
    最基本的元素, 可以是整数也可以是浮点数. manual里说支持任意精度, 注意这任意两字, 有没有碉堡了.
  • 变量
    变量可以是简单变量, 也可以是数组. 变量的命名以任意字母开头, 中间可以是任意数字/字母/下划线. 但有一点需要注意, 字母必须都是小写.
    数组是用方括号表示.
    有四个特殊的变量: scale, ibase, obase和last. scale表示小数点后位数, ibase和obase表示input和output是什么进制的, 我们这里不做说明, 有兴趣的同学可以直接看manual. last表示最后一个打印的数值.
  • 注释
    多行注释: /* ...... */
    单行注释: #

支持的运算

加减乘除/乘方/地板除/自加/自减

摘自manual:
- expr
The result is the negation of the expression.
++ var
The variable is incremented by one and the new value is the result of the expression.
-- var
The variable is decremented by one and the new value is the result of the expression.
var ++
The result of the expression is the value of the variable and then the variable is incremented by one.

var --
The result of the expression is the value of the variable and then the variable is decremented by one.
expr + expr
The result of the expression is the sum of the two expressions.
expr - expr
The result of the expression is the difference of the two expressions.
expr * expr
The result of the expression is the product of the two expressions.
expr / expr
The result of the expression is the quotient of the two expressions. The scale of the result is the value of the variable scale
expr % expr
The result of the expression is the "remainder" and it is computed in the following way. To compute a%b, first a/b is computed to scale
digits. That result is used to compute a-(a/b)*b to the scale of the maximum of scale
+scale(b) and scale(a). If scale
is set to zero and both expressions are integers this expression is the integer remainder function.
expr ^ expr
The result of the expression is the value of the first raised to the second. The second expression must be an integer. (If the second expression is not an integer, a warning is generated and the expression is truncated to get an integer value.) The scale of the result is scale
if the exponent is negative. If the exponent is positive the scale of the result is the minimum of the scale of the first expression times the value of the exponent and the maximum of scale
and the scale of the first expression. (e.g. scale(a^b) = min(scale(a)*b, max(scale
, scale(a))).) It should be noted that expr^0 will always return the value of 1.
( expr )
This alters the standard precedence to force the evaluation of the expression.
var = expr
The variable is assigned the value of the expression.
var <op>= expr
This is equivalent to "var = var <op> expr" with the exception that the "var" part is evaluated only once. This can make a difference if "var" > is an array.

比较符

>, <, <=, >=, ==, !=

语句

  • if语句:
    if ( expression ) { statement1 } [else { statement2 }]
  • while语句:
    while ( expression ) { statement }
  • for语句:
    for ( [expression1] ; [expression2] ; [expression3] ) { statement }
    所有循环语句里都支持continue和break

函数

define name ( parameters ) { newline
auto_list statement_list }
例如:

define d (n) { return (2*n); }

还有几个内置的函数用来计算三角函数, 这里我就不说了, 感兴趣就仔细看下manual中相应的部分.

我这里写一个非常简单的例子供参考:

define square (x) {
return x ^ 2;
}
a = 3
for (i=1; i<10; i++) {
a += 1
}
square(a)
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 203,547评论 6 477
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 85,399评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 150,428评论 0 337
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,599评论 1 274
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,612评论 5 365
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,577评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,941评论 3 395
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,603评论 0 258
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,852评论 1 297
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,605评论 2 321
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,693评论 1 329
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,375评论 4 318
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,955评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,936评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,172评论 1 259
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 43,970评论 2 349
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,414评论 2 342

推荐阅读更多精彩内容

  • **2014真题Directions:Read the following text. Choose the be...
    又是夜半惊坐起阅读 9,355评论 0 23
  • 2017.10.30 星期一 天气晴 今晚是爸爸陪刘馨逸写作业,因为妹妹感冒了,其实刘馨逸也...
    馨逸馨诺妈妈阅读 236评论 0 0
  • 十一点三十分 说晚不晚的时间 也许已有人进入梦乡 也许也有人正挣扎着入睡 此时,六个人的宿舍早已熄灯 唯有几点亮光...
    吴拾阅读 412评论 1 0
  • 三月六日“我”的占有欲 弃绝世俗或自我牺牲并不是值得被赞美和仿效的伟大精神。我们总想占有一些东西,因为缺少了这些东...
    17grow阅读 243评论 0 2
  • 微风吹过陆淼淼的面颊,撩起她一丝丝青丝,这风似乎有些许的魔力,在这个燥热的夏日,让人不自觉的心平静起来,此时...
    XZ梓阅读 276评论 0 0