explica a sintaxe de recursão

0

Eu sou novo em shell e UNIX / GNU / Linux.

Estou tentando entender essa sintaxe que faz parte de uma função de recursão:

 [ $i -le 2 ] && echo $i || { f=$(( i - 1)); f=$(factorial $f); f=$(( f * i )); echo $f; }

(retirado de aqui )

a função relacionada completa é:

factorial(){
  local i=$1
  local f
  declare -i i
  declare -i f
  [ $i -le 2 ] && echo $i || { f=$(( i - 1)); f=$(factorial $f); f=$(( f * i )); echo $f; }

}

Eu entendo [$i -le 2 ] significa checar se há pelo menos 2 argumentos posicionais, só não entendi o que é o símbolo do pipe duplo (ou?). Além disso, o que o {} faz? eles são um tipo de 4 argumentos para loop?

Obrigado David

    
por David Refaeli 24.07.2016 / 07:47

2 respostas

2

Primeiro,

local i=$1

atribui o valor de $ 1 a i. $ 1 é o primeiro argumento da função. Ou fora de uma função, ela representa o primeiro parâmetro posicional de um comando ou script.

Os seguintes são bastante intuitivos. -i significa que a variável é um inteiro.

  local f
  declare -i i
  declare -i f

Agora para o longo. Vou dividi-lo em linhas separadas para maior clareza.

[ $i -le 2 ]    #checks if $i is less or equal 2

&&    #this is logical AND. This is used so: X && Y, meaning if X computes to true, then compute Y. So for this function, the meaning is: if $i less or equals 2, do the following:

echo $i     #this follows the logical && above, so is computed conditionally. Namely, print $i.

||    #this is logical OR, so what follows is computed only if what's on the left boils down to false.
      #Here the meaning is, IF NOT $i -le 2 AND echo... (which doesn't matter), do what's on the right. So do what's in the {} braces, if $i is greater than 2.

E agora isso é deixado:

 { f=$(( i - 1)); f=$(factorial $f); f=$(( f * i )); echo $f; }

As chaves {} transformam o que está nelas em um bloco, que é tratado como uma entidade. Para explicar isso, aparecendo aqui simplesmente, a lógica apresentada antes com & & e || agora se aplica ao bloco inteiro. Agora para as partes.

f=$(( i - 1));

$ (()) é um operador aritmético. f = você deveria saber agora. A expressão inteira significa atribuir a f o valor de i - 1 .

Observe como as partes de um bloco são finalizadas com um ponto-e-vírgula ; .

f=$(factorial $f);

O acima chama a função. Este é o lugar da recursão. Significado literal: atribua a f o valor de retorno da função fatorial chamada com o $f como argumento. (A atribuição não requer o $, como você deve ter notado). O $( ) é uma substituição de comandos . Você pode chamar uma função simplesmente chamando seu nome, mas para uma atribuição de valor variável, o valor deve ser passado de alguma forma, e é assim que é feito aqui.

f=$(( f * i ));

Acima você vê o operador aritmético novamente, isto é, $(( )) . f obtém aqui o valor de f , que agora é igual a $(factorial $f) , multiplicado por i , que é igual ao argumento $ 1 da função.

E, finalmente, imprima o valor de f :

echo $f;
    
por 24.07.2016 / 16:39
0
||

OU lógico

{}

begin-end de uma função ou conjunto de comandos

for

3 argumentos: inicialização, condição, mudança de iterador

{ f=$(( i - 1)); f=$(factorial $f); f=$(( f * i )); echo $f; }

função inline devolvendo um número

    
por 24.07.2016 / 08:05