rah*_*hmu 2 shell bash ksh zsh shell-script
我正在尝试在我的 shell 脚本中编写递归函数。考虑以下代码:
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)
Run Code Online (Sandbox Code Playgroud)
代码失败:
bash (3.0)recur.sh:第 5 行:“10”-1:语法错误:预期操作数(错误标记为“10”-1”)
一种
recur.sh:第 16 行:“1”*:语法错误:预期操作数(错误标记为“1”*“)
recur.sh:第 16 行:“2”*:语法错误:预期操作数(错误标记为“2”*“)
recur.sh:第 16 行:“3”*:语法错误:预期操作数(错误标记为“3”*“)
recur.sh:第 16 行:“4”*:语法错误:预期操作数(错误标记为“4”*“)
recur.sh:第 16 行:“5”*:语法错误:预期操作数(错误标记为“5”*“)
zsh (4.2.1)printA:1: 错误的数学表达式:非法字符:"
一种
阶乘:5:数学表达式错误:非法字符:“
然而,它使用ksh88. 只有第二个函数失败:
啊啊啊啊啊
recur.sh[5]: 1 * : 预期有更多令牌
recur.sh[5]: 2 * : 期望更多的令牌
recur.sh[5]: 3 * : 期望更多的令牌
recur.sh[5]: 4 * : 期望更多的令牌
recur.sh[5]: 5 * : 期望更多的令牌
factorial) 失败了ksh?PS:我知道,递归是邪恶的,性能很差,我应该改用常规循环,bla bla bla。我不是在讨论递归是好是坏,而是普通shell是否支持它。当简单的迭代循环可以解决问题时,我不会愚蠢到在生产中发送递归函数:)
return值。将值作为 STDOUT 传递:
function factorial {
(( $1 )) &&
echo $(( $1 * $( factorial $(( $1 - 1 )) ) )) ||
echo 1
}
factorial 5
Run Code Online (Sandbox Code Playgroud)
或者return他们:
function factorial {
(( $1 )) || return 1
factorial $(( $1 - 1 ))
return $(( $1 * $? ))
}
factorial 5
echo $?
Run Code Online (Sandbox Code Playgroud)
这两个代码都适用于bash, ksh(93 肯定,不知道 88)和zsh,所以我想是的,shell 确实支持递归。