Shell中关于递归变量的问题

Posted 二木成林

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了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

参考资料:

以上是关于Shell中关于递归变量的问题的主要内容,如果未能解决你的问题,请参考以下文章

新手请教C#中关于静态函数和静态变量

递归中关于递归语句后面内容的执行

Python中关于__main__变量的问题

java中关于静态变量的问题

Java中关于省略作用域报错问题分析

Linux Bash Shell 中变量的 5 个易错点