如何在 sh 中进行十六进制转换

How can I get Hex conversion working in sh

我想让脚本 /bin/sh 兼容。在某些时候,我使用了一个十六进制变量的打印输出到它的十进制值,但它抛出了这个错误:

sh: 1: arithmetic expression: expecting EOF: "16#c0"

/bin/bash 执行脚本时不会出现该错误。我将其归结为以下问题:

$ sh -c 'echo $((16#c0))'     
sh: 1: arithmetic expression: expecting EOF: "16#c0"

$ sh -c "echo $((16#c0))"    
192

为什么会这样,我怎样才能让 echo 在我的脚本中工作?

编辑: 子外壳被重定向到 /bin/dash

$ readlink -f $(which sh)
/bin/dash
$ type sh
sh is /bin/sh

sh(通常 simlink 到 POSIX shell,如 dash)不支持 [base#]n 形式的算术评估,如 [=16] =]支持。

因此您需要使用带有您的十六进制数的 0x 前缀:

sh -c 'echo $((0xc0))'

sh -c 'printf "%d\n" 0xc0'

注意总是需要使用单引号,以免让当前shell解释双引号字符串的内容。

所以你尝试

sh -c "echo $((16#c0))"

看起来只是因为 $((16#c0))bash 解释并且 sh 执行的实际命令是 echo 192.