Shell中关于递归变量的问题

异常

我在shell中使用递归来打印指定目录下所有文件的路径,代码如下:

#!/bin/bash

# 创建一个函数
readDir() {
  # 获取传入的目录路径
  dir=$1
  # 循环指定目录下的所有文件
  files=$(ls $dir)
  for file in $files; do
    path=$dir"/"$file #指的是当前遍历文件的完整路径
    # 判断是否是目录,如果是目录则递归遍历,如果是文件则打印该文件的完整路径
    if [ -d $path ]; then
      readDir $path
    else
      echo $path
    fi
  done
}

# 调用函数
readDir /root

我这里用了一个变量dir来存放传入的路径,下面的遍历操作也是针对这个变量来操作的。

但是并没有达到我想要的效果,在遍历完一层后,dir变量的值并没有回到上一层的目录。如下:

- root
	- hello
		- a.txt
		- b.txt
	- world
		- 1.txt
		- 2.txt

即会遍历到hello目录下,打印完a.txt和b.txt的路径,但是此时的dir变量的值却变成了/root/hello/world导致程序结束。
在这里插入图片描述

原因

在Linux Shell中,在函数内定义的变量,默认是全局的,在整个shell脚本范围内都是生效的。

而在递归中我们使用的变量要求它的局部的,否则下一层的修改会导致返回上一层后不能得到正确的值。

解决

在shell函数中使用局部变量,使用local关键字修饰的变量就是局部变量。

正确代码

#!/bin/bash

# 采集一个函数
readDir() {
  # 获取传入的目录路径
  local dir=$1
  # 循环指定目录下的所有文件
  local files=$(ls $dir)
  for file in $files; do
    local path=$dir"/"$file #指的是当前遍历文件的完整路径
    # 判断是否是目录,如果是目录则递归遍历,如果是文件则打印该文件的完整路径
    if [ -d $path ]; then
      readDir $path
    else
      echo $path
    fi
  done
}

# 调用函数
readDir /root

参考资料:

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值