如何在shell中比较十六进制数和十六进制数?

时间:2012-11-21 19:41:29

标签: bash shell

如何在shell中比较十六进制数和十六进制数?

4 个答案:

答案 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答案仅适用于不超过0x7fffffffffffffffLLONG_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