解释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}" 。 这意味着如果取消设置$2walk命令收到的第二个参数),则将其设为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现在是第一个参数, $1walk函数,它将在整个结构中递归。

该脚本以位置参数$1运行walk函数结束,该函数是传递给脚本的第一个参数。 用法可能是

 ./script directory 

这意味着directory$1并且walk将在directory上运行。

如果脚本打印出常规文件会很好,但如果没有精心设计的格式,它们会让人感到困惑。 我建议使用tree来代替脚本!