Calculando expressões matemáticas em linguagem Shell Scripting - Parte V
Vocês se sentiriam confortáveis, entendendo Shell Scripts e escrevendo-os com fluência, conforme sua necessidade. Este é o último post desta série de tutoriais, onde realizaremos operações matemáticas um pouco complexas usando linguagem de script. Os últimos quatro artigos da série Shell Scripting que estão cronologicamente.
- Entenda as dicas básicas da linguagem de script do Linux Shell - Parte I
- 5 scripts Shell para iniciantes em Linux aprenderem programação Shell - Parte II
- Navegando pelo mundo dos scripts BASH do Linux – Parte III
- Aspecto matemático da programação Linux Shell – Parte IV
Vamos começar com a Série Fibonacci
Um padrão de números em que cada número é a soma de dois números anteriores. A série é 0, 1, 1, 2, 3, 5, 8…… Por definição, os dois primeiros números na sequência Fibonccai são 0 e 1.
Script 1: Fibonacci.sh
#!/bin/bash
echo "How many numbers do you want of Fibonacci series ?"
read total
x=0
y=1
i=2
echo "Fibonacci Series up to $total terms :: "
echo "$x"
echo "$y"
while [ $i -lt $total ]
do
i=`expr $i + 1 `
z=`expr $x + $y `
echo "$z"
x=$y
y=$z
done
Saída de amostra
[root@tecmint ~]# chmod 755 Fibonacci.sh
[root@tecmint ~]# ./Fibonacci.sh
How many numbers do you want of Fibonacci series ?
10
Fibonacci Series up to 10 terms ::
0
1
1
2
3
5
8
13
21
34
Baixe Fibonacci.sh
Você está familiarizado com o fato de que o computador entende apenas o formato binário, ou seja, '0' e '1' e a maioria de nós gostou de aprender a conversão de >Decimal para Binário. Que tal escrever um script simples para esta operação complexa.
Script 2: Decimal2Binary.sh
#!/bin/bash
for ((i=32;i>=0;i--)); do
r=$(( 2**$i))
Probablity+=( $r )
done
[[ $# -eq 0 ]] &echo -en "Decimal\t\tBinary\n"
for input_int in $@; do
s=0
test ${#input_int} -gt 11 &printf "%-10s\t" "$input_int"
for n in ${Probablity[@]}; do
if [[ $input_int -lt ${n} ]]; then
[[ $s = 1 ]] && printf "%d" 0
else
printf "%d" 1 ; s=1
input_int=$(( $input_int - ${n} ))
fi
done
echo -e
done
Saída de amostra
[root@tecmint ~]# chmod 755 Decimal2Binary.sh
[root@tecmint ~]# ./Decimal2Binary.sh 1121
Decimal Binary
1121 10001100001
Nota: O script acima aceita entrada em tempo de execução, o que obviamente é uma ajuda.
Baixe Decimal2Binary.sh
Bem, o comando embutido ‘bc’ pode converter um decimal em binário em um script de linha única. Execute, no seu terminal.
[root@tecmint ~]# echo "obase=2; NUM" | bc
Substitua ‘NUM‘ pelo número que você deseja converter de Decimal para Binário. Por exemplo,
[root@tecmint ~]# echo "obase=2; 121" | bc
1111001
A seguir escreveremos um script que funciona exatamente oposto ao script acima, Convertendo Valores Binários em Decimais.
Script 3: Binary2Decimal.sh
#!/bin/bash
echo "Enter a number :"
read Binary
if [ $Binary -eq 0 ]
then
echo "Enter a valid number "
else
while [ $Binary -ne 0 ]
do
Bnumber=$Binary
Decimal=0
power=1
while [ $Binary -ne 0 ]
do
rem=$(expr $Binary % 10 )
Decimal=$((Decimal+(rem*power)))
power=$((power*2))
Binary=$(expr $Binary / 10)
done
echo " $Decimal"
done
fi
Saída de amostra
[root@tecmint ~]# chmod 755 Binary2Decimal.sh
[root@tecmint ~]# ./Binary2Decimal.sh
Enter a number :
11
3
Nota: A função acima pode ser executada no terminal usando o comando ‘bc’ como.
[root@tecmint ~]# echo "ibase=2; BINARY" | bc
Substitua 'BINARY' pelo número binário, ou seja,
[root@tecmint ~]# echo "ibase=2; 11010101" | bc
213
Baixe Binary2Decimal.sh
Da mesma forma, você mesmo pode escrever a conversão de octal, hexadecimal para decimal e vice-versa. Conseguir o resultado acima no terminal usando o comando ‘bc’ é.
Decimal para Octal
[root@tecmint ~]# echo "obase=8; Decimal" | bc
Decimal para Hexadecimal
[root@tecmint ~]# echo "obase=16; Decimal" | bc
Octal para Decimal
[root@tecmint ~]# echo "ibase=8; Octal" | bc
Hexadecimal para Decimal
[root@tecmint ~]# echo "ibase=16; Hexadecimal" | bc
Binário para Octal
[root@tecmint ~]# echo "ibase=2;obase=8 Binary" | bc
Alguns dos testes Numéricos Comuns usados na linguagem de script de shell com descrição são.
Test : INTEGER1 -eq INTEGER2
Meaning: INTEGER1 is equal to INTEGER2
Test : INTEGER1 -ge INTEGER2
Meaning: INTEGER1 is greater than or equal to INTEGER2
Test: INTEGER1 -gt INTEGER2
Meaning: INTEGER1 is greater than INTEGER2
Test:INTEGER1 -le INTEGER2
Meaning: INTEGER1 is less than or equal to INTEGER2
Test: INTEGER1 -lt INTEGER2
Meaning: INTEGER1 is less than INTEGER2
Test: INTEGER1 -ne INTEGER2
Meaning: INTEGER1 is not equal to INTEGER2
Isso é tudo neste artigo e na série de artigos. Este é o último artigo da Série Shell Script e isso não significa que nenhum artigo sobre linguagem de script estará aqui novamente, apenas significa que o tutorial de shell scripting acabou e sempre que encontrarmos um tópico interessante que vale a pena conhecer ou uma dúvida sua, teremos o maior prazer em continuar a série a partir daqui.
Mantenha-se saudável, atento e conectado ao Tecmint. Muito em breve estarei trazendo outro tema interessante, vocês vão adorar ler. Compartilhe suas idéias valiosas na seção de comentários.