【问题标题】:How to disable line breaks in bc?如何禁用 bc 中的换行符?
【发布时间】:2015-10-22 07:36:23
【问题描述】:

有没有办法禁用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

【问题讨论】:

  • 你也可以用 shell 来做,f=$(bc ...); echo "${f/$'\\\\\n'/}" 只是为了记录。

标签: bash line-breaks bc


【解决方案1】:

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

BC_LINE_LENGTH

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

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

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

结语:经过一番调查,似乎 gnu.org 的最新版本是 v1.06,日期为 2000-11-15 并且与上面发布的文档相匹配,但在 alpha 上托管了 new upstream versions (v1.06.94 and v1.06.95) .gnu.org。这些较新的版本包含 BC_LINE_LENGTH=0 功能。

请参阅 2004 年创建并于 2007 年发布的 Debian-specific bug report and patch(!)添加了此扩展,以及 Debian's bc changelog。看起来这应该在现代版本的 Debian 和 Ubuntu 中可用,但可能不会出现在其他发行版中。

在较旧的实现中,选择一个任意大的数字 (BC_LINE_LENGTH=5000) 可能会将您带到您想去的地方。

【讨论】:

  • 谢谢,它有效:export BC_LINE_LENGTH=0; bc -l &lt;&lt;&lt; "scale = 100; a(1) * 4"
【解决方案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更有效率。)

【讨论】:

  • 太棒了!非常简单易记,谢谢!
猜你喜欢
  • 2017-10-15
  • 2021-04-21
  • 2020-04-16
  • 1970-01-01
  • 1970-01-01
  • 2013-04-29
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多