Enfrentando erro na função recursiva para derivar fatorial de um número

1

Eu escrevi o seguinte código para derivar fatorial de um determinado número. Sendo novato no Shellscript, usei a lógica normal de código C da função recursiva.

#!/bin/bash
#This script will do factorial of a give number
echo "<<--------MENU----------->>"
echo "We will do a factorial"
echo "Enter the number"
 read num
 echo "You entred " $num
 fact()      #Function to calculate factorial of the given number
    {
        if  (num -eq 0)
            then    
        echo "1"
        elif (num -lt 0)
        then
        echo "Negative number can not be factorialed"
        else
        return fact*fact (n-1)
        fi
          }

        fact $num

        echo "The result is :" $fact(num)

Estou recebendo os seguintes erros durante a execução:

<<--------MENU----------->>

We will do a factorial

Enter the number

4

You entred  4
fact.sh: 20: fact.sh: Syntax error: "(" unexpected (expecting "fi")
    
por Mistu4u 28.11.2014 / 22:38

1 resposta

1

Bem, bash não é "C". Existem muitos erros aqui que provavelmente você precisa ler um bom tutorial sobre scripts de bash . Você mistura nome e valor de variáveis, variáveis locais e globais, argumentos posicionais, avaliação de comandos, expressões aritméticas, expressões lógicas ...

Antes de tudo, um conselho: quando você não souber o que está acontecendo, use #! /bin/bash -xv como a primeira linha. Isso imprimirá cada linha antes da execução e todas as substituições de variáveis. É realmente inestimável como ferramenta de depuração.

Em seguida, adiciono uma versão funcional do script. Lembre-se, esta é uma edição rápida e suja, há muitos especialistas aqui que farão um script mil vezes melhor aqui.

#!/bin/bash
#This script will do factorial of a give number
fact()      #Function to calculate factorial of the given number
{
    local a
    if  [[  -eq 0 ]]
    then    
        echo "1"
    elif [[  -lt 0 ]]
    then
        echo "You can't take the factorial of a negative number"
    else
        a=$(fact $(( - 1)) )
        echo $((  * $a ))
    fi
}
# main
echo "<<--------MENU----------->>"
echo "We will do a factorial"
echo "Enter the number"
read num
echo "You entred " $num

echo "The result is :" $(fact $num)

Veja:

[romano:~/tmp] % ./test.sh
<<--------MENU----------->>
We will do a factorial
Enter the number
4
You entred  4
The result is : 24

E agora um pouco surpreendente:

<<--------MENU----------->>
We will do a factorial
Enter the number
22
You entred  22
The result is : -1250660718674968576

... a análise é deixada para o leitor; -)

    
por Rmano 28.11.2014 / 23:12