ПРИМЕЧАНИЕ: В этом ответе используется eval
, и его следует по возможности избегать. См. ответ Фредди , который использует declare -n
/ local -n
для создания именованной ссылки.
Этот подход может быть необходим, если вы используете старую версию bash.
Как уже указывалось, вы передаете буквенную строку arr
, и это не массив, следовательно, " плохая подстановка ".
Вы можете использовать eval
для построения строки, которая приведет к расширению до того, что вы ищете:
arr_to_file() {
local cmd
printf -v cmd 'local -a _content=( "${%q[@]}" )' "${1}"
eval "${cmd}"
printf '%s\n' "${_content[@]}" > "${2}"
}
mapfile -t arr < <(echo "one" ; echo "two" ; echo "three")
arr_to_file arr file
eval
обычно получает большое предупреждение, так что вот ваше: " eval очень опасен, если вы не доверяете строке, которую вы ему даете".
Если мы будем очень осторожны с eval
, то его можно использовать довольно безопасно. Здесь printf "%q" "${1}"
используется для указания первого аргумента, подходящего для ввода в оболочку (например: printf '%q' '}'
не будет выделяться из имени переменной). Спасибо Charles Duffy за исправленный и значительно более безопасный и более читаемый фрагмент.
Этот подход также будет работать для ассоциативных массивов (т.е. массивов, которые используют ключи вместо индексов), но вывод будет неупорядоченным.