异常
我在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
参考资料:
|