I'm trying to write recursive functions in my shell scripts. Consider the following code:
function printA {
if [[ "$1" = 0 ]]; then
return
else
echo "a$(printA $(("$1" - 1)))"
fi
}
printA 10
function factorial {
if [[ "$1" = 0 ]]; then
return 1
else
return $(( "$1" * $(factorial $(( $1 - 1 )) ) ))
fi
}
echo $(factorial 5)
The code fails on:
bash
(3.0)
recur.sh: line 5: "10" - 1: syntax error: operand expected (error token is ""10" - 1")
a
recur.sh: line 16: "1" * : syntax error: operand expected (error token is ""1" * ")
recur.sh: line 16: "2" * : syntax error: operand expected (error token is ""2" * ")
recur.sh: line 16: "3" * : syntax error: operand expected (error token is ""3" * ")
recur.sh: line 16: "4" * : syntax error: operand expected (error token is ""4" * ")
recur.sh: line 16: "5" * : syntax error: operand expected (error token is ""5" * ")
zsh
(4.2.1)
printA:1: bad math expression: illegal character: "
a
factorial:5: bad math expression: illegal character: "
However it partly succeds using ksh88
. Only the second function fails:
aaaaaaaaa
recur.sh[5]: 1 * : more tokens expected
recur.sh[5]: 2 * : more tokens expected
recur.sh[5]: 3 * : more tokens expected
recur.sh[5]: 4 * : more tokens expected
recur.sh[5]: 5 * : more tokens expected
- Am I doing anything wrong?
- Is there another recursive syntax supported by bash and zsh?
- Why does the second function (
factorial
) fail inksh
?
PS: I know, recursion is Evil, performs badly, I should use a regular loop instead, bla bla bla. I am not discussing whether recursion is good or bad, but whether common shells support it. I am not foolish enough to send recursive functions in production when simple iterative loops would do the trick :)
ksh88
– rahmu Aug 22 '12 at 15:22return
numerical values which could be higher than 255. Use STDOUT. – l0b0 Sep 03 '12 at 11:18