解释shell脚本以递归方式打印完整目录树
我找到了一个递归打印完整目录树的脚本,但我无法理解。 谁能完全描述它? 我刚刚开始编写shell脚本。 这是代码:
#!/bin/bash walk() { local indent="${2:-0}" printf "%*s%s\n" $indent '' "$1" for entry in "$1"/*; do [[ -d "$entry" ]] && walk "$entry" $((indent+4)) done } walk "$1"
此脚本定义函数walk()
,然后在传递给脚本的第一个参数上运行walk
。
该函数首先定义一个局部变量(一个只知道函数及其子函数) indent
indent
在本地定义为"${2:-0}"
。 这意味着如果取消设置$2
( walk
命令收到的第二个参数),则将其设为0
。 此变量是local
变量,因此您无法自己将第二个参数传递给脚本。
然后,该函数以此格式打印命令行( $1
)上指定的目录的内容
printf "%*s%s\n" $indent '' "$1"
这意味着,打印$indent
空格数,然后将目录名称作为字符串打印(因此不需要数字),然后打印换行符。
然后该函数运行一个循环
for entry in $1/*; do
这将$1
每个非隐藏文件或子目录(指定为walk
的第一个参数的目录)分配给变量entry
并循环遍历它们,对它们运行此命令:
[[ -d "$entry" ]] && walk "$entry" $((indent+4))
这意味着,如果entry
是目录,则运行walk
on entry
。 现在walk
有第二个参数$((indent+4))
,它将被用来代替0
作为indent
的新值。 这样做的结果是第一级目录根本没有缩进,但是第二级目录缩进了4个空格,第三级目录是8个空格,等等。由于entry
现在是第一个参数, $1
的walk
函数,它将在整个结构中递归。
该脚本以位置参数$1
运行walk
函数结束,该函数是传递给脚本的第一个参数。 用法可能是
./script directory
这意味着directory
是$1
并且walk
将在directory
上运行。
如果脚本打印出常规文件会很好,但如果没有精心设计的格式,它们会让人感到困惑。 我建议使用tree
来代替脚本!