Eu quero adicionar duas variáveis hexadecimais em um script bash. Eu quero que eles comecem como hexadecimais e terminem em hexadecimal, não decimal.
O que eu criei até agora é um pouco sobre hack. Existe uma solução melhor ou mais elegante?
BASE=0xA000
OFFSET=0x1000
NEW_BASE=$(( $BASE + $OFFSET ))
NEW_BASE=`printf "0x%X\n" $NEW_BASE`
echo $NEW_BASE
0xB000
Eu apenas simplificaria seu script como:
Sim, em
bash
,printf
é a única forma integrada de reformatar um número em uma base diferente e apenas as bases 8, 10 e 16 são suportadas.Em
bash
(ao contrário de shells comoksh93
oufish
), usar a substituição de comando implica em bifurcar um subshell. Você pode usarprintf -v
aqui para evitar o subshell (também disponível em versões recentes dezsh
forprint
eprintf
(print -f
) que também suporta impressão em arrays):(em
bash
, ao contrário dezsh
,$((...))
está sujeito à divisão de palavras, portanto, precisa ser citado para evitar a dependência de$IFS
).Em
zsh
, você pode especificar a base de expansão como parte da sintaxe de expansão aritmética (bases 2 a 36):Com ksh e zsh, você também pode forçar a expansão de uma variável inteira para uma base específica com:
A expansão será na
16#1FE
forma. ksh93 suporta bases até 64zsh
emksh
até 36.O built-in do ksh93
printf
suporta a saída de números em bases arbitrárias, bem como com ou sem on#
prefixo:Em ksh93,
var=$(printf...)
não bifurca um subshell, portanto é tão eficiente quantobash
'sprintf -v
.No GNU ou no BSD moderno
dc
, você pode fazer assim:16o
define a base de saída.16i
define a base de entrada. As?
leituras em uma linha da entrada padrão, que neste caso coloca dois números na pilha.+
os adiciona.p
imprime o topo da pilha (a resposta).dentro do bash, parece ser o bom método. você também pode chamar ferramentas como bc/dc (dependendo de suas preferências) ... echo 'obase=30; 123456' | bc
mas eu prefiro o método bash No meu ponto de vista você está indo bem
A soma de
$hexNumA
e$hexNumB
é:Você pode até adicionar decimal a hexadecimal com a mesma facilidade:
cortesia: " Converter Hexadecimal para Decimal no Bash "