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 sed
untuk memformat ulang string?
Karena saya menggunakan dash
dan tidak bash
, [[
bukan merupakan pilihan.
UPDATE: Ini berfungsi (terima kasih ott!):
[ $(printf "%d" ${hex_string_1}) -eq $(printf "%d" ${hex_string_2}) ]
-eq
hanya diizinkan untuk apa yang diterima shell sebagai integer. Konversikan nilai dengan `iv1 = $ (printf"% d \ n "0x ...), lalu bandingkan.Jawaban:
POSIXly:
Dengan versi yang lebih lama
dash
, Anda perlu:POSIXly, Tentang:
The spesifikasi POSIX untuk
[
aliastest
utilitas 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:Dalam praktiknya,
[ 0x10 -eq 16 ]
hanya bekerja denganposh
([ 0x1 -eq 0x01
] bekerja di AT&Tksh
(tetapi hanya karena mereka diperlakukan sebagai0
,[ 0x2 -eq 0x123 ]
akan mengembalikan true juga), dan kecuali untukposh
(di mana bug itu ), semua[
implementasi mengembalikan false pada[ 010 -eq 8 ]
(seperti dalam010
diperlakukan sebagai desimal , bukan oktal)).Dalam
ksh93
, sementara Anda tidak bisa melakukannya[ 0x10 -eq 16 ]
, Anda bisa melakukannya[ +0x10 -eq 16 ]
(juga denganposh
). Baik dalam AT&Tksh
maupunpdksh
derivatif (termasukposh
), Anda juga dapat melakukannya[ '16#10' -eq 16 ]
.sumber
test
memang memperlakukan0x10
,020
dan16
sebagai berpasangan-eq
. ATT ksh, mksh, dasbor, bash, zsh, BusyBox dan uji GNU semua memperlakukan020
sebagai-eq
untuk20
.Anda selalu dapat menggunakan
printf
untuk mengonversi menjadi desimal dan membandingkannya dengan @ ott-- yang disarankan:Atau
sumber