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;