shell 支持递归吗?

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 * : 期望更多的令牌

  • 我做错了什么吗?
  • bash 和 zsh 是否支持另一种递归语法?
  • 为什么第二个函数 ( factorial) 失败了ksh

PS:我知道,递归是邪恶的,性能很差,我应该改用常规循环,bla bla bla。我不是在讨论递归是好是坏,而是普通shell是否支持它。当简单的迭代循环可以解决问题时,我不会愚蠢到在生产中发送递归函数:)

man*_*ork 8

  • 语法错误:在算术计算中不使用引号。
  • 逻辑错误:您正在混合 STDOUT 和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 确实支持递归。

  • 您真的不想“返回”可能 [高于 255] 的数值(http://mywiki.wooledge.org/BashFAQ/002)。使用标准输出。 (9认同)