与bc bash的力量的力量

mon*_*ser 4 math bash bc

我想计算一下:

0x0404cb * 2**(8*(0x1b - 3))
Run Code Online (Sandbox Code Playgroud)

以十进制表示的是:

263371*2^^(8*(27-3))
Run Code Online (Sandbox Code Playgroud)

使用| bc.

我试过了

echo 263371*2^^(8*(27-3)) | bc
expr 263371*2^^(8*(27-3)) | bc
zsh: no matches found: 263371*2^^(8*(27-3))
Run Code Online (Sandbox Code Playgroud)

或尝试解决此问题

238348 * 2^176^
Run Code Online (Sandbox Code Playgroud)

我可以一次解决吗?

Ben*_* W. 8

bc"权力"运营商是^.您还必须引用所有内容以防止shell尝试执行历史替换和路径名扩展或将括号解释为子shell这样的操作:

$ bc <<< '263371*2^(8*(27-3))'
1653206561150525499452195696179626311675293455763937233695932416
Run Code Online (Sandbox Code Playgroud)

如果要从头开始处理初始表达式,可以使用ibase特殊变量将输入设置为十六进制并执行一些额外处理:

eqn='0x0404cb * 2**(8*(0x1b - 3))'

# Replace "**" with "^"
eqn=${eqn//\*\*/^}

# Remove all "0x" prefixes
eqn=${eqn//0x}

# Set ibase to 16 and uppercase the equation
bc <<< "ibase = 16; ${eqn^^}"
Run Code Online (Sandbox Code Playgroud)

或者,而不是使用参数扩展,使用(GNU)sed更紧凑,更易读:

sed 's/\*\*/^/g;s/0x//g;s/.*/\U&/;s/^/ibase = 16; /' <<< "$eqn" | bc
Run Code Online (Sandbox Code Playgroud)

  • 十六进制数也可以转换为十进制`bc <<<'ibase = 16; x = 404CB; y = 1B; ibase = 10; x*2 ^(8*(y-3))'` (2认同)
  • @NahuelFouilleul好点.由于`8`在二进制和十进制中是相同的,我们可以将`ibase`设置为16并将输出保留为十进制,我将添加它. (2认同)