Abh*_*hek 6 command-line bash scripts
我找到了一个递归打印完整目录树的脚本,但我无法理解。谁能完整描述一下?我刚刚开始编写 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"
Run Code Online (Sandbox Code Playgroud)
该脚本定义了一个函数walk(),然后walk在传递给脚本的第一个参数上运行。
函数首先定义一个局部变量(只有函数及其子函数知道) indent
indent在本地定义为"${2:-0}"。这意味着如果$2(walk命令接收的第二个参数)未设置,则 make it 0。此变量local使您无法自己将第二个参数传递给脚本。
该函数然后$1以这种格式打印在命令行 ( )上指定的目录的内容
printf "%*s%s\n" $indent '' "$1"
Run Code Online (Sandbox Code Playgroud)
这意味着,打印$indent空格数,然后将目录名称打印为字符串(因此不需要数字),然后打印换行符。
然后函数运行一个循环
for entry in $1/*; do
Run Code Online (Sandbox Code Playgroud)
这会将$1(指定为 的第一个参数的目录)中的每个非隐藏文件或子目录分配给walk变量entry并循环遍历它们,对它们运行以下命令:
[[ -d "$entry" ]] && walk "$entry" $((indent+4))
Run Code Online (Sandbox Code Playgroud)
这意味着,如果entry是目录,则walk在entry. 现在walk有第二个参数$((indent+4)),它将被用作0的新值而不是indent。这样做的效果是一级目录根本没有缩进,但是二级目录缩进了4个空格,第三级缩进了8个空格,等等。 由于entry现在$1是walk函数的第一个参数,它会在整个过程中递归结构体。
脚本通过walk在位置参数上运行函数结束,位置参数$1是传递给脚本的第一个参数。用法可能是
./script directory
Run Code Online (Sandbox Code Playgroud)
这意味着directory是$1和walk将上运行directory。
如果脚本打印我认为的常规文件会很好,但是如果没有一些精心设计的格式,它们看起来会很混乱。我建议tree为此目的使用而不是脚本!