无法使shell递归脚本工作

时间:2018-03-26 12:44:54

标签: bash shell

我试图编写一个给定进程号的递归函数,打印出从它产生的子进程的进程数最多k代。以下代码似乎不起作用,因为我想要做的是以一种树状方式打印它,在那里我打印它下面的给定进程的子进程,而不是先打印整个代,然后第二个,然后等等。我正在尝试的更多的是深度优先搜索的精神贯穿"图表"。不知何故,我无法跟踪在某个深度停止的递归级别。如果有人能发现错误,请告诉我。

function descendantsRecursive() {
    level=$2
    if [[ "$level" -ge 4 ]]
    then
        exit
    fi
    result=($(pgrep -P "$1" .))
    for pid in "${result[@]}"; do
        echo "$level"
        echo "$pid"
        if [[ "$(pgrep -P $pid)" == '' ]] 
        then
            :
        else
            descendantsRecursive $pid $(( $level+1 ))
        fi
    done
}

1 个答案:

答案 0 :(得分:2)

显而易见的问题是你的变量是全局的。这对所有人来说都不重要,但是通过调用修改级别这一事实将会产生错误。

此外,调用exit会终止整个脚本,您只想停止被调用的函数。使用return

一个好习惯是将所有变量声明为local:

local level=$2 pid result

但您也可以使用更少的变量:

function descendantsRecursive() {
    local pid
    if (( $2 >= 4 )); then return; fi
    for pid in $(pgrep -P "$1" .) ; do
        echo "$2"
        echo "$pid"
        # This test is unneeded
        if [[ "$(pgrep -P $pid)" == '' ]] 
        then
            :
        else
            descendantsRecursive $pid $(( $2+1 ))
        fi
    done
}
相关问题