十六进制比较bash脚本

时间:2016-10-21 02:48:22

标签: linux bash shell scripting fedora

当我读取文本文件中每行的第3个字(十六进制字符串)并将其与十六进制数字进行比较时,我遇到了一些问题。有人可以帮我吧。

#!/bin/bash
A=$1

cat $A | while read a; do
a1=$(echo \""$a"\" | awk '{ print $3 }')
#echo $a > cut -d " " -f 3
echo $a1
(("$a1" == 0x10F7))
echo $?
done

但是当我在下面使用时,比较正确,

a1= 0xADCAFE
(( "$a1" == 0x10F7 ))
echo $?

那么为什么当我在下面阅读时显示问题,

a1=$(echo \""$a"\" | awk '{ print $3 }')
or> a1=$(echo $a | awk '{ print $3 }')

echo $a打印预期的十六进制值,但不会进行比较。

此致

2 个答案:

答案 0 :(得分:2)

awk '$3 == 4343' "$1" 循环中运行Awk是一个反模式。只需在Awk中循环;它很擅长。

"0x10F7"

如果您要与价值为awk '$3 == "0x10F7"' "$1" 的字符串进行比较,那么

awk '$3 ~ /^(0x10[Ff]7|4343)$/' "$1"

如果你想匹配,不区分大小写等,正则表达式是一种很好的方法。

$1

注意shell如何处理双引号中的$3,并在Awk运行之前被脚本的第一个命令行参数的(正确引用!)副本替换,而awk单引号中的脚本有自己的命名空间,因此$a是一个Awk变量,它引用当前输入行中的第三个字段。

无论哪种方式,请避免useless use of cat始终始终引用包含双引号文件名的变量。

这是双字引号。您似乎尝试了一个危险的裸"\"$a\""和双重引用的"$a",其中简单的FIFO_ELEM_AT(p_fifo, index) ((uint8_t*) ((uint8_t*) p_fifo->elem_array) + (p_fifo->elem_size) * (index)) 将是您真正想要的。

答案 1 :(得分:1)

感谢大家的回复,现在我的脚本运行正常。我试图匹配两个文件,下面的脚本做的目的

org.apache.spark.mllib.classification.LogisticRegressionModel cannot be cast to java.lang.String