Perbandingan string heksadesimal DASH

2

Saya mencoba untuk membandingkan dua string yang berisi angka heksadesimal dalam tes dasbor, satu yang memiliki nol di depan dan satu yang tidak:

hex_string_1: 0x02a0000b
hex_string_2: 0x2a0000b

Mencoba if [ ${hex_string_1} -eq ${hex_string_2} ] ; then ...(atau sebaliknya, nol terkemuka sepertinya tidak penting) memberi saya kesalahan ini:

[: Illegal number: 0x02a0000b

Apakah ada cara sederhana untuk membandingkan ini sebagai angka, daripada misalnya menggunakan seduntuk memformat ulang string?

Karena saya menggunakan dashdan tidak bash, [[bukan merupakan pilihan.

UPDATE: Ini berfungsi (terima kasih ott!):

[ $(printf "%d" ${hex_string_1}) -eq $(printf "%d" ${hex_string_2}) ]
chro
sumber
Mengapa tidak melakukan perbandingan string saja? Apakah Anda benar-benar membutuhkan perbandingan aritmatika jika Anda hanya menguji kesetaraan?
terdon
-eqhanya diizinkan untuk apa yang diterima shell sebagai integer. Konversikan nilai dengan `iv1 = $ (printf"% d \ n "0x ...), lalu bandingkan.
ott--
Harap jangan perbarui pertanyaan Anda dengan jawaban, yaitu informasi yang bukan milik di sana dan bukan cara kerja situs ini. Anda harus meminta ott untuk membuat komentarnya menjadi jawaban, atau menjadikannya sendiri sebagai jawaban dan kemudian menerimanya. Dengan begitu jelas masalah ini terpecahkan, karena sekarang ini tidak kecuali Anda tidak terganggu oleh konten seperti UPDATE dan terima kasih khas untuk posting berkualitas rendah
Anthon

Jawaban:

3

POSIXly:

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

Dengan versi yang lebih lama dash, Anda perlu:

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

POSIXly, Tentang:

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

The spesifikasi POSIX untuk [alias testutilitas mengatakan operan harus bilangan bulat, tanpa menentukan yang bentuk bilangan bulat (desimal, oktal, heksadesimal ...) yang harus didukung, tapi itu benar-benar tertutup butir 6 di Utilitas Argumen Sintaks yang menyatakan apa standarnya adalah ketika tidak ditentukan:

 6. Kecuali ditentukan lain, setiap kali operan atau opsi-argumen, atau mengandung, nilai numerik:

  • Angka tersebut ditafsirkan sebagai bilangan bulat desimal.
  • Angka dalam kisaran 0 hingga 2147483647 secara sintaksis dikenali sebagai nilai numerik.
  • Ketika deskripsi utilitas menyatakan bahwa ia menerima angka negatif sebagai operan atau argumen opsi, angka dalam rentang -2147483647 hingga 2147483647 secara sintaksis dikenali sebagai nilai numerik.
  • Kisaran lebih besar dari yang tercantum di sini diizinkan.

Dalam praktiknya, [ 0x10 -eq 16 ]hanya bekerja dengan posh( [ 0x1 -eq 0x01] bekerja di AT&T ksh(tetapi hanya karena mereka diperlakukan sebagai 0, [ 0x2 -eq 0x123 ]akan mengembalikan true juga), dan kecuali untuk posh(di mana bug itu ), semua [implementasi mengembalikan false pada [ 010 -eq 8 ](seperti dalam 010diperlakukan sebagai desimal , bukan oktal)).

Dalam ksh93, sementara Anda tidak bisa melakukannya [ 0x10 -eq 16 ], Anda bisa melakukannya [ +0x10 -eq 16 ](juga dengan posh). Baik dalam AT&T kshmaupun pdkshderivatif (termasuk posh), Anda juga dapat melakukannya [ '16#10' -eq 16 ].

Stéphane Chazelas
sumber
Posh testmemang memperlakukan 0x10, 020dan 16sebagai berpasangan -eq. ATT ksh, mksh, dasbor, bash, zsh, BusyBox dan uji GNU semua memperlakukan 020sebagai -equntuk 20.
Gilles
2

Anda selalu dapat menggunakan printfuntuk mengonversi menjadi desimal dan membandingkannya dengan @ ott-- yang disarankan:

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

Atau

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