linux - bash 脚本中的十六进制比较

标签 linux bash shell scripting fedora

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

#!/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 打印预期的十六进制值,但不会进行比较。

问候,

最佳答案

while read 循环中运行 Awk 是一种反模式。只需在 Awk 中执行循环即可;它擅长于此。

awk '$3 == 4343' "$1"

如果你想比较一个值为"0x10F7"的字符串,那么它是

awk '$3 == "0x10F7"' "$1"

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

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

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

无论哪种方式,都要避免 useless use of cat总是总是总是引用包含带双引号的文件名的变量。

这是字面上的双引号。您似乎已经尝试过危险的裸 $a 和双引号 "\"$a\"" ,其中简单的 "$a" 将是您真正想要的。

关于linux - bash 脚本中的十六进制比较,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40167575/

相关文章:

linux - 如何以编程方式防止 Linux 文件系统上的文件在有限时间内被编辑

mysql - 在 Bash 中声明变量?

linux - 如何在我的应用程序的目录树中使源位置独立?

c++ - 使用 `backticks` 而不是 Pipe | 读取值C++

linux - Bash 检查文件是否存在,然后检查文件中的子字符串

c++ - 无法在 gnu linux c++ 中写入 ostream 错误 : invalid operands of types ofstream and ‘const char [2]’ to binary ‘operator

linux - 使用 NFQUEUE 的 TCP 数据包处理

bash - 是否可以逐行调试 bash 脚本?

python - 将 bash 指向安装在 Windows 上的 python

shell - wget错误会破坏shell脚本-如何防止这种情况?