Это пример того, как вы можете использовать рекурсию для настройки списка аргументов по одному аргументу за раз. Техника иногда полезна.
Использование подстановки процесса для превращения текста в конвейер, возможно, не является оптимальным решением для рассматриваемой проблемы, но оно имеет преимущество повторного использования существующих инструментов.
Я пытался сделать код достаточно общим, но, возможно, потребуется внести еще некоторые изменения.
Bash 4.3 необходим для nameref (хотя вы можете сделать это с фиксированным именем массива, если вы еще не достигли этой версии). Namerefs требуют осторожности, потому что они не гигиеничны; локальная переменная может быть захвачена по имени. Отсюда и использование имен переменных, начинающихся с подчеркивания.
# A wrapper which sets up for the recursive call
from_array() {
local -n _array=$1
local -a _cmd=("${@:2}")
local -i _count=${#_array[@]}
from_array_helper
}
# A recursive function to create the process substitutions.
# Each invocation adds one process substitution to the argument
# list, working from the end.
from_array_helper() {
if (($_count)); then
((--_count))
from_array_helper <(printf %s "${_array[_count]}") "$@"
else
"${_cmd[@]}" "$@"
fi
}
Пример
$ a=($'first\nsecond\n' $'x\ny\n' $'27\n35\n')
$ from_array a paste -d :
first:x:27
second:y:35