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中关于递归变量的问题的主要内容,如果未能解决你的问题,请参考以下文章