Как сообщалось Lesmana, вы не можете экспортировать массивы. Поэтому вы должны их сериализовать, прежде чем проходить через среду. Эта сериализация полезно для других мест, где подходит только строка (su -c 'string', ssh host 'string'). Самый короткий способ сделать это - злоупотреблять «getopt»
# preserve_array(arguments). return in _RET a string that can be expanded
# later to recreate positional arguments. They can be restored with:
# eval set -- "$_RET"
preserve_array() {
_RET=$(getopt --shell sh --options "" -- -- "$@") && _RET=${_RET# --}
}
# restore_array(name, payload)
restore_array() {
local name="$1" payload="$2"
eval set -- "$payload"
eval "unset $name && $name=("\$@")"
}
Использовать его следующим образом:
foo=("1: &&& - *" "2: two" "3: %# abc" )
preserve_array "${foo[@]}"
foo_stuffed=${_RET}
restore_array newfoo "$foo_stuffed"
for elem in "${newfoo[@]}"; do echo "$elem"; done
## output:
# 1: &&& - *
# 2: two
# 3: %# abc
Это не относится к unset / разреженным массивам. Возможно, вы сможете уменьшить 2 'eval' вызовы в файле restore_array.