Bash: преобразование массива в строковые белые пробелы

Думаю, именно поэтому apt-get теперь рекомендуется вместо aptitude для обновления системы. В этом случае aptitude не знает, как продолжить работу с уже устаревшим пакетом system-config-printer . Его больше нет, но от него все еще зависят другие вещи. В различных руководствах по установке предлагается удалить одни пакеты, принудительно установить другие и / или вызвать поломки, которые будут устранены вручную на следующих этапах.

(Лично я не сталкивался с таким беспорядком, поэтому не знаю, каким может быть ваш лучший путь вперед. Вместо этого можно использовать apt-get .)

0
07.12.2018, 16:56
2 ответа

Хотя я не вижу особой пользы в чтении строки как отдельных символов в массиве, просто для -повторного формирования строки установка IFSв один пробел приведет к вставке одного пробела между элементами массива при использовании "${arr[*]}". Вместо этого установите IFSна пустую строку :

.
readarray -t arr < <( grep -o. <<<"$1" )
( IFS=''; printf '%s\n' "${arr[*]}" )

Я использую подоболочку для назначения IFSи для printf, чтобы не изменять значение IFSдля остальной части скрипта.

1
28.01.2020, 02:31

Использование *в "${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'
1
28.01.2020, 02:31

Теги

Похожие вопросы