bash比较多列的数值

bash比较多列的数值,bash,Bash,我有一个变量,它输出两列: 回显“$SIZE\u到\u插座” 我的gloal基本上是比较这两个数字并打印一个按摩 例如:如果他们匹配:成功:A(256)与B(256)相等 或错误:A(256)不是euqal到B(256),如果有,则数字不是euqal 我的代码是: while IFS= read -r i;do SIZE=$(echo "$i"|awk '{print $2}') SOCKET=$(echo "$i"|awk '{print $1}')

我有一个变量,它输出两列: 回显“$SIZE\u到\u插座”

我的gloal基本上是比较这两个数字并打印一个按摩

例如:如果他们匹配:成功:A(256)与B(256)相等

或错误:A(256)不是euqal到B(256),如果有,则数字不是euqal

我的代码是:

while IFS= read -r i;do
        SIZE=$(echo "$i"|awk '{print $2}')
        SOCKET=$(echo "$i"|awk '{print $1}')
        if [[ "$SOCKET" = "A" ]] ; then
                SOCKET_A="$SIZE"
        elif [[ "$SOCKET" = "B" ]] ; then
               SOCKET_B="$SIZE"
        fi

        if [[ $SOCKET_A -ne $SOCKET_B]];then
            echo "error: SOCKET_A is not equal to SOCKET_B"
        elif [[ $SOCKET_A -eq $SOCKET_B]];then
            cho "success: SOCKET_A is  equal to SOCKET_B"
        fi
done <<< "$SIZE_TO_SOCKET"
而IFS=read-ri;做
大小=$(回显“$i”| awk'{print$2}')
套接字=$(回显“$i”| awk'{print$1}')
如果[“$SOCKET”=“A”];然后
插座A=“$SIZE”
elif[“$SOCKET”=“B”];然后
插座B=“$SIZE”
fi
如果[$SOCKET_A-ne$SOCKET_B]];然后
echo“错误:套接字A不等于套接字B”
elif[$SOCKET_A-eq$SOCKET_B]];然后
cho“成功:插座A等于插座B”
fi
完成
用您的输入替换
input
变量,此脚本输出

success: A(256) is equal to B(256)
对于两个相同的数字或

error: A(257) is not equal to B(256)

对于两个不同的数字。

这是我得到的非常简单的解决方案:

line1=$(echo "$SIZE_TO_SOCKET" | awk 'NR == 1')
line2=$(echo "$SIZE_TO_SOCKET" | awk 'NR == 2')

key1=$(echo "$line1" | cut -d ' ' -f 1)
value1=$(echo "$line1" | cut -d ' ' -f 2)

key2=$(echo "$line2" | cut -d ' ' -f 1)
value2=$(echo "$line2" | cut -d ' ' -f 2)

if [[ $value1 -eq $value2 ]]; then
    echo "Success: $key1($value1) is equal to $key2($value2)"
else
    echo "Error: $key1($value1) is not equal to $key2($value2)" 
fi

您的代码有什么问题?:

您的代码“更正”为:

SIZE_TO_SOCKET=$(printf '41203235360a42203235360a' | xxd -p -r)

while IFS= read -r i;do
        SIZE=$(echo "$i"|awk '{print $2}')
        SOCKET=$(echo "$i"|awk '{print $1}')
        if [[ "$SOCKET" = "A" ]] ; then
                SOCKET_A="$SIZE"
        elif [[ "$SOCKET" = "B" ]] ; then
               SOCKET_B="$SIZE"
        fi

        if [[ $SOCKET_A -ne $SOCKET_B ]] ; then
                echo "error: SOCKET_A is not equal to SOCKET_B"
        elif [[ $SOCKET_A -eq $SOCKET_B ]] ; then
                echo "success: SOCKET_A is  equal to SOCKET_B"
        fi  
done <<< "$SIZE_TO_SOCKET"
如果使用bash-x脚本
,您将得到:

++ printf 41203235360a42203235360a
++ xxd -p -r
+ SIZE_TO_SOCKET='A 256
B 256'
+ IFS=
+ read -r i
++ echo 'A 256'
++ awk '{print $2}'
+ SIZE=256
++ echo 'A 256'
++ awk '{print $1}'
+ SOCKET=A
+ [[ A = \A ]]
+ SOCKET_A=256
+ [[ 256 -ne '' ]]
+ echo 'error: SOCKET_A is not equal to SOCKET_B'
error: SOCKET_A is not equal to SOCKET_B
+ IFS=
+ read -r i
++ echo 'B 256'
++ awk '{print $2}'
+ SIZE=256
++ echo 'B 256'
++ awk '{print $1}'
+ SOCKET=B
+ [[ B = \A ]]
+ [[ B = \B ]]
+ SOCKET_B=256
+ [[ 256 -ne 256 ]]
+ [[ 256 -eq 256 ]]
+ echo 'success: SOCKET_A is  equal to SOCKET_B'
success: SOCKET_A is  equal to SOCKET_B
+ IFS=
+ read -r i
++ printf 41203235360a42203235360a
++ xxd -p -r
+ SIZE_TO_SOCKET='A 256
B 256'
+ IFS=
+ read -r i
++ echo 'A 256'
++ awk '{print $2}'
+ SIZE=256
++ echo 'A 256'
++ awk '{print $1}'
+ SOCKET=A
+ [[ A = \A ]]
+ SOCKET_A=256
+ IFS=
+ read -r i
++ echo 'B 256'
++ awk '{print $2}'
+ SIZE=256
++ echo 'B 256'
++ awk '{print $1}'
+ SOCKET=B
+ [[ B = \A ]]
+ [[ B = \B ]]
+ SOCKET_B=256
+ IFS=
+ read -r i
+ [[ 256 -ne 256 ]]
+ [[ 256 -eq 256 ]]
+ echo 'success: SOCKET_A is  equal to SOCKET_B'
success: SOCKET_A is  equal to SOCKET_B
仔细阅读;你的逻辑有错误

这可能是您的代码的更正版本:

SIZE_TO_SOCKET=$(printf '41203235360a42203235360a' | xxd -p -r)

while IFS= read -r i;do
        SIZE=$(echo "$i"|awk '{print $2}')
        SOCKET=$(echo "$i"|awk '{print $1}')
        if [[ "$SOCKET" = "A" ]] ; then
                SOCKET_A="$SIZE"
        elif [[ "$SOCKET" = "B" ]] ; then
               SOCKET_B="$SIZE"
        fi
done <<< "$SIZE_TO_SOCKET"

if [[ $SOCKET_A -ne $SOCKET_B ]] ; then
        echo "error: SOCKET_A is not equal to SOCKET_B"
elif [[ $SOCKET_A -eq $SOCKET_B ]] ; then
        echo "success: SOCKET_A is  equal to SOCKET_B"
fi
如果您使用
bash-x您的脚本
,您将得到:

++ printf 41203235360a42203235360a
++ xxd -p -r
+ SIZE_TO_SOCKET='A 256
B 256'
+ IFS=
+ read -r i
++ echo 'A 256'
++ awk '{print $2}'
+ SIZE=256
++ echo 'A 256'
++ awk '{print $1}'
+ SOCKET=A
+ [[ A = \A ]]
+ SOCKET_A=256
+ [[ 256 -ne '' ]]
+ echo 'error: SOCKET_A is not equal to SOCKET_B'
error: SOCKET_A is not equal to SOCKET_B
+ IFS=
+ read -r i
++ echo 'B 256'
++ awk '{print $2}'
+ SIZE=256
++ echo 'B 256'
++ awk '{print $1}'
+ SOCKET=B
+ [[ B = \A ]]
+ [[ B = \B ]]
+ SOCKET_B=256
+ [[ 256 -ne 256 ]]
+ [[ 256 -eq 256 ]]
+ echo 'success: SOCKET_A is  equal to SOCKET_B'
success: SOCKET_A is  equal to SOCKET_B
+ IFS=
+ read -r i
++ printf 41203235360a42203235360a
++ xxd -p -r
+ SIZE_TO_SOCKET='A 256
B 256'
+ IFS=
+ read -r i
++ echo 'A 256'
++ awk '{print $2}'
+ SIZE=256
++ echo 'A 256'
++ awk '{print $1}'
+ SOCKET=A
+ [[ A = \A ]]
+ SOCKET_A=256
+ IFS=
+ read -r i
++ echo 'B 256'
++ awk '{print $2}'
+ SIZE=256
++ echo 'B 256'
++ awk '{print $1}'
+ SOCKET=B
+ [[ B = \A ]]
+ [[ B = \B ]]
+ SOCKET_B=256
+ IFS=
+ read -r i
+ [[ 256 -ne 256 ]]
+ [[ 256 -eq 256 ]]
+ echo 'success: SOCKET_A is  equal to SOCKET_B'
success: SOCKET_A is  equal to SOCKET_B

您在最后一个
elif
中有一个输入错误:is echo;使用:
bash-x VALID\u PATH\u运行脚本,以查看bash实际比较的内容
success: SOCKET_A is  equal to SOCKET_B
++ printf 41203235360a42203235360a
++ xxd -p -r
+ SIZE_TO_SOCKET='A 256
B 256'
+ IFS=
+ read -r i
++ echo 'A 256'
++ awk '{print $2}'
+ SIZE=256
++ echo 'A 256'
++ awk '{print $1}'
+ SOCKET=A
+ [[ A = \A ]]
+ SOCKET_A=256
+ IFS=
+ read -r i
++ echo 'B 256'
++ awk '{print $2}'
+ SIZE=256
++ echo 'B 256'
++ awk '{print $1}'
+ SOCKET=B
+ [[ B = \A ]]
+ [[ B = \B ]]
+ SOCKET_B=256
+ IFS=
+ read -r i
+ [[ 256 -ne 256 ]]
+ [[ 256 -eq 256 ]]
+ echo 'success: SOCKET_A is  equal to SOCKET_B'
success: SOCKET_A is  equal to SOCKET_B