Короче говоря, вы создаете массив files
и расширяете его.
Вы читаете это так:
VAR = ...
означает, что вы назначаете переменную. VAR = (...)
означает, что вы назначаете массив bash переменной.
$ (...)
означает, что вы запускаете команду и получаете ее вывод, в вашем случае список файлов, которые соответствуют заданному шаблону, которые настолько стары, а затем назначают каждый файл элементу в bash множество.
$ {...}
означает, что вы читаете значение переменной, например:
$ SOMEVAR="a value"
$ echo "${SOMEVAR}"
a value
В bash $ VAR
и $ {VAR}
эквивалентны, но нотация $ {VAR}
позволяет вам делать некоторые дополнительные вещи. В частности, echo "$ {VAR} iable"
расширит переменную $ VAR
и объединит ее со строкой iable
, тогда как echo $ VARiable
] попытается расширить переменную $ VARiable
. Вы также можете выполнить некоторую расширенную замену , используя нотацию $ {...}
.
В нашем случае мы читаем файловую переменную с помощью $ {file ...}
. Затем [...]
указывает, что мы читаем массив bash . Итак, мы пытаемся получить доступ к элементу массива файлов, бит внутри [...]
сообщает нам, какие элементы, это может быть 1
для доступа к первому элементу, 2
для доступа ко второму и так далее (массивы bash индексируются с 1, а не с 0). @
означает все элементы, поэтому мы пытаемся получить доступ ко всем элементам массива bash под названием file
.
Вы можете попробовать это со следующим:
% ARRAY=("a value" "another value" "fred")
% for x in "${ARRAY[@]}"; do echo "$x"; done
a value
another value
fred
Преимущество использования массивов вместо строк, разделенных пробелами, заключается в том, что вы можете включать пробелы в значения, как указано выше. Таким образом, в вашем случае каждый файл в массиве files
будет рассматриваться как отдельный аргумент, а пробелы в именах файлов будут обрабатываться правильно.
По сути, ваш snipit находит и собирает список файлов и передает их как отдельные аргументы команде tar.