比较Shell中的十六进制数

时间:2014-02-10 22:37:34

标签: linux bash comparison hex

我想将A.txt中每行的第一个元素与B.txt行的第一个元素进行比较,如果它们匹配打印那条A行。 A和B的第一行元素都是十六进制数,我根据https://askubuntu.com/questions/366879/awk-comparing-the-value-of-two-variables-in-two-different-files编写了以下代码。

#!/bin/bash
A="$HOME/A.txt"
B="$HOME/B.txt"

cat $A | while read a; do
a1=$(echo $a | awk ' { print $1 }')
    cat $B | while read b; do
        b1=$(echo $b | awk ' { print $1 }')
        if [ $a1 == $b1 ]; then
            echo $a
        fi
    done
done

这是我得到的: 第9行:[0x6200e001:找不到命令

2 个答案:

答案 0 :(得分:2)

如果代码中的[$a1之间没有空格,则会出现此问题。始终测试您发布的确切代码 - 不要认为您的干净版本会出现与实际代码相同的问题。

以下是如何重现它:

$ cat file
a1=0x6200e001
b1=$a1
[$a1 == $b1 ]

$ bash file
file.sh: line 3: [0x6200e001: command not found

$ shellcheck file

In file line 3:
[$a1 == $b1 ]
 ^-- SC1035: You need spaces after the opening [ and before the closing ].

修复方法是添加空格:

[ $a1 == $b1 ]

您应该最佳地引用变量以防止出现空格和圆形字符的问题:

[ "$a1" = "$b1" ]

答案 1 :(得分:2)

使用awk替换所有

#!/bin/bash

A="$HOME/A.txt"
B="$HOME/B.txt"

awk 'NR==FNR{a[$1];next} $1 in a' $B $A