Bash中如何使用while循环实现func1函数的递归调用
Bash 递归遍历func1输出条目的实现方案
不要写固定层数的嵌套while循环,这种写法没法适配不确定的递归深度,直接封装递归处理函数即可。
基础无去重版本
适合确定func1输出不会出现重复条目、不会形成调用环的场景,代码如下:
# 定义递归遍历函数 recur_func() { local target="$1" # 遍历当前入参调用func1返回的所有条目 func1 "$target" | while read -r item do # 这里写你对每个条目的处理逻辑,比如打印输出 echo "当前处理条目: $item" # 把当前条目作为入参递归调用 recur_func "$item" done } # 传入初始参数,启动递归 recur_func "你的初始入参"
防死循环去重版本
如果func1的输出可能出现重复值,或者存在调用环(比如A作为入参输出B,B作为入参又输出A),上面的代码会无限递归,需要加已访问标记去重:
# 声明关联数组存储已经处理过的条目 declare -A visited_map recur_func() { local target="$1" # 已经处理过的条目直接跳过,避免重复执行/死循环 if [[ -n "${visited_map[$target]}" ]]; then return fi # 标记当前条目已处理 visited_map[$target]=1 # 自定义条目处理逻辑 echo "命中条目: $target" # 遍历下一层条目递归,用进程替换规避子shell变量不生效问题 while read -r item do recur_func "$item" done < <(func1 "$target") } # 启动递归 recur_func "你的初始入参"
注意事项
read必须加-r参数,避免条目里的反斜杠等特殊字符被自动转义,导致传参错误- 所有变量引用都要加双引号,防止条目包含空格、特殊字符时被拆分成多个参数
- 用进程替换
< <(func1 "$target")替代管道写法,是因为管道会触发子shell,老版本Bash下子shell内修改关联数组的操作不会同步到父shell,会导致去重逻辑失效
内容的提问来源于stack exchange,提问作者JinPangPang
相关产品推荐
相关产品推荐

