DASH 十六进制字符串比较

DASH 十六进制字符串比较

我试图在破折号测试中比较两个包含十六进制数字的字符串,一个有前导零,另一个没有:

hex_string_1: 0x02a0000b
hex_string_2: 0x2a0000b

尝试if [ ${hex_string_1} -eq ${hex_string_2} ] ; then ...(反之亦然,前导零似乎并不重要)给了我这个错误:

[: Illegal number: 0x02a0000b

有没有一种简单的方法可以将它们作为数字进行比较,而不是使用sed例如重新格式化字符串?

因为我正在使用dash而不是bash[[所以不是一个选择。

更新:这有效(谢谢奥特!):

[ $(printf "%d" ${hex_string_1}) -eq $(printf "%d" ${hex_string_2}) ]

答案1

POSIXly:

[ "$((hex_string_1))" -eq "$((hex_string_2))" ]

使用旧版本的dash,您需要:

[ "$(($hex_string_1))" -eq "$(($hex_string_2))" ]

POSIXly,关于:

[ "$hex_string_1" -eq "$hex_string_2" ]

[akatest实用程序的 POSIX 规范说操作数必须是整数,但没有指定支持哪种形式的整数(十进制、八进制、十六进制...),但这实际上在第 6 点中有所介绍。实用程序参数语法其中规定了未指定时的默认值:

 6. 除非另有说明,只要操作数或选项参数是或包含数值:

  • 该数字被解释为十进制整数。
  • 0 到 2147483647 范围内的数字在语法上被识别为数值。
  • 当实用程序描述声明它接受负数作为操作数或选项参数时,-2147483647 到 2147483647 范围内的数字在语法上将被识别为数值。
  • 允许的范围大于此处列出的范围。

实际上,[ 0x10 -eq 16 ]仅适用于posh( [ 0x1 -eq 0x01] 在 AT&T 中有效ksh(但只是因为它们被视为0,[ 0x2 -eq 0x123 ]也会返回 true),并且除了posh(在哪里漏洞),所有[实现都返回 false [ 010 -eq 8 ](如 in010被视为十进制,而不是八进制))。

在 中ksh93,虽然你不能做[ 0x10 -eq 16 ],但你可以做[ +0x10 -eq 16 ](​​也可以使用posh)。在 AT&Tkshpdksh衍生品(包括posh)中,您也可以这样做[ '16#10' -eq 16 ]

答案2

您始终可以使用printf转换为十进制并按照 @ott-- 建议进行比较:

[ $(printf "%d" "$hex_string_1") -eq $(printf "%d" "$hex_string_2") ] && echo y

或者

if [ $(printf "%d" "$hex_string_1") -eq $(printf "%d" "$hex_string_2") ]
then
    echo y
fi

相关内容