De acordo com as Leis 12.965/2014 e 13.709/2018, que regulam o uso da Internet e o tratamento de dados pessoais no Brasil, ao me inscrever na newsletter do portal DICAS-L, autorizo o envio de notificações por e-mail ou outros meios e declaro estar ciente e concordar com seus Termos de Uso e Política de Privacidade.

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

Adicionar comentário

* Campos obrigatórios
5000
Powered by Commentics

Comentários

Nenhum comentário ainda. Seja o primeiro!


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