Использовать замену строк для объединения массива?

Использовать замену строк для объединения массива?

Я пытаюсь использовать замену строк для объединения массива. Вывод:

a,b,c

Нижеприведенный вариант работает, но разве нет способа обойтись без труб?

#!/bin/bash

words=(a b c)

echo "${words[@]}" | sed 's/ /,/g'

Я пробовал это, но это не работает.

echo "${words[@]// /,/}"

решение1

Если вы хотите вывести строку, состоящую из элементов массива, разделенных определенным символом, то используйте

words=(a b c)

( IFS=,; printf '%s\n' "${words[*]}" )

Использование *in вместо @in "${words[*]}"создаст одну строку из конкатенации всех элементов массива words. Элементы будут разделены первым символом $IFS, поэтому мы устанавливаем его на запятую перед выполнением расширения.

Я установил IFSподоболочку, чтобы избежать непреднамеренной установки ее для какой-либо другой операции, кроме единственного расширения, необходимого для создания разделенной запятыми строки для вызова printf.

Вместо использования подоболочки для IFSлокальной установки вы можете установить ее, а затем сбросить:

words=(a b c)

IFS=,$IFS
printf '%s\n' "${words[*]}"
IFS=${IFS#?}

Сначала добавляется запятая в качестве первого символа $IFS, а старое значение переменной сохраняется в виде символов после запятой.

Подстановка параметра ${IFS#?}приведет к удалению первого символа (запятой, которую мы добавили).

Связанный контент