if语句字符串比较

if语句字符串比较

我正在读取一个 csv 文件,每行有 14 个值。我想将十六进制值从第 10 个 [ f10] 值转换为十进制值。为此,if第 7 个 [ f7] 值必须保持EnHror EnStor SpJbor Chemor TrTmor PmTmor BrTmor orHyTm

这是我的代码的一部分:

echo "Test 3 f7 is $f7"   

    if [ "$f7" == "EnHr" ] || [ "$f7" == "EnSt" ] || [ "$f7" == "SpJb" ] || [ "$f7" == "Chem" ] || [ "$f7" == "TrTm" ] || [ "$f7" == "PmTm" ] || [ "$f7" == "BrTm" ] || [ "$f7" == "HyTm" ]
        then
            echo -e "\t\t\t\t\tRAW VAL is $f10"   #print raw val
            f10=`echo "ibase=16; $f10" | bc`      #convert from HEX to Dec
            echo -e "\t\t\t\t\tinside the if loop\tSen: $f7\tVal: $f10" #reprint the converted value as DEC
            inside=$((inside+1))
    fi

此外,当我打印时,echo -e "\t\t\t\t\tRAW VAL is $f10"我可以看到十六进制值,但在下一行中,Dec 中的 Val 似乎为 0

这是我到目前为止得到的输出

Test 1             line count is 26
Test 2
Test 3 f7 is Chem
                                        RAW VAL is 0000
                                        inside the if loop      Sen: Chem       Val: 0
Test 4
Test 1             line count is 27
Test 2
Test 3 f7 is TrTm
                                        RAW VAL is 0019c4ef
(standard_in) 1: syntax error
                                        inside the if loop      Sen: TrTm       Val:
Test 4
Test 1             line count is 28
Test 2
Test 3 f7 is PmTm
                                        RAW VAL is 000b57bf
(standard_in) 1: syntax error
                                        inside the if loop      Sen: PmTm       Val:
Test 4
Test 1             line count is 29
Test 2
Test 3 f7 is BrTm
                                        RAW VAL is 00022d51
(standard_in) 1: syntax error
                                        inside the if loop      Sen: BrTm       Val:
Test 4
Test 1             line count is 30
Test 2
Test 3 f7 is HyTm
                                        RAW VAL is 00004ff9
(standard_in) 1: syntax error
                                        inside the if loop      Sen: HyTm       Val:
Test 4

这些Test 1-4值就在那里,所以我可以看到代码在哪里。只是简单的回声,没有实际意义。这些是我的担忧:

问题一:我怎样才能消除(standard_in) 1: syntax error它从哪里来?

问题2:另外,从输出来看,为什么原始数据十六进制值不转换为十进制?

答案1

POSIXly 你可以获得十六进制数的十进制值,例如:

hex=10
echo "$((0x$hex))"

16

你呢真的不需要做所有这些[测试]。我认为以下应该有效:

case $f7 in
(EnHr|EnSt|SpJb|Chem|[BT]rTm|PmTm|HyTm)
    printf "\t\t\t\t\t%s%b"       \
       "HEX VALUE is" ":\t$f10"   \
       '' "inside case loop.\t\t" \
       Sen ":\t$f7"               \
       Val ":\t$((!(inside+=1)|0x$f10))"
esac

答案2

错误的标准来自bc。它需要大写的十六进制值。所以0019c4ef你应该通过它0019C4EF

十六进制到十进制的转换也可以使用无需bc太完成 - 请参阅此答案https://stackoverflow.com/a/13280173/3935925

答案3

对于这两个问题,错误都来自bc.

0019c4ef是无效的BC 中的十六进制数,您需要0019C4EF一个有效的十六进制数:

echo "ibase=16; 0019C4EF" | bc
1688815

因为您使用过bash(也适用于ksh, zsh, mksh, pdksh, posh),所以您可以使用[base#]nwhere根据是 2 到 64 之间的十进制数:

$ echo "$((16#0019c4ef))"
1688815

在您的情况下,只需使用 删除分配行bc,然后编辑下一行:

echo -e "\t\t\t\t\tinside the if loop\tSen: $f7\tVal: " "$((16#$f10))"

相关内容