comparação de cadeia hexadecimal DASH

2

Eu estou tentando comparar duas seqüências contendo números hexadecimais em um teste de traço, um que tem zeros à esquerda e outro que não:

hex_string_1: 0x02a0000b
hex_string_2: 0x2a0000b

Tentar if [ ${hex_string_1} -eq ${hex_string_2} ] ; then ... (ou vice-versa, os zeros à esquerda não parecem importar) me dá este erro:

[: Illegal number: 0x02a0000b

Existe uma maneira simples de comparar esses números, em vez de, por exemplo, usando sed para reformatar as strings?

Como estou usando dash e não bash , [[ não é uma opção.

UPDATE: Isso funcionou (obrigado ott!):

[ $(printf "%d" ${hex_string_1}) -eq $(printf "%d" ${hex_string_2}) ]
    
por chro 26.09.2015 / 20:56

2 respostas

3

POSIXly:

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

Com versões anteriores de dash , você precisava:

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

POSIXly, Sobre:

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

A especificação POSIX para a [ aka test utility diz que os operandos precisam ser inteiros, sem especificar quais formas de inteiros (decimal, octal, hexadecimal ...) devem ser suportadas, mas isso é realmente abordado no ponto 6 no Sintaxe do argumento do utilitário , que determina qual seria o padrão quando não especificado:

 6. Unless otherwise specified, whenever an operand or option-argument is, or contains, a numeric value:

  • The number is interpreted as a decimal integer.
  • Numerals in the range 0 to 2147483647 are syntactically recognized as numeric values.
  • When the utility description states that it accepts negative numbers as operands or option-arguments, numerals in the range -2147483647 to 2147483647 are syntactically recognized as numeric values.
  • Ranges greater than those listed here are allowed.

Na prática, [ 0x10 -eq 16 ] só funciona com posh ( [ 0x1 -eq 0x01 ] funciona em AT & T ksh (mas somente porque eles são tratados como 0 , [ 0x2 -eq 0x123 ] retornaria verdadeiro também) e com exceção de posh (onde está um bug ), todos [ implementações retornam false em [ 010 -eq 8 ] (como em 010 é tratado como decimal, não octal)).

Em ksh93 , enquanto você não pode fazer [ 0x10 -eq 16 ] , você pode fazer [ +0x10 -eq 16 ] (também com posh ). Em ambas as derivadas AT & T ksh e pdksh (incluindo posh ), você também pode fazer [ '16#10' -eq 16 ] .

    
por 26.09.2015 / 23:32
2

Você sempre pode usar printf para converter em decimal e comparar isso como @ ott-- sugerido:

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

Ou

if [ $(printf "%d" "$hex_string_1") -eq $(printf "%d" "$hex_string_2") ]
then
    echo y
fi
    
por 26.09.2015 / 21:04

Tags