159 votes

Hexadécimal vers décimal en Shell script

Quelqu'un peut-il m'aider à convertir un nombre hexadécimal en nombre décimal dans un shell script ?

Par exemple, je veux convertir le nombre hexadécimal bfca3000 en décimal en utilisant un shell script. Je veux essentiellement la différence de deux nombres hexadécimaux.

Mon code est :

var3=`echo "ibase=16; $var1" | bc`
var4=`echo "ibase=16; $var2" | bc`
var5=$(($var4-$var3))               # [Line 48]

Lors de l'exécution, j'obtiens cette erreur :

Line 48: -: syntax error: operand expected (error token is "-")

4voto

L'erreur signalée apparaît lorsque les variables sont nulles (ou vides) :

$ unset var3 var4; var5=$(($var4-$var3))
bash: -: syntax error: operand expected (error token is "-")

Cela pourrait arriver parce que la valeur donnée à bc était incorrecte. Cela pourrait être dû au fait que bc a besoin de valeurs en majuscules. Il a besoin de BFCA3000 pas bfca3000 . Cela est facilement corrigé dans bash, il suffit d'utiliser l'option ^^ l'expansion :

var3=bfca3000; var3=`echo "ibase=16; ${var1^^}" | bc`

Cela changera le script en ceci :

#!/bin/bash

var1="bfca3000"
var2="efca3250"

var3="$(echo "ibase=16; ${var1^^}" | bc)"
var4="$(echo "ibase=16; ${var2^^}" | bc)"

var5="$(($var4-$var3))"

echo "Diference $var5"

Mais il n'est pas nécessaire d'utiliser bc [1], car bash peut effectuer la traduction et la soustraction directement :

#!/bin/bash

var1="bfca3000"
var2="efca3250"

var5="$(( 16#$var2 - 16#$var1 ))"

echo "Diference $var5"

[1] Note : Je suppose que les valeurs pourraient être représentées en maths 64 bits, car la différence a été calculée en bash dans votre script original. Bash est limité aux entiers inférieurs à ((2**63)-1) s'il est compilé en 64 bits. Ce sera la seule différence avec bc qui n'a pas une telle limite.

4voto

Kosta Points 1771

Le chemin le plus court :

$ echo $[0x3F]
63

2voto

eordano Points 151

J'ai ce script bien pratique sur mon $PATH pour filtrer 0x1337 -comme.. ; 1337 ; ou "0x1337" lignes d'entrée en chaînes décimales (étendues pour plus de clarté) :

#!/usr/bin/env bash

while read data; do
  withoutQuotes=`echo ${data} | sed s/\"//g`
  without0x=`echo ${withoutQuotes} | sed s/0x//g`
  clean=${without0x}
  echo $((16#${clean}))
done

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X