Pesquisa de site

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.

  1. Entenda as dicas básicas da linguagem de script do Linux Shell - Parte I
  2. 5 scripts Shell para iniciantes em Linux aprenderem programação Shell - Parte II
  3. Navegando pelo mundo dos scripts BASH do Linux – Parte III
  4. 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.