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