Я нашел, что сценарий рекурсивно распечатал полное дерево каталогов, но я не могу понять это. Кто-либо может полностью описать это? Я только что запустил сценарии оболочки. Вот код:
#!/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
на entry
. Теперь walk
имеет второй аргумент $((indent+4))
, который будет использоваться вместо 0
как новое значение indent
. Эффект этого состоит в том, что первый каталог уровня не располагается с отступом вообще, но вторые каталоги уровня располагаются с отступом 4 пробелов, третьи пробелы уровня 8, и т.д. С тех пор entry
теперь первый аргумент, $1
из walk
функция, это рекурсивно вызовет всюду по структуре.
Сценарий заканчивается путем выполнения walk
функция на позиционном параметре $1
, первый аргумент передал сценарию. Использование могло быть
./script directory
Это означает directory
$1
и walk
будет работаться directory
.
Было бы хорошо, если бы сценарий распечатал регулярные файлы, я думаю, но они выглядели бы сбивающими с толку без некоторого тщательно продуманного форматирования. Я рекомендую использовать tree
с этой целью вместо сценария!