如何在bc中禁用换行符?

时间:2015-07-30 19:22:16

标签: bash line-breaks bc

有没有办法禁用bc将长数字拆分为多行的功能,例如用于控制小数位的scale变量?当然,我可以使用sed,但有bc种做法吗? http://www.gnu.org/software/bc/manual/html_mono/bc.html处的手册页仅指出每行的最大字符数为70。

以下是分割号码的示例:

bc -l <<< "scale = 100; a(1) * 4"
3.141592653589793238462643383279502884197169399375105820974944592307\
8164062862089986280348253421170676

2 个答案:

答案 0 :(得分:3)

online bc man page与“环境变量”下的内容不符;我的版本(v1.06.95)日期为2006-06-11的手册页声称你可以设置BC_LINE_LENGTH = 0来禁用换行符,作为GNU特定的扩展名:

  

BC_LINE_LENGTH

     

这应该是一个整数,指定数字输出行中的字符数。这包括长数字的反斜杠和换行符。作为扩展,零值禁用多线功能。此变量的任何其他值小于3会将行长度设置为70。

您可以将BC_LINE_LENGTH设置为shell中的环境变量,或者在调用bc之前将其设置为内联:

BC_LINE_LENGTH=0 bc -l <<< "scale = 100; a(1) * 4"

后记:经过一番调查后,虽然gnu.org的最新版本是v1.06,日期为2000-11-15,与上面发布的文档相符,但{{3}托管在alpha.gnu.org上。这些较新的版本包含BC_LINE_LENGTH = 0功能。

请参阅2004年创建并于2007年发布的new upstream versions (v1.06.94 and v1.06.95)(!)添加此扩展程序以及Debian-specific bug report and patch。看来这应该在Debian和Ubuntu的现代版本中可用,但可能不会出现在其他发行版中。

在较早的实现中,选择一个任意大数字(BC_LINE_LENGTH=5000)可能会让你到达目的地。

答案 1 :(得分:2)

您可以使用read不带通常推荐的-r标志)将值作为一条不间断的行抓取。

$ read pi <<< "$(bc -l <<< "scale = 100; a(1) * 4")"
$ echo $pi
3.1415926535897932384626433832795028841971693993751058209749445923078164062862089986280348253421170676

read pi < <(bc -l <<< "scale = 100; a(1) * 4))

(当然,这不是bc,但它比调用sed更有效。)