如何在shell中比较十六进制数和十六进制数?
答案 0 :(得分:6)
至少bash
直接支持十六进制整数,只要它们以0x
为前缀:
$ [[ 0xdead -lt 0xcafe ]] && echo yes || echo no
no
$ [[ 0xdead -gt 0xcafe ]] && echo yes || echo no
yes
您只需正常使用比较运算符......
答案 1 :(得分:1)
怎么样
(( "$answer" == 0x42 ))
echo $?
answer=0xDEADCAFE
(( "$answer" == 0xDEADCAFE ))
echo $?
答案 2 :(得分:0)
实际上@thkala答案仅适用于不超过0x7fffffffffffffff
(LLONG_MAX
)的数字:
$ [[ 0xa000000000000000 -lt 0x6000000000000000 ]] && echo -1
-1
$ [[ 0xa00000000000000 -lt 0x600000000000000 ]] && echo -1 || echo 1
1
对于大于LLONG_MAX
的数字,您可以使用gdb
,但当然会慢一点:
function cmp()
{
gdb -ex "p ${1}ULL == ${2}ULL ? 0 : (${1}ULL < ${2}ULL ? -1 : 1)" -batch |& grep '^$1' | cut -d' ' -f3
}
$ cmp 0xa000000000000000 0x6000000000000000
1
$ cmp 0xa00000000000000 0x600000000000000
1
答案 3 :(得分:0)
您可以使用printf
将十六进制数字转换为小数,然后可以比较数字值,例如:
x="0xdead"
y="0xcafe"
x_num=$(printf "%d" "$x")
y_num=$(printf "%d" "$y")
if [ $x_num -gt $y_num ]; then
echo "x is my value"
else
echo "x is not my value"
fi