Использование переменной косвенности для прямой ссылки на массив также работает. Именованные ссылки также могут быть использованы, но они стали доступны только в 4.3.
Преимущество использования этой формы функции заключается в том, что разделитель может быть необязательным (по умолчанию используется первый символ по умолчанию IFS
, который является пробелом; возможно, при желании можно сделать его пустой строкой) избегает двойного расширения значений (сначала при передаче в качестве параметров, а затем как "$@"
внутри функции).
Это решение также не требует, чтобы пользователь вызывал функцию внутри подстановки команд, которая вызывает подоболочку, чтобы получить объединенную версию строки, назначенной другой переменной.
Что касается недостатков: вам нужно быть осторожным при передаче правильного имени параметра, а передача __r
даст вам __r[@]
. Поведение переменной косвенности для расширения других форм параметров также явно не задокументировано.
function join_by_ref {
__=
local __r=$1[@] __s=${2-' '}
printf -v __ "%s${__s//\%/%%}" "${!__r}"
__=${__%${__s}}
}
array=(1 2 3 4)
join_by_ref array
echo "$__" # Prints '1 2 3 4'.
join_by_ref array '%s'
echo "$__" # Prints '1%s2%s3%s4'.
join_by_ref 'invalid*' '%s' # Bash 4.4 shows "invalid*[@]: bad substitution".
echo "$__" # Prints nothing but newline.
Работает с 3,1 до 5,0-альфа. Как уже отмечалось, переменная косвенность работает не только с переменными, но и с другими параметрами.
Параметр - это объект, который хранит значения. Это может быть имя,
число или один из специальных символов, перечисленных ниже в разделе «Специальные»
Параметры. Переменная - это параметр, обозначаемый именем.
Массивы и элементы массива также являются параметрами (сущностями, которые хранят значения), и ссылки на массивы также технически являются ссылками на параметры. И так же, как специальный параметр @
, array[@]
также делает допустимую ссылку.
Измененные или выборочные формы расширения (например, расширение подстроки), которые отклоняются от самого параметра, больше не работают.