Se comparação de cadeia de instrução

3

Estou lendo um arquivo csv com 14 valores por linha. Quero converter o valor HEX do 10º valor [ f10 ] para um valor DEC. Para fazer isso if , o sétimo valor [ f7 ] deve conter EnHr ou EnSt ou SpJb ou Chem ou TrTm ou PmTm ou BrTm ou HyTm

Então, isso faz parte do meu código:

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

Além disso, quando imprimo echo -e "\t\t\t\t\tRAW VAL is $f10" , posso ver os valores HEX, mas na linha seguinte, o Val parece ser 0 em Dez

Esta é a saída que recebo até agora

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

Os valores Test 1-4 estão lá para que eu possa ver onde está o código. Apenas simples ecos não significados reais. Estas são as minhas preocupações:

Q1: Como posso eliminar (standard_in) 1: syntax error de onde vem?

Q2: Também a partir da saída, por que o valor hexadecimal de dados brutos não está sendo convertido em decimal?

    
por 3kstc 31.07.2015 / 06:37

3 respostas

4

POSIXly você pode obter o valor decimal de um número hexadecimal como:

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

E você realmente não precisa fazer todos esses [ tests ] . Eu acho que o seguinte deve funcionar:

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
    
por 31.07.2015 / 07:16
0

O padrão em erro vem de bc . Espera valores hexadecimais em maiúsculas. Então, em vez de 0019c4ef , você deve passar 0019C4EF .

A conversão de hex a dec pode ser feita usando sem bc também - veja esta resposta link

    
por 31.07.2015 / 06:50
0

Para ambas as perguntas, o erro veio de bc .

0019c4ef é um número hexadecimal inválido em bc , você precisa de 0019C4EF para um número hexadecimal válido:

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

Como você usou bash (também funciona em ksh , zsh , mksh , pdksh , posh ), é possível usar [base#]n em que base é um número decimal entre 2 e 64:

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

No seu caso, basta remover a linha de atribuição usando bc e editar a próxima linha:

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