ダッシュテストでは、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 0x01
ksh
0
[ 0x2 -eq 0x123 ]
posh
抜け穴)、すべての[
実装はfalseを返します[ 010 -eq 8 ]
(たとえば、010
8進数ではなく10進数として扱われます)。
ではksh93
できませんが、[ 0x10 -eq 16 ]
できます[ +0x10 -eq 16 ]
(そして使用することもできますposh
)。 AT&Tksh
およびpdksh
デリバティブ(付属)posh
でも同じことができます[ '16#10' -eq 16 ]
。