如何在 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
.
我想让脚本 /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
.