você está aqui: Home  → Arquivo de Mensagens

Bashes numéricas no BASh

Colaboração: Paulo Roberto Bagatini

Data de Publicação: 19 de fevereiro de 2013

Umas das capacidades inatas do BASh, um dos shell texto mais usados, é a manipulação de números em bases numéricas outras que não a decimal.

Conversão de uma base qualquer para decimal

  $ echo $((844)) # decimal
  844
  
  $ echo $((0x34c)) # hexadecimal
  844
  
  $ echo $((01514)) # octal
  844
  
  $ echo $((2#1101001100)) # binario
  844
  
  $ echo $((21#1j4)) # base 21 -> QUALQUER BASE!
  844

Operações com números em várias bases numéricas

  $ echo $(( 2#1101001100 * 0x34c + 21#1j4)) # 844 * 844 + 844
  713180

Conversão de decimal para outras bases

A conversão de decimal para outras bases não é tão "nativa". Então, naturalmente, existem várias formas de fazer. Aqui vão algumas sugestões, priorizando o não uso de loops.

  $ dec=844
  
  $ printf '%x\n' $dec # para hexadecimal
  34c
  
  $ printf '%X\n' $dec
  34C
  
  $ printf '%o\n' $dec # para octal
  1514
  
  $ bc <<< "obase=2;$dec" # para binario
  1101001100
  
  $ bc <<< "obase=21;$dec" # para base 21 -> QUALQUER BASE!
  01 19 04
  
  $ # usando letras como digitos para bases maiores que 10
  $ eval echo -e $(bc <<< "obase=21;$dec" | sed -r 's/ [1-9][0-9]/\\\\x$(printf %x $((&-9+96)))/g;s/ 0//g')
  1j4

Conversão de uma base qualquer (ibase<=16) para outra base qualquer (obase<=2.147.483.647 :-p)

  $ bc <<< "obase=16;ibase=2;1101001100"
  34C
  
  $ bc <<< "ibase=2;obase=1010;11" # cuidado com a ordem das variáveis ibase e obase ;-)
  3

Código ascii decimal para caracter (chr)

  $ echo -e \\x$(printf %x 65)
  A

Caracter para código ascii decimal (ord)

  $ echo -n A | od -td1 | grep -Eo " [0-9]+"
  65

Caracter para código ascii hexadecimal no uso em URL's

  $ string='http://uma_url/~user/index.html?parm1=VAL1&parm2=ã-ç'
  
  $ echo -n "$string" | od -tx1 | grep -Eo "( ..)+$" | tr " a-z" "%A-Z" | tr -d "\n"; echo
  %68%74%74%70%3A%2F%2F%75%6D%61%5F%75%72%6C%2F%7E%75%73%65%72%2F%69%6E%64%65%78%2E%68%74%6D%6C%3F%70%61%72%6D%31%3D%56%41%4C%31%26%70%61%72%6D%32%3D%C3%A3%2D%C3%A7

Caracter especiais (diferentes de [a-zA-Z0-9-._~-]) para código ascii hexadecimal no uso em URL's

  $ eval echo $(sed -r 's/[^A-Za-z0-9._~-]/$(echo -n "\\&" | od -tx1 | grep -Eo "( ..)+$" | tr " a-z" "%A-Z")/g;s/\\([^\\"])/\1/g' <<< $string)
  http%3A%2F%2Fuma_url%2F~user%2Findex.html%3Fparm1%3DVAL1%26parm2%3D%C3%A3-%C3%A7

Cuidado com ambientes com suporte a Unicode

  $ echo -n A | od -tx1 | grep -Eo " ..+"
  41
  
  $ echo -n Ç | od -tx1 | grep -Eo " ..+"
  c3 87
  
  $ echo -n Ç | iconv -f utf8 -t latin1 | od -tx1 | grep -Eo " ..+"
  c7
  
  $ echo $((0xc7))
  199

Comandos usados nesse artigo



Veja a relação completa dos artigos de Paulo Roberto Bagatini

 

 

Opinião dos Leitores

Cesar Brod
19 Fev 2013, 09:12
Uma aula! :-) Muito bom!
Alexandre Heitor Schmidt
19 Fev 2013, 07:55
Muitíssimo interessante este post! Obrigado!
*Nome:
Email:
Me notifique sobre novos comentários nessa página
Oculte meu email
*Texto:
 
  Para publicar seu comentário, digite o código contido na imagem acima
 


Powered by Scriptsmill Comments Script