Si la comparaison de strings d'instructions

Je lis un file csv avec 14 valeurs par ligne. Je veux convertir la valeur HEX de 10ème [ f10 ] à une valeur DEC. Pour ce faire, if la 7e valeur [ f7 ] doit contenir EnHr ou EnSt ou SpJb ou Chem ou TrTm ou PmTm ou BrTm ou HyTm

Donc c'est une partie de mon code:

 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 

En outre quand echo -e "\t\t\t\t\tRAW VAL is $f10" je peux voir les valeurs HEX mais dans la ligne suivante le Val semble être 0 en décembre

C'est la sortie que je reçois jusqu'à présent

 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 

Les valeurs Test 1-4 sont là pour que je puisse voir où se trouve le code. Juste des échos simples, aucune signification réelle. Ce sont mes préoccupations:

Q1: Comment puis-je éliminer (standard_in) 1: syntax error où vient-elle?

Q2: Aussi, à partir de la sortie, pourquoi la valeur hexadécimale des données brutes n'est-elle pas convertie en décimal?

POSIXly vous pouvez get la valeur décimale d'un nombre hexadécimal comme:

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

 16 

Et vous n'avez vraiment pas besoin de faire tous ces [ tests ] . Je pense que ce qui suit devrait fonctionner:

 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 

La norme dans l'erreur vient de bc . Il attend des valeurs hexadécimales en majuscules. Donc au lieu de 0019c4ef vous devriez le passer 0019C4EF .

L'hex pour décoder la conversion peut être fait en utilisant sans bc trop – voir cette réponse https://stackoverflow.com/a/13280173/3935925

Pour les deux questions, l'erreur provenait de bc .

0019c4ef est un nombre hexadécimal invalide en 0019C4EF , vous avez besoin de 0019C4EF pour un nombre hexadécimal valide:

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

Parce que vous avez utilisé bash (vous pouvez également utiliser ksh , zsh , mksh , pdksh , posh ), vous pouvez utiliser [base#]nbase est un nombre décimal compris entre 2 et 64:

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

Dans votre cas, supprimez simplement la ligne d'affectation en utilisant bc et modifiez la ligne suivante:

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