Проблема в том, что вы экранируете '
и тем самым добавляете его в имя файла вместо того, чтобы использовать его в кавычках:
files_to_zip+=(\'file 2\')
против
files_to_zip+=( 'file 2' )
Кроме того, обычно рекомендуется использовать @
вместо звездочки (*
) для ссылки на все элементы массива, поскольку звездочка не будет интерпретироваться при заключении в кавычки (-> http://tldp.org/LDP/abs/html/arrays.html, Пример 27-7).
Также я предполагаю, что вы намерены заключить в строку кавычки при печати элементов массива.Для этого вам нужно экранировать кавычки.
echo "tar czf output.tgz \"${files_to_zip[@]}\""
Ваш фиксированный скрипт будет выглядеть так:
#!/bin/bash
declare -a files_to_zip
files_to_zip+=( 'file' )
files_to_zip+=( 'file 2' )
files_to_zip+=( 'file 3' )
echo "tar czf output.tgz \"${files_to_zip[@]}\""
tar czf output.tgz "${files_to_zip[@]}" || echo "ERROR"