95

7
+3  Q:

## How do you find the factorial of a number in a Bash script?

In shell scripting how to find factorial of a number?

A:

+4  A:
``````#!/bin/bash
counter=\$1 #first argument
factorial=1
while [ \$counter -gt 0 ] #while counter > 0
do
factorial=\$(( \$factorial * \$counter ))
counter=\$(( \$counter - 1 ))
done
echo \$factorial
``````
+3  A:
``````echo 500 | dc -e '?[q]sQ[d1=Qd1-lFx*]dsFxp'
``````
+1 nice, although I have no clue why it works ;)
This uses an external program with an arcane syntax to perform the computations.
@luther, external dedicated tools like bc, dc are able to calculate bigger numbers. Therefore, they are most appropriate tool for the job. There's a limit to what bash can calculate for bigger factorials.
@gd: I was just informing Felix what was happening there. Understanding bash does not mean understanding the above statement.
+1  A:

10! in bash:

``````f=1; for k in {1..10}; do f=\$[\$k * \$f] ; done; echo \$f
``````

or here in a step by step fashion:

``````\$ t=\$(echo {1..10})
\$ echo \$t
1 2 3 4 5 6 7 8 9 10
\$ t=\${t// /*}
\$ echo \$t
1*2*3*4*5*6*7*8*9*10
\$ echo \$[\$t]
3628800
``````
there's a limit for what bash can do. it breaks for bigger numbers. Maybe you have a way of producing the same results for factorial of say, for example, 500, with bash ?
I'm fine with anybody using external tools to compute what they need. But the OP asked how to do this in bash, so I figured this was most likely an exercise in "bash for general programming", chapter "how to loop in bash".
+4  A:

You don't do it in `bash`. Intelligent people don't try to cut down trees with a fish, so my advice is to try and use the right tool for the job.

You can use, for example, `bc` to do it thus:

``````pax> echo 'define f(x) {if (x>1){return x*f(x-1)};return 1}
f(6)' | bc
720
pax> echo 'define f(x) {if (x>1){return x*f(x-1)};return 1}
f(500)' | BC_LINE_LENGTH=99999 bc
12201368259911100687012387854230469262535743428031928421924135883858
45373153881997605496447502203281863013616477148203584163378722078177
20048078520515932928547790757193933060377296085908627042917454788242
49127263443056701732707694610628023104526442188787894657547771498634
94367781037644274033827365397471386477878495438489595537537990423241
06127132698432774571554630997720278101456108118837370953101635632443
29870295638966289116589747695720879269288712817800702651745077684107
19624390394322536422605234945850129918571501248706961568141625359056
69342381300885624924689156412677565448188650659384795177536089400574
52389403357984763639449053130623237490664450488246650759467358620746
37925184200459369692981022263971952597190945217823331756934581508552
33282076282002340262690789834245171200620771464097945611612762914595
12372299133401695523638509428855920187274337951730145863575708283557
80158735432768888680120399882384702151467605445407663535984174430480
12893831389688163948746965881750450692636533817505547812864000000000
00000000000000000000000000000000000000000000000000000000000000000000
00000000000000000000000000000000000000000000000
``````
Agreed. OTOH I found myself a couple of time in a forest with a hammer, a butter knife and busybox. So this should be tagged as "survival training"
+2  A:
``````seq -s "*" 1 500 |bc
``````
And btw. this does not work on Mac OSX or any other system that does not come with the GNU coreutils (which seq is a part of)
then use jot on Mac OS. If any other system
A:

Here is a recursive function in Bash:

``````factorial () {
if ((\$1 == 1))
then
echo 1
return
else
echo \$(( \$( f \$((\$1 - 1)) ) * \$1 ))
fi
}
``````

Of course it's quite slow and limited.