
Я пытаюсь использовать замену строк для объединения массива. Вывод:
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#?}
приведет к удалению первого символа (запятой, которую мы добавили).