在 shell 脚本中添加极大的数字

vol*_*619 8 shell bash arithmetic

假设两个数字存储在两个不同的文件中,a.txt并且b.txt.

每个数字都足够大(超过 30 位),不支持bash.

我如何将它们添加到 shell 中?

Sté*_*las 12

假设它们是十进制数,你可以这样做:

paste -d + a.txt b.txt | bc
Run Code Online (Sandbox Code Playgroud)

请注意bc换行非常长的数字(超过 68 或 69 位,具体取决于实现)。使用 GNU bc,您可以通过将BC_LINE_LENGTH环境变量设置为 0来禁用它,例如:

paste -d + a.txt b.txt | BC_LINE_LENGTH=0 bc
Run Code Online (Sandbox Code Playgroud)


Kus*_*nda 10

诀窍是不要bash用来执行加法1。

首先,将每个数字读入一个单独的变量。这假设文件只包含一个数字而没有其他信息。

a="$(<a.txt)"
b="$(<b.txt)"
Run Code Online (Sandbox Code Playgroud)

然后用bc计算器得到结果:

bc <<<"$a + $b"
Run Code Online (Sandbox Code Playgroud)

bc 是一种“任意精度算术语言和计算器”。

将结果存储在变量中c:

c="$( bc <<<"$a + $b" )"
Run Code Online (Sandbox Code Playgroud)

如果<<<语法感觉很奇怪(它被称为“here-string”并且是对 POSIX shell 语法bash和其他一些shell 支持的扩展),您可以改为使用printf将添加内容发送到bc:

printf '%s + %s\n' "$a" "$b" | bc
Run Code Online (Sandbox Code Playgroud)

并c再次存储结果:

c="$( printf '%s + %s\n' "$a" "$b" | bc )"
Run Code Online (Sandbox Code Playgroud)

1 使用bash执行增加了两个非常大的数字将需要执行,在bash脚本,做例行的高精度计算。这是完全可行的,但既麻烦又不必要,因为每个 Unix 都bc已经以相对容易和可访问的方式为您提供此服务。

  • @BryceGuinta 因为与`echo "\"hello\""` 不同,`$(...)` 中的东西不是作为参数传递给另一个程序的字符串,shell 知道如何处理引号的嵌套。这也是为什么使用 `$(...)` 而不是反引号更好的原因;你可以毫无歧义地写出`$( ... $( ... ) )`,而同样的事情使用反引号是......尴尬。 (2认同)