Всякий раз, когда вам нужно указать список путей или путей с именами файлов, или просто список, который вы собираетесь перебирать и/или использовать в качестве списка аргументов какой-либо команды, используйте массив.
Если вы используете не массив, а строку, вы не сможете обрабатывать вещи с пробелами в них (, потому что вы используете пробелы в качестве разделителя в строке ). Это также затрудняет перебор содержимого строки, так как вам придется вызывать разбиение на слова (, не заключая в кавычки раскрытие переменной ). Но это также приведет к подстановке имен файлов, если вы явно не отключите это с помощью set -f
.
В большинстве оболочек, даже в простом /bin/sh
, вместо этого используйте массив. В sh
используйте массив позиционных параметров ($@
).
Для bash
используйте массив строк в кавычках, например
excludes=( '/home/*/.cache/*'
'/var/cache/*'
'/var/tmp/*'
'/var/lib/lxcfs/cgroup/*' )
Затем,
rsync_opts=( --verbose --archive )
for excl in "${excludes[@]}"; do
rsync_opts+=( --exclude="$excl" )
done
Позже,
rsync "${rsync_opts[@]}" source/ target
Обратите внимание, что кавычки важны во всех приведенных выше раскрытиях переменных. Расширение "${array[@]}"
(, а также "$@"
ниже )приводит к списку отдельных элементов рассматриваемого массива (, но только в двойных кавычках! ).
Для любой /bin/sh
оболочки:
set -- '/home/*/.cache/*' \
'/var/cache/*' \
'/var/tmp/*' \
'/var/lib/lxcfs/cgroup/*'
for excl do
set -- "$@" --exclude="$excl"
shift
done
set -- --verbose --archive "$@"
rsync "$@" source/ target