if 문 문자열 비교

if 문 문자열 비교

행당 14개의 값이 포함된 csv 파일을 읽고 있습니다. 10번째 [ ] 값을 16진수 값으로 변환하고 싶습니다 f10. 이를 위해서는 if7번째 [ f7] 값을 그대로 유지해야 합니다. 또는 EnHr또는 EnSt또는 SpJb또는 Chem또는 TrTm또는 PmTm또는BrTmHyTm

이것은 내 코드의 일부입니다.

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"hex 값이 나오는데 다음 줄에는 12월의 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이 바로 거기에 있어서 코드가 어디에 있는지 알 수 있어요. 실제 의미가 없는 단순한 메아리일 뿐입니다. 내 우려사항은 다음과 같습니다.

질문 1:(standard_in) 1: syntax error그것이 어디서 오는지 어떻게 제거할 수 있습니까 ?

질문 2:그리고 출력을 보면 원시 데이터의 16진수 값이 10진수로 변환되지 않는 이유는 무엇입니까?

답변1

POSIXly에서는 16진수의 10진수 값을 얻을 수 있습니다. 예를 들면 다음과 같습니다.

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. 대문자 16진수 값이 필요합니다. 그래서 0019c4ef당신은 그것을 통과해야합니다 0019C4EF.

bc너무 많은 완료 없이 16진수에서 10진수로의 변환을 사용할 수도 있습니다 . 이 답변을 참조하세요.https://stackoverflow.com/a/13280173/3935925

답변3

두 질문 모두 오류는 에서 발생합니다 bc.

0019c4ef그것은 유효하지 않다BC의 16진수0019C4EF, 유효한 16진수 숫자가 필요합니다 .

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

( , , , bash에도 적용됨 ) 을 사용했기 때문에 where를 사용할 수 있습니다.kshzshmkshpdkshposh[base#]n~에 따르면2에서 64 사이의 십진수입니다.

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

귀하의 경우 삭제로 행을 할당 bc하고 다음 행을 편집하십시오.

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

관련 정보