Mais profundo em complexidades de funções com script de shell - Parte VII
- 2088
- 419
- Howard Fritsch
Meu artigo anterior sobre "Entendendo e escrita funções em scripts de shell" pode ter lhe dado uma idéia básica sobre como escrever funções sob scripts de shell. Agora é hora de se aprofundar em recursos funcionais, como o uso de variáveis locais e recursão.
Complexidades de função com script de shellVariáveis locais
O que torna uma variável local? Depende desse bloco específico onde a variável é declarada. Uma variável declarada como local estará acessível a partir desse bloco de código onde parece eu.e. seu escopo é local. Para explicar isso, vamos analisar um exemplo abaixo.
#!/bin/bash func () local i = 10 j = 20 echo "i de func = $ i" echo "j de func = $ j" echo "i fora func = $ i" echo "j j "func eco" i fora func = $ i "echo" j fora func = $ j "saída 0
Ao executar o script acima, a saída será.
I Outs Func = J Outside Func = I de Func = 10 J de Func = 20 I Outside Func = J Outside Func = 20
Isso ocorre porque a função functão ainda não chamou enquanto o Primeiro 2 As declarações de eco foram executadas. Depois de chamar a função functão o mesmo 2 declarações de eco produzir um resultado diferente. Agora a variável j, que foi declarado dentro functão e não local, pode ser acessado depois.
Assim, valor para j torna-se 20. E a variável local eu? Como seu escopo estava dentro da função functão, valor 10 não poderia ser acessado de fora. Observe que a variável j normalmente declarado dentro functão é global por padrão.
Agora você está familiarizado com as variáveis locais e como usá -las dentro de blocos de função. Vamos para a seção mais interessante em funções, a recursão.
O que é recursão?
Uma chamada em si é geralmente denominada como o procedimento de recursão. Ou pode ser definido como expressar um algoritmo usando uma versão mais simples desse mesmo algoritmo. Considere o exemplo de encontrar fatorial de um número. Nós sabemos isso n! = 1 x 2 x 3 x… x (n-1) x n n. Assim, podemos escrever uma relação de recorrência como:
n! = (n-1)! x n
Portanto, é fácil para nós chamar recursivamente a mesma função e usar o valor de retorno de cada chamada para multiplicar com o resultado anterior, i.e.
5! = 4! x 5 4! = 3! x 4 3! = 2! x 3 2! = 1! x 2 1! = 0! x 1
Recursão usando variáveis locais
Aqui tentamos escrever um script para encontrar fatorial de um número usando variáveis locais e recursão.
#!/bin/bash fact () local local = $ 1 se [$ num -eq 0]; então ret = 1 else temp = $ ((num-1)) fato $ temp ret = $ ((num*$ $?)) FI RETURN $ RET FACT 5 eco "Fatorial de 5 = $?"Saia 0
num é uma variável local usada para armazenar cada N-1 valor em cada chamada. Aqui a condição base verifica se o número é igual a zero ou não (já que 0! = 1 e fatorial não são definidos para números negativos). Ao chegar a esta condição base, ele retorna o valor 1 ao seu chamador. Agora num = 1 e ret = 1 x 1.
Neste instante, ele retorna 1 ao seu chamador. Agora num = 2 e ret = 2 x 1 e assim por diante. Finalmente quando num = 5 O valor de retorno será 24 e o resultado final é ret = 5 x 24. O resultado final 120 é passado para a declaração inicial do chamador e é exibido.
Há um problema no script acima. Como expliquei no artigo anterior, as funções não podem retornar grandes inteiros. Portanto, é deixado para os usuários encontrar uma solução para o problema acima.
Q. Podemos realizar a recursão sem usar variáveis locais? A resposta é Sim.
Recursão sem variáveis locais
Veja o exemplo a seguir para exibir o Série Fibonacci usando recursão. A relação de recorrência básica é:
fib (0) = 0 fib (1) = 1 else fib (n) = fib (n-1) + fib (n-2) série fibonacci usando a recursão #!/bin/bash fib () a = $ 1 se [$ a -lt 2]; Então echo $ a else ((--a)) b = $ (fib $ a) ((--a)) c = $ (fib $ a) echo $ ((b+c)) fi para i em $ (seq 0 15) Do out = $ (fib $ i) ECHO $ OUT DOED EXIT 0
Nenhuma variável local é usada no script acima. Espero que você possa entender o fluxo do script durante a execução.
Aqui o valor 15 representa o número de termos no Série Fibonacci a ser exibido. Você notou algo especial sobre a execução do script acima. Leva um tempo, não? A recursão em um script é mais lenta que uma recursão em linguagens de programação como C.
Com este artigo, pretendo concluir as funções em parte no script de shell. Fique atualizado com Tecmint para ter os próximos artigos sobre matrizes e muito mais…
- « OpenVPN Server e Instalação e configuração do cliente no Debian 7
- Rainloop Webmail - Um moderno cliente de email baseado na Web para Linux »