我试图在破折号测试中比较两个包含十六进制数字的字符串,一个有前导零,另一个没有:
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&Tksh
和pdksh
衍生品(包括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