Думаю, именно поэтому apt-get
теперь рекомендуется вместо aptitude
для обновления системы. В этом случае aptitude
не знает, как продолжить работу с уже устаревшим пакетом system-config-printer
. Его больше нет, но от него все еще зависят другие вещи. В различных руководствах по установке предлагается удалить одни пакеты, принудительно установить другие и / или вызвать поломки, которые будут устранены вручную на следующих этапах.
(Лично я не сталкивался с таким беспорядком, поэтому не знаю, каким может быть ваш лучший путь вперед. Вместо этого можно использовать apt-get
.)
Хотя я не вижу особой пользы в чтении строки как отдельных символов в массиве, просто для -повторного формирования строки установка IFS
в один пробел приведет к вставке одного пробела между элементами массива при использовании "${arr[*]}"
. Вместо этого установите IFS
на пустую строку :
readarray -t arr < <( grep -o. <<<"$1" )
( IFS=''; printf '%s\n' "${arr[*]}" )
Я использую подоболочку для назначения IFS
и для printf
, чтобы не изменять значение IFS
для остальной части скрипта.
Использование *
в "${arr[*]}"
означает введение первого символа из IFS в качестве разделителя для каждого элемента массива. Вы можете попробовать изменить IFS:
readarray -t arr < <(grep -o. <<< "$input")
( IFS=''; echo "${arr[*]}" )
Или попробуйте сложную задержку оценки с помощью eval:
readarray -t arr < <(grep -o. <<< "$input")
IFS='' eval 'echo "array= ${arr[*]}"'
Но нет реальной необходимости запускать подоболочку (, чтобы избежать изменения IFS в существующей оболочке )или увеличения риска eval, когда вам нужен простой printf:
readarray -t arr < <(grep -o. <<< "$input")
printf '%s' "${arr[@]}" $'\n'
Обратите внимание, что использование grep удалит все внутренние символы новой строки из $input
.
Чтобы иметь возможность получать новые строки в элементах массива (для небольших входных данных):
[[ $input =~ ${input//?/(.)} ]] && arr=("${BASH_REMATCH[@]:1}")
printf '%s' array= "${arr[@]}" $'\n'