DASH 16進文字列の比較

DASH 16進文字列の比較

ダッシュテストでは、16進数を含む2つの文字列(1つは前に0があり、もう1つは前に0がない)を比較しようとします。

hex_string_1: 0x02a0000b
hex_string_2: 0x2a0000b

試してif [ ${hex_string_1} -eq ${hex_string_2} ] ; then ...みると(またはその逆の場合、前にゼロが重要ではないようです)、次のエラーが発生しました。

[: Illegal number: 0x02a0000b

sedたとえば、文字列形式を再指定するのではなく、数値で比較する簡単な方法はありますか?

dash代わりに使用しているので、bashこれは[[オプションではありません。

アップデート:うまくいきます(Ottに感謝します!):

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

ベストアンサー1

POSIX的に:

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

以前のバージョンを使用するには、次の手順を実行するdash必要があります。

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

POSIXでは、次のようになります。

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

これ[ユーティリティtestのPOSIX仕様オペランドは整数でなければならないと示していますが、サポートされている整数形式(10進数、8進数、16進数...)は指定しませんが、実際には6番目の項目で扱います。ユーティリティパラメータの構文指定しない場合はデフォルト値を指定します。

 6. 特に明記しない限り、オペランドまたはオプション引数が数値または数値を含む場合は、

  • 数値は10進数として解釈されます。
  • 0から2147483647の範囲の数値は構文上の数値として認識されます。
  • ユーティリティの説明がオペランドまたはオプション引数として負の数を受け入れると指定されている場合、-2147483647から2147483647までの数値は構文上の数値として認識されます。
  • 許容範囲は、ここに記載されている範囲よりも大きい。

実際に AT&T では ( )[ 0x10 -eq 16 ]だけ有効です (しかし とみなされて true を返すので ) 。posh[ 0x1 -eq 0x01ksh0[ 0x2 -eq 0x123 ]posh抜け穴)、すべての[実装はfalseを返します[ 010 -eq 8 ](たとえば、0108進数ではなく10進数として扱われます)。

ではksh93できませんが、[ 0x10 -eq 16 ]できます[ +0x10 -eq 16 ](そして使用することもできますposh)。 AT&Tkshおよびpdkshデリバティブ(付属)poshでも同じことができます[ '16#10' -eq 16 ]

おすすめ記事