Discussion:
[shell-script] Somar último digito
andrelucio.fc@yahoo.com [shell-script]
2018-06-11 17:19:54 UTC
Permalink
Estou empacado em um problema. Estou estou construindo um script que entre outras coisas, soma o último digito mais 1, por exemplo:


Antes:


12:34:56:78:90:12


Depois:


12:34:56:78:90:13



Eu acredito que já tenha resolvido esse tipo de problema mas acabei me esquecendo.
Vinicius Costa Carvalho vinicius@carvalho.inf.br [shell-script]
2018-06-11 18:15:28 UTC
Permalink
echo "12:34:56:78:90:13" | rev | cut -c1
Post by ***@yahoo.com [shell-script]
Estou empacado em um problema. Estou estou construindo um script que entre
12:34:56:78:90:12
12:34:56:78:90:13
Eu acredito que já tenha resolvido esse tipo de problema mas acabei me esquecendo.
--
Vinicius Costa Carvalho

"Se enxerguei mais longe, foi porque me apoiei sobre os ombros de gigantes."
*Isaac Newton*
andrelucio.fc@yahoo.com [shell-script]
2018-06-11 18:26:48 UTC
Permalink
Desculpa pessoal, acabei errando no questionamento... O correto é que some os dois últimos octeto em hexadecimal a mais 1. Por exemplo:

12:34:56:78:90:af + 1 = 12:34:56:78:90:b0
Jonathan Lessa jonathanlessa@gmail.com [shell-script]
2018-06-11 19:05:46 UTC
Permalink
Boa tarde!


# echo $mac
12:34:56:78:90:af

# macN=$(tr -d : <<< $mac | tr a-z A-Z)
# echo $macN
1234567890AF

# echo "obase=16;ibase=16;${macN}+1" | bc
1234567890B0
Post by ***@yahoo.com [shell-script]
Desculpa pessoal, acabei errando no questionamento... O correto é que some
12:34:56:78:90:af + 1 = 12:34:56:78:90:b0
--
Att.:
Jonathan Lessa
Licenciado em Informática
andrelucio.fc@yahoo.com [shell-script]
2018-06-11 19:25:31 UTC
Permalink
Opa, Jonathan. Primeiramente obrigado pela ajuda.

Eu fiz uma solução tbm utilizando, mas infelizmente por se tratar de um linux embarcado, ele não possui o bc.


Outra coisa é que preciso manter a separação de campos com o dois ponto ":".
Jonathan Lessa jonathanlessa@gmail.com [shell-script]
2018-06-11 21:11:01 UTC
Permalink
Não fiz a validação do MAC na entrada, mas vc pode ajustar, segue um script
para exibição do próximo MAC

# cat nextMac.sh

#!/bin/bash
hexArray=(0 1 2 3 4 5 6 7 8 9 "A" "B" "C" "D" "E" "F" 0)
hexVar=$( tr a-z A-Z <<< $1)
prox=1
for i in $(seq $(( ${#hexVar} - 1 )) -1 0); do
temp=${hexVar:$i:1}
for j in $( seq 0 15 ); do
[[ $temp == ${hexArray[$j]} ]] && {
(( $prox == 1 )) && {
[[ $temp != "F" ]] && prox=0
temp=${hexArray[$j+1]}
}
}
done
hexC="${hexC}${temp}"
done
echo $hexC | rev
#--- [END]---

# ./nextMac.sh 01:23:45:F5:BF:EE
01:23:45:F5:BF:EF

# ./nextMac.sh 01:23:45:F5:BF:Ee
01:23:45:F5:BF:EF

# ./nextMac.sh 01:23:45:F5:BF:FF
01:23:45:F5:C0:00
Post by ***@yahoo.com [shell-script]
Opa, Jonathan. Primeiramente obrigado pela ajuda.
Eu fiz uma solução tbm utilizando, mas infelizmente por se tratar de um
linux embarcado, ele não possui o bc.
Outra coisa é que preciso manter a separação de campos com o dois ponto ":".
--
Att.:
Jonathan Lessa
Licenciado em Informática
phfbettega@yahoo.com.br [shell-script]
2018-06-11 23:13:30 UTC
Permalink
Se o shell tiver printf, dá pra converter. Ou com awk também.

printf '%x\n' $(($(printf '%d' 0x$(echo 12:34:56:78:90:af|cut -d: -f6))+1))

Funcionou no busybox 1.2.1 de 2008.

Abraços Paulo
Post by ***@yahoo.com [shell-script]
Opa, Jonathan. Primeiramente obrigado pela ajuda.
Eu fiz uma solução tbm utilizando, mas infelizmente por se tratar de um linux embarcado, ele não possui o bc.
Outra coisa é que preciso manter a separação de campos com o dois ponto ":".
--------------------------------------------------------------------------------------------------------------
--------------------------------------------------------------------------------------------------------------
Responder através da web
itamarnet@yahoo.com.br [shell-script]
2018-06-12 13:00:11 UTC
Permalink
Caro Andre


Nesse exemplo converto internamente para inteiro e depois com o printif volto para o haxadecimal após somar mais 1, usando o expr
Se tiver o sed pode usar para formatar a saída de novo no formato de um MACAddress.



num=$(echo 12:34:56:78:90:af | tr -d :)

printf "%X\n" $(expr $((16#$num)) + 1) | sed 's/../&:/g;s/:$//'


mas eu preferiria usar o bc se for possível instalar


[]'s
Itamar
'Julio C. Neves' julio.neves@gmail.com [shell-script]
2018-06-12 18:27:36 UTC
Permalink
Sem bc, essa solução deve ser a melhor (pensei em algo semelhante, mas
estava só com um celular e dirigindo e aí teclar shell fica difícil...),
porém o expr é muito lento. Eu trocaria o $(expr $((16#$num)) + 1) por
$((16#$num+1))

Veja:
$ num=ff # 255 em decimal
$ echo $((16#$num+1))
256


Abraços,
Julio

*» Não tem tempo para fazer um curso presencial?*
*» Na sua cidade não tem nenhum bom curso de Linux?*
*» O treinamento está muito caro?*
*O melhor de todos em EAD é http://www.dicas-l.com.br/cursos/psl/
<http://www.dicas-l.com.br/cursos/psl/>*

*Damos treinamento em sua empresa **com certificado*
*e nota fiscal **por **um preço, **no mínimo, 50% **abaixo*
*de qualquer curso.*

​​
Nosso time de instrutores *in company* é formado somente por
​
​
autores
​ ​
​
de
*Best Sellers​ ​*​laureados ​sobre os temas.. P. exemplo:

Shell básico e Programação em Shell Julio Neves
Bacula Heitor Medrado
Zabbix Adail Host
Produção Gráfica e Videografismo Cadunico
Post by ***@yahoo.com.br [shell-script]
Caro Andre
Nesse exemplo converto internamente para inteiro e depois com o printif
volto para o haxadecimal após somar mais 1, usando o expr
Se tiver o sed pode usar para formatar a saída de novo no formato de um MACAddress.
num=$(echo 12:34:56:78:90:af | tr -d :)
printf "%X\n" $(expr $((16#$num)) + 1) | sed 's/../&:/g;s/:$//'
mas eu preferiria usar o bc se for possível instalar
[]'s
Itamar
andrelucio.fc@yahoo.com [shell-script]
2018-06-13 12:59:44 UTC
Permalink
Obrigado a todos pela ajuda.

'Julio C. Neves' julio.neves@gmail.com [shell-script]
2018-06-11 19:48:48 UTC
Permalink
Mac=12:34:56:78:90:ab
Inic=$(cut -f-5 -d: <<< $Mac)
Ult=$(cut -f6 -d: <<< $Mac)
echo $Inic:$(bc <<< "obase=16; ibase=16; $Ult+1")

Eu prefiro usar expansão de parâmetros mas no celular fica difícil.
Post by ***@yahoo.com [shell-script]
Estou empacado em um problema. Estou estou construindo um script que entre
12:34:56:78:90:12
12:34:56:78:90:13
Eu acredito que já tenha resolvido esse tipo de problema mas acabei me esquecendo.
andrelucio.fc@yahoo.com [shell-script]
2018-06-11 20:34:22 UTC
Permalink
Grande Mestre Júlio.

Essa solução funciona, mas infelizmente o meu linux não tem o bc.


Conseguir fazer da seguinte forma (Bagunçado mas conseguir kkkk):


#!/bin/ash


mac="40:a5:ef:7b:2b:c1"


macsufix=$(echo $mac | cut -c 16-)


macprefix=$(echo $mac | cut -c 1-15)


hexsufix=$(printf "%d\n" 0x$macsufix)


soma=$(expr $hexsufix + 1)


octultimo=$(printf "%x\n" $soma)


printf "%s:%s\n" "$mac" "$octultimo"
Loading...